Bagaimana untuk memulakan dengan Java sisi pelayan

Java sisi pelayan (SSJ), kadang-kadang disebut servlet atau applet sisi pelayan, adalah hibrida yang kuat dari Common Gateway Interface (CGI) dan pengaturcaraan API pelayan peringkat rendah - seperti NSAPI dari Netscape dan ISAPI dari Microsoft.

Artikel ini memberikan pengenalan dan petunjuk langkah demi langkah untuk pelaksanaan Netscape Java sisi pelayan, yang Netscape memanggil applet sisi pelayan (SSA).

SSA boleh bertindak seperti skrip CGI. Ia menerima getdan postmeminta dan mengembalikan halaman Web (biasanya dalam bentuk HTML), tetapi SSJ dimuat secara dinamis ke pelayan seperti NSAPI / ISAPI. Ini menghilangkan kelewatan permulaan yang kami jangkakan dari CGI. Ini juga membolehkan SSJ mempertahankan beberapa keadaannya antara pelaksanaan, seperti menjaga sambungan terbuka ke pangkalan data.

SSA dijalankan di kotak pasir mereka sendiri , yang memberikan keamanan yang diharapkan dari Java. Sebagai contoh, applet yang tidak berfungsi tidak akan merosakkan keseluruhan pelayan seperti yang boleh berlaku dengan pengaturcaraan NSAPI / ISAPI. Keamanan tambahan ini juga membolehkan applet diunggah untuk pelaksanaan di pelayan - sama seperti applet Java sisi klien dimuat untuk pelaksanaan pada klien.

Mungkin aspek yang paling penting dari SSA adalah bahawa, ditulis di Java, mereka sememangnya bebas platform dan berorientasikan objek.

Sejarah

Semakin banyak pelayan menyokong Java di sisi pelayan, termasuk pelayan Netscape FastTrack 2.0 dan Enterprise 2.0, JavaSoft's Java Web Server (sebelumnya disebut Jeeves), World Wide Web Consortium's Jigsaw, WebLogic's T3Server, Oracle's Webserver, dan Peak Technologies 'ExpressO. Setiap pelayan ini menggunakan API Java sisi pelayan yang berbeza, yang memerlukan pembangun untuk menulis program yang berbeza untuk setiap pelayan yang akan mereka gunakan.

Perincian Netscape: Sediakan pelayan anda

Sebelum mengarang applet sisi pelayan pertama anda untuk pelayan Netscape, anda perlu menyediakan pelayan. Pelayan Enterprise dan FastTrack sama dalam sokongan SSA mereka.

Mulakan dengan menghidupkan jurubahasa Java pelayan. Ini dapat dilakukan dari Pengurus Pelayan di bawah "Program -> Java." Klik butang Ya untuk mengaktifkan jurubahasa Java. Pengurus Pelayan akan meminta Anda untuk "direktori applet Java," yang merupakan tempat untuk meletakkan fail sokongan SSA dan juga lokasi untuk semua fail kelas SSA. Ia menyediakan lokasi lalai. Pada mesin Unix, ini adalah / usr / ns-home / plugins / java / applet . Pada mesin Windows, C: \ Program Files \ Netscape \ Server \ plugins \ Java \ applets(Catatan: Di bidang entri ini Netscape cenderung mencampurkan dan mencocokkan garis miring belakang dan garis miring ke depan. Jangan risau, Netscape memperlakukan dua jenis garis miring dengan cara yang sama.) Ambil direktori applet lalai jika boleh. Sekiranya anda memutuskan untuk menyesuaikan daripada menggunakan lalai, pastikan anda memilih direktori di suatu tempat di bawah root pelayan anda dan anda menyalin semua fail dari lokasi lalai ke lokasi tersuai anda. Simpan dan terapkan perubahan anda, pastikan untuk menghentikan pelayan dan mulakannya semula sehingga perubahan itu berlaku.

Masa untuk bereksperimen!

Pada ketika ini anda seharusnya dapat bereksperimen dengan applet yang disediakan oleh Netscape. Arahkan penyemak imbas anda ke // servername / server-java / FormApplet? Abc = xyz & 123 = 789. Anda harus melihat data "get" dikendalikan dan dikembalikan dalam HTML oleh applet Form.

Sekiranya anda mendapat ralat pelayan, periksa log ralat pelayan anda ( / usr / ns-home / httpd-hostname / log / ralat atau C: \ Program Files \ Netscape \ Server \ httpd-hostname \ logs ). Sekiranya ia mengatakan bahawa ia tidak dapat memulakan pentafsir Java, kemungkinan penyebabnya ialah CLASSPATH anda membingungkan Netscape. Cuba mulakan pelayan dalam persekitaran tanpa CLASSPATH.

Applet lain yang boleh dicuba adalah di // servername / server-java / Connect; ia harus memuat dan memaparkan //www.meer.net/barn/index.html. Applet Connect membuat sambungan soket untuk mengambil halaman, yang mungkin menghasilkan ralat pelayan jika pelayan anda berada di belakang firewall. Untuk langkah seterusnya, anggap firewall menyekat soket. Kami akan mengedit kod applet Connect untuk mengakses halaman lain di pelayan Web yang berbeza.

Fail Connect.java tersedia di "direktori applet Java." (Ia juga dijumpai di bawah.) Pertama kali mengimport netscape.server.applet. *.

import netscape.server.applet. *; 

Pakej ini mengandungi kelas asas untuk mengembangkan applet sisi pelayan. Kelas yang paling penting dalam pakej ini adalah HttpApplet, superclass untuk semua applet sisi pelayan. Seperti yang anda lihat di Connect (di bawah), satu-satunya kaedah yang perlu dilaksanakan oleh applet sisi pelayan adalah runkaedahnya. Kaedah ini digunakan setiap kali applet menerima "hit". The runkaedah untuk Connect membuka soket kepada "tuan rumah" dan mencatat "permintaan" sebelum mengubah hala output kepada pelanggan. Kami ingin menukar pemboleh ubah "host" sehingga merujuk pada mesin yang dapat dilihat dari pelayan Web kami. Kami juga ingin mengubah pemboleh ubah "permintaan" sehingga merujuk halaman di "host" baru.

import netscape.server.applet. *; import java.io.PrintStream; import java.io.InputStream; import java.io.OutputStream; import java.io.DataInputStream; import java.net.Socket; class Connect memanjangkan HttpApplet {public void run () membuang Pengecualian {String host = "www.meer.net"; // ubah port int ini = 80; Permintaan rentetan = "GET /barn/index.html HTTP / 1.0 \ n"; // ini juga Socket s = Socket baru (host, port); OutputStream os = s.getOutputStream (); PrintStream op = PrintStream baru (os); op.println (permintaan); InputStream adalah = sam (); DataInputStream di = DataInputStream baru (adalah); Garisan tali; if (returnNormalResponse ("text / html")) {PrintStream out = getOutputStream (); out.println ("& lth1 & gtData pada" + host + "port" + port + ""); out.println ("permintaan:" + permintaan + "
   
"); while ((line = di.readLine ())! = null) out.println (line);}}}

Setelah anda membuat perubahan "host" dan "request", langkah seterusnya adalah menyusun semula Connect.

Di bawah Windows, gunakan penyusun javac standard anda dengan set classpath untuk memasukkan serv2_0.zip. javac -classpath ..\classes\serv2_0.zip Connect.java.

Di bawah Unix, Netscape menyediakan penyusun Java (javac) dalam direktori di atas direktori Java applet. Javac ini sebenarnya adalah skrip yang memanggil java sun.tools.javac.Mainuntuk melakukan penyusunan. Pada beberapa sistem, sun.tools.javac.Mainpenyusun menggunakan kaedah 1.1 JDK baru seperti java.lang.Character.isJavaLetterOrDigit(), yang boleh menyebabkan masalah bagi pembangun tanpa 1.1 JDK. Alternatif yang sangat baik adalah menggunakan penyusun javac standard yang selalu anda gunakan , javac -classpath ../classes/serv2_0.zip Connect.java. Sekiranya anda ingin menggunakan skrip javac yang disediakan, ganti " javac" dengan "" ../javac.

Anda mungkin melihat ralat semasa penyusunan ini yang mengatakan:

Connect.java :: Paket netscape.server.applet tidak dijumpai dalam import. import netscape.server.applet. *; ^ 1 ralat

Kesalahan ini tidak perlu dibimbangkan. Fail kelas dibuat dengan normal dan akan berjalan dengan baik. Anda boleh mengelakkan ralat ini sekiranya anda menghapuskan wildcard dalam penyata import anda.

Di bawah Unix, Netscape menyediakan makefile dalam direktori applet Java untuk menangani penyusunan applet. Malangnya, makefile menggunakan wildcard '%', yang merupakan sambungan mk / nmake dan tidak selalu tersedia. Kod masalah ditunjukkan di bawah.

% .class:% .java ../javac -classpath ../classes/serv2_0.zip $ *. java 

Alternatifnya adalah dengan menggunakan peraturan .suffixes. Edit baris pertama makefile menjadi:

.SUFFIX: .java .class dan gantikan garis sasaran% .class dengan .java.class: javac -classpath ../classes/serv2_0.zip $ < 

Anda mungkin menyedari saya membuangnya ../sehingga makefile akan menggunakan penyusun javac standard. Untuk menguji makefile baru ini, simpan semula fail Connect.java dan cuba "make".

Sekiranya anda memuat semula halaman // servername / server-java / Connect sekarang, anda masih akan melihat halaman "Barn". Ini kerana kelas Java dimuat ke pelayan pada waktu mula melalui fungsi init dalam fail obj.conf. Untuk memuatkan perubahan baru, anda mesti menghentikan pelayan dan kemudian memulakannya semula. Pada beberapa sistem, anda mesti menggunakan Pengurus Pelayan untuk menghentikan dan memulakan. Memulakan semula baris arahan kadang-kadang menghasilkan "Ralat Pelayan" untuk permintaan applet berikutnya. Setelah anda berhenti dan memulakan pelayan, cuba sambungkan applet sekali lagi. Netscape seharusnya memuatkan kod Connect baru untuk memaparkan halaman yang anda pilih.

Let's get serious about API

Congratulations! You`ve just compiled and tested your first server-side Java code. Now to give a few of the methods available to you.

With the following methods you can do the majority of your work:

PrintStream getOutputStream() throws IOException; 

returns a PrintStream, which you can use to print your response to the client. It replaces System.out.

Hashtable getFormData() throws IOException; 

returns a Hashtable storing the name-value pairs of the HTTP request. The value strings are decoded from their URI-encoded form. It throws an IOException if there is no form data.

String getFormField(String fieldName) throws IOException; 

You can use getFormField for retrieving just one field. It too throws an IOException if there is no form data.

boolean returnNormalResponse(String contentType) throws IOException; 

starts an HTTP response with the content type set as you specify with its parameter. It returns true if this was a "get" or "post" request and false if it was a "head" request.

public boolean returnErrorResponse(String contentType, int status, String reason) throws IOException public boolean returnErrorResponse(String contentType, int status) throws IOException 

starts an HTTP response to report an error. It takes a content type, a status (such as HttpApplet.BAD_REQUEST, which represents the standard error code 400), and an optional string giving the reason for the error.

There are dozens of other methods you can use in the development of your server-side applets. Netscape installs an API guide with its servers. You can find the guide at /usr/ns-home/bin/httpd/admin/html/manual/pg/javapi.htm under Unix or at C:\Program Files\Netscape\Server\bin\httpd\admin\html\manual\pg\javapi.htm under Windows.

Hello World!

Now let's use everything we've learned to write the (you guessed it!) Hello World server-side applet. The following applet says hello to World unless a target field is given -- in which case it says hello to the target instead.

import netscape.server.applet.HttpApplet; import java.io.IOException; import java.io.PrintStream; class Hello extends HttpApplet { /* By default, we say hello to "World" */ String helloTarget = "World"; /* run() is invoked to handle the request */ public void run() throws Exception { /* getOutputStream() allows us to talk to the client */ PrintStream out = getOutputStream(); /* Use getFormField() to find out if we are to say hello to * someone other than "World". */ String formTarget = null; try { formTarget = getFormField("target"); if (formTarget != null) { helloTarget = formTarget; } } catch (IOException e) { /* We'll ignore exceptions caused by a "missing query string" */ if (! e.getMessage().startsWith("missing query string")) { handleException(e, out); } } /* Say the hello */ if (returnNormalResponse("text/html")) { try { out.println("Hello, " + helloTarget + "!"); } catch (Exception e) { handleException(e, out); } } } private void handleException(Exception e, PrintStream out) { try { returnErrorResponse("text/html", SERVER_ERROR, "Exception thrown"); } catch (IOException ioe) {} // try to print original exception out.print("&lth1>"); out.print(e); out.print("\n"); out.print("&ltpre>"); e.printStackTrace(out); // alternative PrintStream must be specified out.print("
"); kembali;}}

Subclass applet sisi pelayan ini dari netscape.server.applet.HttpApplet dan menggantikan run()kaedah seperti semua applet sisi pelayan di bawah Netscape. Ia dengan cepat mendapat aliran outputnya dengan panggilan ke getOutputStream, yang akan digunakan untuk mencetak "Hello" (atau gunakan untuk mencetak alasan kegagalan). Ia memanggil getFormFielduntuk memeriksa apakah ada sasaran alternatif untuk digunakan, dan kemudian mengembalikan respons "teks / html" biasa, dan akhirnya melakukan kerja sebenar mencetak "Hello." Perhatikan bahawa ia memeriksa nilai pengembalian dari returnNormalResponse()panggilan dan tidak melakukan apa-apa jika kembali palsu. Sekiranya anda tidak melakukan ini, anda akan mengembalikan data walaupun untuk headpermintaan.