Cara memulai Java sisi server

Server-side Java (SSJ), kadang-kadang disebut servlet atau applet sisi server, adalah gabungan yang kuat dari Common Gateway Interface (CGI) dan pemrograman API server tingkat rendah - seperti NSAPI dari Netscape dan ISAPI dari Microsoft.

Artikel ini memberikan pengantar dan petunjuk langkah demi langkah untuk implementasi Netscape pada Java sisi server, yang oleh Netscape disebut sebagai applet sisi server (SSA).

SSA dapat bertindak seperti skrip CGI. Ia menerima getdan postmeminta dan mengembalikan halaman Web (biasanya dalam bentuk HTML), tetapi SSJ dimuat secara dinamis ke server seperti NSAPI / ISAPI. Ini menghilangkan penundaan start-up yang kami harapkan dari CGI. Ini juga memungkinkan SSJ untuk mempertahankan beberapa statusnya di antara eksekusi, seperti menjaga koneksi terbuka ke database.

SSA dijalankan di sandboxnya sendiri , yang memberikan keamanan yang diharapkan dari Java. Misalnya, applet yang mogok tidak akan merusak seluruh server seperti yang dapat terjadi dengan pemrograman NSAPI / ISAPI. Keamanan tambahan ini juga memungkinkan applet diunggah untuk dieksekusi di server - sama seperti applet Java sisi klien diunduh untuk dieksekusi di klien.

Mungkin aspek terpenting dari SSA adalah, ditulis di Java, mereka secara inheren tidak bergantung pada platform dan berorientasi objek.

Sejarah

Semakin banyak server yang mendukung Java sisi server, termasuk server Netscape FastTrack 2.0 dan Enterprise 2.0, Server Web Java JavaSoft (sebelumnya disebut Jeeves), Jigsaw Konsorsium World Wide Web, T3Server WebLogic, Server Web Oracle, dan ExpressO dari Peak Technologies. Masing-masing server ini menggunakan API Java sisi server yang berbeda, mengharuskan pengembang untuk menulis program yang berbeda untuk setiap server yang akan mereka gunakan.

Detil Netscape: Siapkan server Anda

Sebelum membuat applet sisi server pertama Anda untuk server Netscape, Anda perlu menyiapkan server. Server Enterprise dan FastTrack identik dalam dukungan SSA mereka.

Mulailah dengan mengaktifkan interpreter Java server. Ini dapat dilakukan dari Server Manager di bawah "Program -> Java." Klik tombol Ya untuk mengaktifkan juru bahasa Java. Manajer Server akan meminta Anda untuk "direktori applet Java", yang merupakan tempat untuk meletakkan file dukungan SSA serta lokasi untuk semua file kelas SSA. Ini memberikan lokasi default. Pada mesin Unix, ini adalah / usr / ns-home / plugins / java / applets . Pada mesin Windows, ini adalah C: \ Program Files \ Netscape \ Server \ plugins \ Java \ applet(Catatan: Dalam kolom entri ini, Netscape cenderung mencampur dan mencocokkan garis miring belakang dan garis miringnya. Jangan khawatir, Netscape memperlakukan kedua jenis garis miring dengan cara yang sama.) Gunakan direktori applet default jika memungkinkan. Jika Anda memutuskan untuk menyesuaikan daripada menggunakan default, pastikan Anda memilih direktori di suatu tempat di bawah root server Anda dan Anda menyalin semua file dari lokasi default ke lokasi kustom Anda. Simpan dan terapkan perubahan Anda, pastikan untuk menghentikan server dan memulainya lagi agar perubahan diterapkan.

Waktunya bereksperimen!

Pada titik ini Anda harus bisa bereksperimen dengan applet yang disediakan oleh Netscape. Arahkan browser Anda ke // namaserver / server-java / FormApplet? Abc = xyz & 123 = 789. Anda akan melihat data "get" ditangani dan dikembalikan dalam HTML oleh applet Formulir.

Jika Anda mendapatkan kesalahan server, periksa log kesalahan server Anda ( / usr / ns-home / httpd-hostname / logs / error atau C: \ Program Files \ Netscape \ Server \ httpd-hostname \ logs \ error ). Jika dikatakan tidak dapat memulai penerjemah Java, kemungkinan penyebabnya adalah CLASSPATH Anda membingungkan Netscape. Coba mulai server di lingkungan tanpa CLASSPATH.

Applet lain untuk dicoba adalah di // servername / server-java / Connect; itu harus memuat dan menampilkan //www.meer.net/barn/index.html. Applet Connect membuat koneksi soket untuk mengambil halaman, yang dapat menghasilkan kesalahan server jika server Anda berada di belakang firewall. Untuk langkah selanjutnya, mari kita asumsikan bahwa firewall memblokir soket. Kami akan mengedit kode applet Connect untuk mengakses halaman yang berbeda di server Web yang berbeda.

File Connect.java tersedia di "direktori applet Java". (Ini juga ditemukan di bawah.) Pertama-tama impor netscape.server.applet. *.

import netscape.server.applet. *; 

Paket ini berisi kelas dasar untuk mengembangkan applet sisi server. Kelas terpenting dalam paket ini adalah HttpApplet, superclass untuk semua applet sisi server. Seperti yang Anda lihat di Connect (di bawah), satu-satunya metode yang perlu diterapkan oleh applet sisi server adalah runmetode. Metode ini dipanggil setiap kali applet menerima "hit". The runmetode untuk Connect membuka socket untuk "host" dan menjemput "permintaan" sebelum mengarahkan output ke klien. Kami ingin mengubah variabel "host" sehingga mereferensikan mesin yang terlihat dari server Web kami. Kami juga ingin mengubah variabel "request" sehingga mereferensikan halaman di "host" baru.

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

Setelah Anda membuat "host" dan "request" berubah, langkah selanjutnya adalah mengkompilasi ulang Connect.

Pada Windows, gunakan kompiler javac standar Anda dengan classpath yang disetel untuk menyertakan serv2_0.zip. javac -classpath ..\classes\serv2_0.zip Connect.java.

Di bawah Unix, Netscape menyediakan kompiler Java (javac) di direktori di atas direktori applet Java. Javac ini sebenarnya adalah skrip yang memanggil java sun.tools.javac.Mainuntuk melakukan kompilasi. Pada beberapa sistem, sun.tools.javac.Mainkompilator menggunakan metode 1.1 JDK baru seperti java.lang.Character.isJavaLetterOrDigit(), yang dapat menyebabkan masalah bagi pengembang tanpa JDK 1.1. Alternatif yang bagus adalah dengan menggunakan kompiler javac standar yang selalu Anda gunakan javac -classpath ../classes/serv2_0.zip Connect.java,. Jika Anda ingin menggunakan skrip javac yang disediakan, cukup ganti " javac" dengan " ../javac."

Anda mungkin melihat kesalahan selama kompilasi ini yang mengatakan:

Connect.java:1: Paket netscape.server.applet tidak ditemukan dalam impor. import netscape.server.applet. *; ^ 1 kesalahan

Kesalahan ini tidak perlu dikhawatirkan. File kelas dibuat secara normal dan akan berjalan dengan baik. Anda dapat menghindari kesalahan ini jika Anda menghilangkan karakter pengganti dalam pernyataan impor Anda.

Di bawah Unix, Netscape menyediakan makefile di direktori applet Java untuk menangani kompilasi applet. Sayangnya, makefile menggunakan '%' wildcard, yang merupakan ekstensi mk / nmake dan tidak selalu tersedia. Kode masalah ditunjukkan di bawah ini.

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

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

.SUFFIXES: .java .class dan ganti% .class target lines dengan .java.class: javac -classpath ../classes/serv2_0.zip $ < 

Anda mungkin memperhatikan saya menghapus ../sehingga makefile akan memanggil compiler javac standar. Untuk menguji makefile baru ini, simpan kembali file Connect.java dan coba "make."

Jika Anda memuat ulang halaman // namaserver / server-java / Connect sekarang, Anda masih akan melihat halaman "Gudang". Ini karena kelas Java dimuat ke server pada waktu mulai melalui fungsi init di file obj.conf. Untuk memuat perubahan baru, Anda harus menghentikan server dan memulainya lagi. Pada beberapa sistem, Anda harus menggunakan Server Manager untuk melakukan stop dan start. Memulai ulang baris perintah terkadang menghasilkan "Kesalahan Server" untuk permintaan applet berikutnya. Setelah Anda berhenti dan memulai server, coba applet Connect lagi. Netscape seharusnya memuat kode Connect baru untuk menampilkan 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;}}

Applet sisi server ini subclass dari netscape.server.applet.HttpApplet dan menimpa run()metode seperti semua applet sisi server di bawah Netscape. Ini dengan cepat mendapatkan aliran keluarannya dengan panggilan ke getOutputStream, yang akan digunakan untuk mencetak "Halo" (atau digunakan untuk mencetak alasan kegagalan). Ini memanggil getFormFielduntuk memeriksa apakah ada target alternatif untuk digunakan, dan kemudian mengembalikan respons "teks / html" normal, dan akhirnya melakukan pekerjaan pencetakan "Halo" yang sebenarnya. Perhatikan bahwa ia memeriksa nilai kembali dari returnNormalResponse()panggilan dan tidak melakukan apa-apa jika ia mengembalikan false. Jika Anda tidak melakukan ini, Anda akan mengembalikan data bahkan untuk headpermintaan.