You are on page 1of 60

Bab 3 JSP Java Server Pages (JSP) dan Servlets adalah teknologi yang saling melengkapi untuk memproduksi

halaman Web dinamis melalui Java. Sementara Servlets merupakan dasar untuk server sisi Java, mereka tidak selalu solusi yang paling efisien sehubungan dengan waktu pengembangan. Coding, menyebarkan, dan debugging Servlet bisa menjadi tugas membosankan. Memperbaiki tata bahasa atau menandai kesalahan sederhana memerlukan print () dan println () panggilan, mengkompilasi ulang Servlet, dan reload Web yang Aplikasi. Membuat tata bahasa atau menandai kesalahan tidak sulit, dan masalah diperburuk di Servlets kompleks. JSP melengkapi Servlets dengan membantu memecahkan masalah ini dan menyederhanakan pengembangan Servlet. Bab ini membahas topik-topik berikut: -Penjelasan JSP dan mengapa Anda ingin menggunakan teknologi. -Kehidupan JSP siklus-yaitu, bagaimana wadah mengelola JSP. -Pemeriksaan persamaan dan perbedaan antara JSP dan Servlets. -Pengenalan ke JSP sintaks dan semantik. -Konfigurasi JSP melalui Web Application Deployment Descriptor,web.xml. -Penjelasan tentang objek implisit JSP dan mengapa objek implisitsangat membantu. -Cara menggunakan alternatif sintaks XML JSP. Seperti Bab 2, membaca bab ini langsung melalui. Bab 2 dan 3 menjelaskan fungsi dasar yang semua bab lain tergantung. Bab 2 memperkenalkan Servlets dan menunjukkan beberapa manfaat praktis dari mereka. Bab ini melengkapi Bab 2 dengan memberikan diskusi serupa di JSP.

109

JSP 2.0 Spesifikasi Pertama JSP spesifikasi dirilis pada tahun 1999. Awalnya JSP adalah model setelah teknologi template yang lain server-side untuk memberikan yang sederhana metode memasuukan kode dinamis dengan menandai statis. Ketika permintaan adalah dibuat untuk isi JSP, wadah menafsirkan JSP, mengeksekusi setiap kode tertanam, dan mengirimkan hasilnya dalam tanggapan. Pada saat ini jenis fungsi adalah tidak ada yang sangat baru, tapi itu dan masih adalah membantu peningkatan pada Servlets. JSP telah direvisi beberapa kali sejak rilis asli, masing-masing menambahkan fungsionalitas, dan saat ini dalam versi 2.0. Spesifikasi JSP dikembangkan di samping spesifikasi Servlet dan dapat ditemukan di Sun Microsystems ' Halaman informasi produk Pages JavaServer, http://java.sun.com/products/ jsp. Fungsi didefinisikan oleh JSP 2,0 spesifikasi dapat dipecah sebagai berikut: JSP Spesifikasi JSP mendefinisikan sintaks dasar dan semantik Page JavaServer. Sebuah JavaServer Halaman dasar terdiri dari teks biasa dan menandai dan secara opsional dapat mengambil keuntungan dari skrip tertanam dan fungsi lainnya untuk menciptakan dinamis konten. JavaBeans JavaBeans tidak didefinisikan oleh spesifikasi JSP, JSP tetapi tidak memberikan dukungan untuk dengan mudah menggunakan dan memanipulasi mereka. Seringkali benda-benda yang digunakan pada server-side Aplikasi Web dalam bentuk apa yang sering disebut JavaBean. Kustom Tag dan Fragmen JSP JSP menyediakan mekanisme untuk menghubungkan apa yang biasanya akan statis untuk kode Java kustom. Mekanisme ini bisa dibilang salah satu poin yang kuat dari JSP dan dapat digunakan di tempat atau untuk melengkapi skrip tertanam kode Java. Ekspresi Bahasa JSP termasuk mekanisme untuk mendefinisikan atribut dinamis untuk tag kustom. Apa saja bahasa scripting dapat digunakan untuk tujuan ini, biasanya Java diimplementasikan, namun spesifikasi JSP mendefinisikan bahasa ekspresi yang dirancang khusus

110

untuk tugas tersebut. Seringkali JSP EL adalah lebih sederhana dan lebih fleksibel solusi, espeterutama ketika dikombinasikan dengan JSP pola desain yang tidak menggunakan skrip tertanam. Membahas dasar-dasar JSP adalah fokus dari bab ini. JavaBeans, Custom Tag, dan JSP Expression Language semua sepenuhnya dibahas dalam bab-bab selanjutnya setelah dasar yang tepat JSP didirikan.

JSP Life Cycle


Sama seperti Servlets, JSP pemahaman memerlukan pemahaman hidup sederhana siklus yang JSP berikut. JSP mengikuti siklus tiga fase kehidupan: inisialisasi, layanan, dan kehancuran, seperti yang ditunjukkan pada Gambar 3-1. Ini siklus hidup harus tampak akrab dan adalah identik dengan yang dijelaskan untuk Servlets dalam Bab 2. Sementara JSP tidak mengikuti siklus hidup Servlet, metode telah berbeda nama. Inisialisasi sesuai dengan jspInit () metode, layanan sesuai dengan metode _jspService (), dan penghancuran sesuai dengan jspDestroy () Metode. Tiga fase semua digunakan sama seperti Servlet dan memungkinkan JSP untuk memuat sumber daya, memberikan pelayanan kepada beberapa permintaan klien, dan menghancurkan dimuat sumber daya ketika JSP diambil keluar dari layanan. JSP dirancang khusus untuk menyederhanakan tugas membuat teks memproduksi Benda HttpServlet dan melakukannya dengan menghilangkan semua bagian berlebihan coding Servlet. Berbeda dengan Servlets tidak ada perbedaan antara normal dan JSP satu dimaksudkan untuk digunakan dengan HTTP. Semua JSP dirancang untuk digunakan dengan HTTP dan menghasilkan konten dinamis untuk World Wide Web.

111

Satu JSP Metode _jspService () juga bertanggung javab untuk menghasilkan tanggapan terhadap semua tujuh metode HTTP. Untuk tujuan paling praktis pengembang JSP tidak JavaServer HalamanjspInit ()(Load Sumber) PermintaanTanggapan_jspService ()(Terima Permintaan)jspDestroy ()(Membongkar Sumber)

perlu tahu apa-apa tentang HTTP, atau sesuatu yang lebih dari Java dasar kode JSP dinamis.

Perbedaan Antara Servlets dan JSP


Perbedaan yang jelas dan penting untuk membuat tentang JSP adalah bahwa coding satu ada seperti coding Servlet. Dari apa bab ini telah dijelaskan, mungkin tampak bahwa JSP hanya versi sederhana Servlets. Dalam banyak hal JSP sebenarnya sederhana Metode untuk menciptakan Servlet teks-memproduksi, namun jangan tertipu berpikir pola pikir ini selalu benar. Saat pasal ini berlanjut, maka akan jelas bahwa JSP dan Servlets adalah dua teknologi yang sangat berbeda. Kemudian, setelah tag kustom diperkenalkan, tingkat pemisahan antara dua akan tampak lebih besar. Itu penggunaan JSP untuk dengan mudah membuat Servlet benar-benar hanya berlaku dalam kasus sederhana.

112

Untuk menunjukkan bagaimana sangat berbeda kode untuk JSP dapat dari Servlet, Daftar 3-1 menampilkan kode untuk setara JSP Servlet HelloWorld (Listing 2 -1 yang muncul di Bab 2). Listing 3-1 HelloWorld.jsp <html> <head> <title> Hello World! </ title> </ Head> <body> <h1> Hello World! </ h1> </ Body> </ Html>

Mereka sangat berbeda! Anda akan ingat kode untuk HelloWorld.java dan perhatikan dua terlihat apa-apa sama. Kode untuk JSP sebenarnya identik dengan teks yang dihasilkan oleh Servlet HelloWorld, bukan kode sumber. Authoring an HTML-menghasilkan JSP semudah hanya authoring HTML. Dibandingkan dengan menggunakanprint () dan println () metode dalam Servlets, pendekatan JSP jelas lebih mudah. Hal ini mengapa JSP sederhana biasanya dianggap sebagai metode cepat membuat teksmemproduksi Servlets. Menyebarkan JSP juga sederhana, sebuah Aplikasi Web secara otomatis menyebarkan setiap JSP untuk perpanjangan URL yang cocok dengan nama JSP. Menguji HelloWorld.jsp dengan menyimpannya di direktori dasar jspbook Aplikasi Web kemudian browsing ke http://127.0.0.1/jspbook/HelloWorld.jsp. Gambar 3-2 menunjukkan output dari HelloWorld.jsp sebagai diberikan oleh browser Web, identik dengan HTML yang dihasilkan oleh Servlet helloworld, Gambar 2-6.

113

Dari melihat hasil contoh, tentu tidak muncul Hello World.jsp adalah bentuk sederhana dari HelloWorld.java. Apa yang tidak ditampilkan, namun sangat penting untuk memahami, adalah HelloWorld.jsp yang juga sebenarnya dikompilasi menjadi setara kode Servlet. Hal ini dilakukan dalam apa yang disebut fase terjemahan JSP penyebaran dan dilakukan secara otomatis oleh wadah. JSP terjemahan keduanya dan bukanlah sesuatu yang sangat penting bagi pengembang JSP harus diperhatikan. JSP terjemahan ke kode sumber Servlet penting karena menjelaskan persis bagaimana JSP menjadi kode Java. Sementara itu bervariasi sedikit dari wadah ke wadah, semua kontainer harus menerapkan JSP peristiwa siklus hidup yang sama. Memahami metode siklus hidup membantu pengembang JSP menjaga kode efisien dan benang-aman. Namun, terjemahan JSP tidak sangat penting karena selalu dilakukan secara otomatis oleh wadah. Memahami apa wadah yang akan dilakukan selama fase terjemahan cukup baik untuk kode JSP. Melacak dihasilkan Kode sumber Servlet bukanlah tugas pengembang JSP pernah harus dilakukan. JSP diterjemahkan ke kode Servlet dapat ditemukan dengan melihat di tempat yang tepat untuk wadah tertentu. Tomcat menyimpan kode ini di direktori / pekerjaan Tomcat instalasi. Kode yang dihasilkan tidak pernah cukup, juga tidak selalu memiliki nama yang sama. Listing 3-2 diambil dari HelloWorld $ jsp.java dalam / pekerjaan / localhost / direktori jspbook. Ini adalah kode Servlet dihasilkan untuk HelloWorld. jsp bahwa Tomcat otomatis disusun dan disebarkan. Listing 3-2 Tomcat-Generated Servlet Kode untuk HelloWorld.jsp paket org.apache.jsp; impor javax.servlet *.; impor javax.servlet.http *.;

114

impor javax.servlet.jsp *.; impor org.apache.jasper.runtime *.; public class HelloWorld $ jsp meluas HttpJspBase { statis { } public HelloWorld $ jsp () { } boolean private static _jspx_inited = false; public _jspx_init kekosongan akhir () throws org.apache.jasper.runtime.JspException { } public void _jspService (HttpServletRequest request, Respon HttpServletResponse) melempar java.io.IOException, ServletException { JspFactory _jspxFactory = null; PageContext pageContext = null; Sesi HttpSession = null; ServletContext aplikasi = null; ServletConfig config = null; JspWriter out = null; Halaman Obyek = ini; String _value = null; try { if (_jspx_inited == false) { disinkronkan (ini) { if (_jspx_inited == false) { _jspx_init (); _jspx_inited = true; } } } _jspxFactory = JspFactory.getDefaultFactory ();

115

response.setContentType ("text / html; charset = ISO8859-1 "); pageContext = _jspxFactory.getPageContext (ini, permintaan, respon, "", Benar, 8192, true); aplikasi = pageContext.getServletContext (); config = pageContext.getServletConfig (); sesi = pageContext.getSession (); out = pageContext.getOut (); / / HTML / / mulai [File = "/ HelloWorld.jsp", dari = (0,0), untuk = (8,0)] out.write ("<html> \ r \ n <head> \ r \ n <title> Hello Dunia! </ Title> \ r \ n </ head> \ r \ n <body> \ r \ n <h1> Hello Dunia </ h1> \ r \ n </ body> \ r \ n </ html> \ r \ n "); / / Akhir } Catch (Throwable t) { if (keluar! = null && out.getBufferSize ()! = 0) out.clearBuffer (); if (pageContext! = null) pageContext.handlePageException (t); } Akhirnya { if (_jspxFactory! = null) _jspxFactory.releasePageContext (pageContext); } } } Jangan repot-repot mencoba untuk membaca dan memahami kode yang dihasilkan. Hal yang penting untuk dipahami adalah bahwa wadah menangani JSP sebagai Servlet tapi tidak begitu di belakang layar. Ikatan ini langsung kembali ke yang lebih besar saat itu JSP benar-benar hanya Servlets. Perbedaan antara kedua teknologi ini tidak di siklus hidup atau bagaimana wadah mengelola mereka pada saat runtime. Perbedaan antara Servlets dan JSP adalah sintaks yang mereka tawarkan untuk menciptakan fungsi yang sama. Dengan JSP hampir selalu sederhana untuk membuat teks-memproduksi Servlets, tapi normal Servlets masih paling cocok untuk mengirimkan byte mentah ke klien atau setelah selesai Kontrol diperlukan source code Java.

116

JSP Sintaks dan Semantik


JSP tidak diatur oleh sintaks dan semantik didefinisikan oleh Java 2 spesifikasitions. Diterjemahkan kode sumber JSP hanya Java, tapi ketika Anda penulis JSP, kamu tinggal bukan oleh aturan yang tercantum dalam spesifikasi JSP. Dengan setiap rilis dari JSP spesifikasi, aturan ini tumbuh, dan mereka tidak dapat dengan mudah disimpulkan oleh beberapa sentences. Mayoritas bab ini berfokus pada menjelaskan sintaks saat ini dan semantik JSP. Banyak fungsi yang ditemukan di JSP diambil langsung dari mendasari Servlet API yang sudah dibahas dalam Bab 2. Mengharapkan untuk melihat banyak contoh kode yang menunjukkan sintaks, sedangkan semantik berulang-ulang hanya skim dengan mengacu pada penjelasan lengkap sebelumnya diberikan dalam Bab 2. Unsur dan Data Template Segala sesuatu di JSP dipecah menjadi dua kategori generik disebut elemen dan Data template. Elemen adalah bagian dinamis dari JSP. Data Template adalah bit statis teks antara. Data template mudah dikategorikan karena mereka semua teks sewenang-wenang ditempatkan pada JSP dan dimaksudkan untuk langsung dikirim ke klien. Elemen mudah dikategorikan sebagai tindakan kustom, tag, dan konten yang diizinkan berada di antara seperti yang didefinisikan oleh spesifikasi JSP. Konsep elemen dan data template penting untuk memahami karena menentukan kapan, di mana, dan apa teks akan lakukan ketika ditempatkan dalam JSP. Bab ini memiliki belum memperkenalkan elemen apapun, tapi ia telah menunjukkan penggunaan teks Template. Itu HelloWorld.jsp contoh sepenuhnya teks Template. Yang sesuai Servlet dihasilkan dari HelloWorld.jsp diperlakukan teks ini sebagai konten statis dan dikirim sebagai isi tanggapan. Sementara HelloWorld.jsp hanya memiliki satu potongan besar dari temteks piring, lebih kompleks JSP mengikuti aturan yang sama. Setiap potongan teks template diambil dan dikirim langsung ke klien seperti yang muncul pada JSP. Elemen di sisi lain tangan tidak dikirim langsung ke klien. Sebuah elemen ditafsirkan oleh wadah JSP dan mendefinisikan tindakan khusus yang harus diambil ketika menghasilkan tanggapan. Template teks tidak berubah, dan bagian kecil ini mendefinisikan secara total. Elemen adalah apa yang membuat JSP dinamis, dan elemen dijelaskan lebih lanjut sepanjang sisa bab ini. Elemen dapat dipecah menjadi tiga difkategori beda: elemen scripting, arahan, dan tindakan. Berikut selfbagian bernama menjelaskan unsur-unsur. Dua Jenis Sintaks Kontainer JSP yang diperlukan untuk mendukung dua format yang berbeda dari sintaks JSP: normal dan XML-kompatibel. Sintaks JSP normal adalah sintaks dirancang untuk menjadi

117

mudah untuk penulis. Sintaks JSP XML-kompatibel mengambil sintaks dan JSP yang normal memodifikasi itu menjadi XML-compliant1. Kedua sintaks menyediakan fungsi yang sama, tetapi sintaks XML-kompatibel dimaksudkan untuk lebih mudah digunakan oleh develalat ngunan. Dalam contoh buku ini sintaks JSP normal disukai sebagai itu mudah dibaca, dimengerti, dan akan akrab jika Anda telah menggunakan versi lama JSP. Hanya karena sintaks XML tidak akan muncul banyak dalam buku ini contoh tidak berarti itu adalah kurang dari dua syntaxes. Sintaks XML JSP diperkenalkan di JSP 1,2 spesifikasi, dari perspektif pengembang, adalah certainly kerumitan untuk digunakan dibandingkan dengan sintaks biasa. Hal ini sebagian besar disebabkan oleh kompleksitas dan penegakan hukum secara tegas sintaks 1,2 sintaks XML JSP memiliki. JSP 2.0 solusi masalah dengan memberikan sintaks XML jauh lebih fleksibel. Kemudian dalam bab yang baru, sintaks ini XML lebih fleksibel dijelaskan lebih lanjut. Scripting Elements Metode paling sederhana untuk membuat JSP dinamis dengan langsung embedding bit Kode Java antara blok teks template dengan menggunakan elemen scripting. Secara teori JSP tidak membatasi elemen scripting hanya yang mengandung kode Java, tetapi spesifikasi hanya berbicara tentang Java sebagai bahasa scripting, dan setiap kontainer secara default harus mendukung Java. Contoh dalam buku ini menggunakan Java sebagai scripting langauge. Ada tiga jenis unsur scripting tersedia untuk digunakan dalam JSP: scriptlets, ekspresi, dan deklarasi. Scriptlets Scriptlets menyediakan metode untuk langsung memasukkan potongan kode Java antara potongan teks template. Scriptlet A didefinisikan dengan start, <%, mengakhiri,%>, dengan kode antara. Menggunakan Java, script identik dengan kode Java normal tetapi tanpa membutuhkan deklarasi kelas atau metode apapun. Scriptlets yang besar untuk menyediakan lowfungsionalitas tingkat seperti iterasi, loop, dan pernyataan bersyarat, tetapi mereka juga menyediakan sebuah metode untuk embedding potongan kode yang kompleks dalam JSP. Untuk banyak alasan scriptlets kompleks harus dihindari. Hal ini terutama disebabkan fakta bahwa semakin banyak scriptlets yang digunakan semakin sulit untuk memahami dan mempertahankan JSP. Dalam bab ini sebagian besar contoh scriptlet yang sengaja disimpan sederhana. Ini membantu dalam langsung menunjukkan fungsionalitas inti JSP, tetapi juga dilakukan agar contoh tidak muncul untuk mendorong penggunaan berat scriptlets. Sebagai 1. eXtensible Menandai Language, http://www.w3.org/XML

117

pengantar, Listing 3-3 menyediakan JSP sederhana yang loop untuk menghasilkan beberapa baris teks. Looping dicapai sama seperti di Java, tetapi dengan menempatkan setara kode Java di dalam elemen scriptlet. Listing 3-3 Loop.jsp <html> <head> <title> loop Contoh </ title> </ Head> <body> <% For (int i = 0; i <5; i + +) {%> Diulang 5 Times. <br> <%}%> </ Body> </ Html> Simpan Loop.jsp di direktori dasar jspbook Aplikasi Web dan browse ke http://127.0.0.1/jspbook/Loop.jsp. Halaman muncul dengan Pernyataan, "Berulang 5 Times.", diulang lima kali. Gambar 3-3 menunjukkan apa render browser output seperti. Penting untuk dicatat bahwa isi scriptlet tidak bisa dikirim ke client. Hanya hasil scriptlet melakukan. Hal ini penting karena menunjukkan bahwa scriptlets diinterpretasikan oleh wadah dan kode yang dalam scriptlet adalah tidak oleh standar berbagi dengan pengunjung dari JSP. Sebuah JSP dapat berisi sebanyak scriptlets yang diperlukan, tetapi harus hati-hati diambil tidak scriptlets berlebihan. Scriptlets membuat JSP sangat sulit untuk mempertahankan dan tidak mudah didokumentasikan, misalnya, alat-alat seperti javadoc tidak bekerja dengan JSP.

118

Ekspresi Ekspresi memberikan metode mudah mengirimkan string dinamis untuk klien. Sebuah ekspresi harus memiliki awal, <% =, end,%>, dan ekspresi antara. Sebuah Unsur ekspresi berbeda dalam sintaks dari scriptlet dengan tanda sama yang harus muncul segera setelah awal. Ekspresi selalu mengirim string teks ke klien, tetapi obyek diproduksi sebagai hasil dari sebuah ekspresi tidak harus selalu berakhir sebagai sebuah instance dari sebuah objek String. Setiap objek tersisa sebagai hasil dari Ekspresi otomatis memiliki toString () metode yang disebut untuk menentukan nilai ekspresi. Jika hasil dari ekspresi adalah primitif, formalNilai itive yang direpresentasikan sebagai string digunakan. Dikombinasikan dengan scriptlets, ekspresi berguna untuk berbagai tujuan. Sebuah contoh yang baik adalah menggunakan scriptlet yang dikombinasikan dengan ekspresi memberikan metode iterasi koleksi nilai. Scriptlet ini menyediakan lingkaran, sementara ekspresi dan konten statis digunakan untuk mengirim informasi dalam respon. Iteration.jsp (Listing 3-4) memberikan contoh dari ini bersama dengan demonstrasi melewati objek non-String sebagai hasil dari sebuah ekspresi. Listing 3-4 Iteration.jsp <html> <head> <title> Iterasi Contoh </ title> </ Head> <body> <% String [] = string baru String [4]; string [0] = "Alpha"; string [1] = "dalam"; string [2] = "antara"; string [3] = "Omega"; for (int i = 0; i <strings.length;i++) {%> String [<% = i%>] = <% = string [i]%> <br> <%}%> </ Body> </ Html> Simpan Iteration.jsp di direktori dasar Aplikasi Web jspbook dan browse ke http://127.0.0.1/jspbook/Iteration.jsp. Halaman ini menampilkan daftar iterasi melalui semua nilai dari array. Gambar 3-4 menunjukkan sebuah render browser output dikirim oleh Iteration.jsp.

119

Iteration.jsp Deklarasi Deklarasi adalah ketiga dan terakhir scripting elemen yang tersedia untuk digunakan dalam JSP. A deklarasi digunakan seperti scriptlet untuk menanamkan kode dalam JSP, tetapi kode tertanam oleh deklarasi muncul di luar metode _jspService (). Untuk kode alasan tertanam dalam suatu pernyataan yang dapat digunakan untuk menyatakan metode baru dan kelas dunia variabel, tapi hati-hati harus diambil karena kode dalam sebuah deklarasi bukan benang-aman, kecuali dibuat begitu oleh penulis kode tersebut. Listing 3-5 adalah JSP didesain untuk menjaga counter halaman berapa kali memiliki telah dikunjungi. JSP menyelesaikan ini dengan mendeklarasikan variabel kelas-luas dalam deklarasi, menggunakan scriptlet untuk kenaikan variabel pada kunjungan halaman, dan ekspresi untuk menunjukkan nilai variabel.

120

Listing 3-5 PageCounter.jsp <%! int PageCount = 0; batal addCount () { PageCount + +; } %> <html> <head> <title> PageCounter.jsp </ title> </ Head> <body> <% AddCount ();%> Halaman ini telah dikunjungi <% = PageCount%> kali. </ Body> </ Html>

Simpan PageCounter.jsp di direktori dasar Aplikasi Web jspbook dan browse ke http://127.0.0.1/jspbook/PageCounter.jsp. Refresh browser beberapa kali untuk menonton count JSP berapa kali telah dikunjungi. Gambar 3-5 menunjukkan browser rendering output setelah mengunjungi JSP 6 kali. Menggunakan scriptlets, ekspresi, dan deklarasi apa yang paling dapat dibuat menggunakan JSP. Sebuah analogi Servlets akan: scriplets yang kode ditempatkan di dalam metode layanan, ekspresi cetak () pemanggilan metode, dan deklarasi adalah kode ditempatkan secara global untuk kelas untuk digunakan. Setelah penjelasan singkat di atas itu harus cukup mudah untuk memulai coding menggunakan sciptlets, ekspresi, dan Deklarasitions, tetapi masih membantu untuk memahami apa tiga scripting yang berbeda eleKASIH menerjemahkan ke dalam kode Java. Listing 3-6 adalah Tomcat kode yang dihasilkan dari PageCounter.jsp. Ini berisi terjemahan dari ketiga elemen scripting. Garis-garis penting adalah disorot dengan tanda bintang.

126

Listing 3-6 PageCounter $ jsp.java paket org.apache.jsp; mengimpor mengimpor mengimpor mengimpor javax.servlet *.; javax.servlet.http *.; javax.servlet.jsp *.; org.apache.jasper.runtime *.; public class PageCounter $ jsp meluas HttpJspBase { / / Mulai [file = "/ PageCounter.jsp", dari = (0,3), untuk = (4,0)]

127

int PageCount = 0; batal addCount () { PageCount + +; } / / Akhir statis { } publik PageCounter $ jsp () { } boolean private static _jspx_inited = false; public _jspx_init kekosongan akhir () throws org.apache.jasper.runtime.JspException { } public void _jspService (HttpServletRequest request, Respon HttpServletResponse) melempar java.io.IOException, ServletException { JspFactory _jspxFactory = null; PageContext pageContext = null; Sesi HttpSession = null; ServletContext aplikasi = null; ServletConfig config = null; JspWriter out = null; Halaman Obyek = ini; String _value = null; try { if (_jspx_inited == false) { disinkronkan (ini) { if (_jspx_inited == false) { _jspx_init (); _jspx_inited = true; } } } _jspxFactory = JspFactory.getDefaultFactory (); response.setContentType ("text / html; charset = ISO8859-1 ");

128

pageContext = _jspxFactory.getPageContext (ini, permintaan, respon, "", Benar, 8192, true); aplikasi = pageContext.getServletContext (); config = pageContext.getServletConfig (); sesi = pageContext.getSession (); out = pageContext.getOut (); / / HTML / / mulai [File = "/ PageCounter.jsp", dari = (4,2), untuk = (10,0)] out.write ("\ r \ n <html> \ r \ n <head> \ r \ n <title> PageCounter.jsp </ title> \ r \ n </ head> \ r \ n <body> \ r \ n "); / / Akhir / / Mulai [File = "/ PageCounter.jsp", dari = (10,2), untuk = (10,15)] addCount (); / / Akhir / / HTML / / mulai [File = "/ PageCounter.jsp", dari = (10,17), untuk = (11,27)] out.write ("\ r \ nIni halaman telah dikunjungi"); / / Akhir / / Mulai [File = "/ PageCounter.jsp", dari = (11,30), untuk = (11,41)] out.print (PageCount); / / Akhir / / HTML / / mulai [File = "/ PageCounter.jsp", dari = (11,43), untuk = (14,0)] out.write ("kali \ r \ n </ body> \ r \ n </ html> \ r \ n."); / / Akhir } Catch (Throwable t) { if (keluar! = null && out.getBufferSize ()! = 0) out.clearBuffer (); if (pageContext! = null) pageContext.handlePageException (t); } Akhirnya { if (_jspxFactory! = null)

129

_jspxFactory.releasePageContext (pageContext); } } } Untungnya ini adalah sedikit terakhir kode yang dihasilkan yang muncul dalam buku ini. Membaca diterjemahkan JSP jarang diperlukan juga bukan biasanya helpful2, tetapi tentu dibutuhkan untuk memahami apa wadah tidak ketika JSP diterjemahkan untuk Servlet. Mengambil garis disorot dari PageCounter $ jsp.java, masing-masing dapat dihubungkan kembali ke scripting elemen dari PageCounter.jsp. Dalam PageCounter.jsp deklarasi digunakan untuk mendefinisikan variabel kelas-lebar untuk menghitung jumlah kunjungan halaman dan metode untuk incrementing itu. <%! int PageCount = 0; batal addCount () { PageCount + +; } %> Diterjemahkan ke dalam PageCounter $ jsp.java, kode deklarasi muncul luar metode _jspService () dan kelas-lebar. Hal ini memungkinkan untuk Metode addCount () harus dikodekan sebagai metode nyata Servlet dan PageCount variabel dapat diakses oleh semua panggilan ke _jspService () metode. Itu metode tidak thread-aman, tapi untuk contoh khusus ini, tidak peduli jika perubahan variabel PageCount setengah jalan melalui menghasilkan tanggapan. public class PageCounter $ jsp meluas HttpJspBase { / / Mulai [file = "/ PageCounter.jsp", dari = (0,3), untuk = (4,0)] int PageCount = 0; batal addCount () { PageCount + +; } / / Akhir Dalam PageCounter.jsp sebuah scriptlet dan ekspresi digunakan untuk meningkatkan dan mengirim nilai variabel PageCount ke klien. <% AddCount ();%> Halaman ini telah dikunjungi <% = PageCount%> kali. 2. Kecuali dalam kasus debugging, di mana seringkali berguna untuk melihat JSP dan Servlet dihasilkan side-by-side.

130

Diterjemahkan dalam PageCounter $ jsp.java, scriptlet digunakan verbatim, tetapi ekspresi berubah menjadi panggilan ke cetak () metode objek PrintWriter diperoleh dari HttpServletResponse sesuai. Kedua scripting eleKASIH berada dalam metode _jspService (), adalah benang-aman, dan lokal untuk permintaan klien tertentu. public void _jspService (HttpServletRequest request, Respon HttpServletResponse) melempar java.io.IOException, ServletException { ... / / Mulai [File = "/ PageCounter.jsp", dari = (10,2), untuk = (10,15)] addCount (); / / Akhir / / HTML / / mulai [File = "/ PageCounter.jsp", dari = (10,17), untuk = (11,27)] out.write ("\ r \ nIni halaman telah dikunjungi"); / / Akhir / / Mulai [File = "/ PageCounter.jsp", dari = (11,30), untuk = (11,41)] out.print (PageCount); / / Akhir ... } Maksud dari kode sebelumnya adalah untuk menggambarkan persis di mana scriptlets, ekspresi, dan deklarasi muncul dalam kode Java sumber yang dihasilkan dari JSP. Itu Penting untuk memahami bahwa kedua scriptlets dan ekspresi muncul di dalam _jspService () metode dan secara default thread-aman untuk permintaan tertentu. Deklarasi tidak thread-aman. Kode di dalam deklarasi muncul di luar _jspService () metode dan dapat diakses oleh permintaan sedang diproses oleh JSP. Deklarasi, tidak seperti scriptlets, juga dapat mendeklarasikan fungsi untuk digunakan oleh scriptlets. Baik Coding Praktek dengan Scripting Elements Sebelum pergi keluar dan ceroboh coding JSP dengan elemen scripting, ada beberapa poin penting yang harus dibuat. Paling menonjol adalah masalah benang safety3. 3. "Thread keselamatan" bukan masalah Servlet-spesifik atau JSP-spesifik. Setiap kali kode Java menggunakan beberapa benang, masalah konkurensi negara muncul. Thread keselamatan adalah istilah umum ketika menggambarkan masalah ini karena penting untuk memastikan kode adalah benang-aman-yaitu, mampu bekerja dengan baik jika beberapa benang yang menjalankannya.

131

Bab 9 menyajikan pembahasan lengkap pada thread-manajemen keselamatan dan negara sebagai topik berlaku untuk Servlets dan JSP. Ekspresi dapat dianggap berbahaya. Kecuali sengaja digunakan untuk menyebabkan conkonflik, ekspresi selalu akan menjadi benang-aman. Deklarasi dan scriptlets lebih bermasalah. Menggunakan scriptlet adalah analog dengan menyatakan dan menggunakan variabel lokal dalam metode layanan yang sesuai Servlet. Variabel dideklarasikan oleh scriptlet yang diinisialisasi, digunakan, dan menghancurkan sekali per panggilan ke _jsp yang Layanan () metode. Secara default ini membuat scriptlets benang-aman, tetapi mereka tidak memastikan benda mereka mengakses adalah benang-aman. Jika scriptlet yang mengakses obyek dalam lingkup luar metode _jspService (), maka blok disinkronisasi harus digunakan untuk memastikan keselamatan thread. Deklarasi tidak thread-aman! Sebuah deklarasi muncul di luar metode _jspService (). Terlalu sering deklarasi adalah completely disalahpahami sebagai bentuk disempurnakan scriptlet a. Mereka tidak! Sebuah perdebatan umum adalah apakah scriptlets dan deklarasi dibutuhkan di semua dengan JSP. Kekuatan JSP berasal dari mudah menciptakan Servlets teks penghasil. A JSP dapat dipertahankan jika terutama menandai, yang mudah diedit oleh halaman penulis. Banyak pengembang mengambil sikap bahwa unsur-unsur scripting menghancurkan ini fitur JSP dan harus benar-benar diganti dengan tindakan kustom dan JSP bahasa ekspresi (baru sebagai JSP 2.0, dan dibahas dalam bab berikutnya). Pandangan-Ini Titik berlaku, didukung oleh penulis, dan selanjutnya dibahas dalam bab-bab selanjutnya, tapi tindakan kustom komponen yang relatif berat dibandingkan dengan sederhana skrip tertanam. Scriptlets, deklarasi, dan terutama ekspresi tentu memiliki tempat dengan JSP, tetapi mereka tidak boleh berlebihan. Jika halaman yang penuh dengan elemen scripting yang tak terhitung jumlahnya, mereka cenderung melakukan lebih berbahaya daripada baik. Selalu sadar bagaimana elemen scripting yang digunakan dan jika kode mungkin baik dikemas dalam benda-benda lain yang dapat digunakan oleh elemen scripting beberapa. Direktif Direktif adalah pesan ke kontainer JSP. Mereka tidak mengirim output ke klien, tetapi digunakan untuk mendefinisikan atribut halaman, yang menggunakan perpustakaan tag kustom dan yang halaman lain termasuk. Semua arahan menggunakan sintaks berikut. <% @ Direktif {atribut = "nilai"} *%> Direktif opsional mungkin memiliki spasi ekstra setelah <% @ dan sebelum %>. Ada tiga arahan yang berbeda JSP untuk digunakan pada sebuah page4: halaman, taglib, dan termasuk. 4. Ada petunjuk lain yang hanya dapat digunakan dalam file tag: tag, atribut, dan variabel.

132

<% @ Page%> Halaman direktif menyediakan informasi halaman khusus untuk wadah JSP. Ini Informasi meliputi pengaturan seperti jenis konten JSP adalah untuk menghasilkan, bahasa scripting default halaman, dan kode perpustakaan untuk mengimpor untuk digunakan. Beberapa arahan halaman dapat digunakan pada JSP tunggal atau halaman termasuk melalui JSP sebagai selama tidak ada atribut khusus, kecuali impor, terjadi lebih dari sekali. Atribut untuk halaman direktif adalah sebagai berikut. Bahasa Atribut bahasa mendefinisikan bahasa scripting untuk digunakan oleh scriptlets, ekspresi, dan deklarasi yang terjadi di JSP. Satu-satunya didefinisikan dan diperlukan nilai bahasa scripting untuk atribut ini adalah java. Berbeda containers dapat memberikan dukungan bahasa tambahan, namun hal ini jarang terjadi untuk melihat JSP menggunakan bahasa lain selain Java untuk elemen scripting. Dalam buku ini selalu diasumsikan bahwa bahasa muncul dalam scripting eleKASIH adalah Java (seperti yang saat ini menjadi bahasa hanya didefinisikan). Terjemahan dari scripting elemen menggunakan fragmen kode Java ke dalam kode Java nyata mudah dilakukan dengan setiap pengembang dengan pengalaman Java sebelumnya. Memahami bagaimana dan mengapa scriptlet contoh karya diasumsikan intuitif karena identik dengan bawahberdiri setara Java. meluas meluas nilai atribut adalah pemrograman Java yang memenuhi syarat lanpengukur nama kelas yang nama-nama superclass kelas yang JSP ini transterbentuk. Meluas atribut analog dengan kata kunci meluas digunakan ketika authoring kelas Java. Atribut ini harus digunakan dengan hemat karena mencegah kontainer dari menggunakan kelas dioptimalkan pre-built. impor Impor atribut menjelaskan jenis yang tersedia untuk digunakan dalam scripting elemen. Nilai adalah sama seperti dalam deklarasi impor di Java bahasa pemrograman, dengan beberapa paket yang tercantum dengan baik yang memenuhi syarat Pemrograman Java nama bahasa-jenis atau nama paket yang diikuti oleh. *, yang menunjukkan semua jenis publik menyatakan dalam paket itu. Daftar impor default adalah java.lang. *, Javax.servlet. *, Javax.servlet. jsp. *, dan javax.servlet.http. *. Paket-paket ini dapat diasumsikan tersedia secara default dengan setiap JSP. Impor atribut saat ini hanya didefinisikan untuk digunakan ketika nilai direktif bahasa java. Sesi Sesi atribut menunjukkan bahwa halaman memerlukan partisipasi dalam sesi HTTP. Jika benar, maka implisit scripting variabel referensi sesi sesi saat ini / baru untuk halaman. Jika salah, maka halaman tidak berpartisipasi dalam sesi dan sesi variabel scripting implisit tidak tersedia, dan setiap

133

referensi untuk itu dalam tubuh dari halaman JSP adalah ilegal dan menghasilkan fatal transkesalahan lation. Nilai default dari atribut sesi benar. penyangga buffer atribut menentukan model penyangga untuk keluar awal scripting variabel implisit untuk menangani output isi dari halaman. Jika nilai atribut adalah tidak ada, maka tidak ada penyangga dan output ditulis langsung melalui ke PrintWriter ServletResponse sesuai. Nilai yang valid untuk atribut adalah ukuran yang ditentukan dalam kilobyte, dengan akhiran kb menjadi wajib. Jika ukuran buffer yang ditentukan, maka output buffer dengan ukuran buffer setidaknya ditentukan, nilai. Tergantung pada nilai atribut autoflush, contenda buffer ini baik secara otomatis memerah atau eksepsi dilemparkan ketika meluap akan terjadi. Nilai default dari atribut buffer 8kb. autoflush The autoflush atribut menentukan apakah buffer output harus akan memerah secara otomatis ketika buffer penuh, atau apakah pengecualian harus ditingkatkan untuk menunjukkan buffer overflow. Sebuah nilai true menunjukkan otomatis penyangga pembilasan dan nilai palsu melempar pengecualian. Nilai default dari atribut autoflush benar. Ini adalah ilegal untuk mengatur atribut autoflush untuk false ketika nilai atribut buffer tidak ada. isThreadSafe The isThreadSafe atribut menunjukkan tingkat keselamatan thread diimplementasikan dalam halaman. Jika nilai adalah palsu, maka kontainer JSP harus dismenambal beberapa permintaan klien yang luar biasa, satu per satu, dalam urutan mereka diterima, untuk pelaksanaan halaman untuk diproses oleh karena yang dihasilkan Servlet menerapkan SingleThreadModel. Jika nilai atribut itu benar, maka JSP kontainer dapat memilih untuk mengirimkan beberapa permintaan klien ke halaman simultaneously. Nilai default dari atribut isThreadSafe benar. isErrorPage The isErrorPage atribut menunjukkan jika halaman JSP saat ini dimaksudkan untuk menjadi halaman kesalahan untuk JSP lainnya. Jika benar, maka scripting implisit variabel pengecualian didefinisikan, dan nilainya adalah referensi ke menyinggung Objek Throwable. Jika nilai atribut isErrorPage adalah palsu, maka variabel implisit pengecualian tidak tersedia, dan setiap referensi untuk itu dalam tubuh dari halaman JSP adalah ilegal dan akan mengakibatkan kesalahan terjemahan fatal. Default nilai atribut isErrorPage adalah palsu. errorPage The errorPage atribut mendefinisikan URL relatif terhadap sumber daya di Aplikasi Web yang setiap bahasa pemrograman Java Throwable objek dilemparkan tetapi tidak tertangkap oleh implementasi halaman diteruskan untuk kesalahan processing. The Throwable objek ditransfer ke halaman kesalahan dengan mengikat objek referensi untuk meminta lingkup dengan nama javax.servlet.jsp.jspException.

134

Jika nilai dari atribut autoflush benar, dan jika isi JspWriter awal telah memerah ke output stream ServletResponse, maka setiap upaya selanjutnya untuk mengirimkan eksepsi tidak tertangkap dari menyinggung Halaman ke errorPage mungkin gagal. contenttype The contenttype atribut mendefinisikan pengkodean karakter untuk Halaman JSP, dan untuk respon dari halaman JSP dan tipe MIME untuk Tanggapan dari halaman JSP. Nilai default dari atribut contenttype text / html dengan ISO-8859-1 encoding karakter untuk reguler sintaks JSP dan UTF8 encoding untuk JSP dalam sintaks XML. pageEncoding The pageEncoding atribut mendefinisikan pengkodean karakter untuk JSP. Nilai default dari atribut pageEncoding adalah ISO-8859-1 untuk reguler JSP dan UTF-8 untuk JSP dalam sintaks XML. isScriptingEnabled The isScriptingEnabled atribut menentukan apakah elemen scripting yang diizinkan untuk digunakan. Nilai default (true) memungkinkan scriptlets, ekspresi, dan deklarasi. Jika nilai atribut ini diatur ke false, terjemahantime error akan dimunculkan jika JSP menggunakan scriptlets apapun, ekspresi (non-EL), atau deklarasi. Atribut ini sangat membantu untuk menciptakan 'warkat' JSP dan juga dapat diatur menggunakan elemen scripting-enabled web.xml. isELEnabled The isELEnabled atribut menentukan apakah JSP EL ekspresi yang digunakan di JSP harus dievaluasi. Nilai default dari atribut itu benar, berarti bahwa ekspresi, $ {...}, dievaluasi sebagai ditentukan oleh spesifikasi JSP. Jika atribut diatur ke false, maka ekspresi tidak dievaluasi melainkan diperlakukan sebagai teks statis. Halaman direktif adalah dengan set standar untuk mengakomodasi penggunaan yang paling umum dari JSP: untuk membuat halaman HTML dinamis. Ketika membuat JSP sederhana, jarang diperlukan untuk menentukan salah satu atribut direktif halaman kecuali dalam kasus di mana ekstra kode perpustakaan yang diperlukan untuk elemen scripting atau ketika memproduksi XML konten, yang terjadi lebih dan lebih. <% @ Include%> dan <jsp:include /> The include direktif digunakan untuk memasukkan teks dan / atau kode pada waktu terjemahan dari JSP. The include direktif selalu mengikuti sintaks yang sama, <% @ include file = "relativeURL"%>, dimana nilai relativeURL diganti dengan file untuk dimasukkan. Termasuk file harus menjadi bagian dari Aplikasi Web. Sejak termasuk arahan berlangsung pada waktu translasi, mereka adalah setara secara langsung

135

termasuk kode sumber di JSP sebelum kompilasi dan tidak mengakibatkan perhilangnya kinerja saat runtime. Server-side termasuk adalah fitur umum digunakan JSP. Termasuk memungkinkan bit berulang-ulang kode yang sama untuk dilanggar dari beberapa halaman dan memiliki satu contoh itu termasuk dengan mereka semua. Sebuah contoh yang baik untuk digunakan adalah termasuk header umum dan footer dengan beberapa halaman konten. Biasanya ini technique digunakan untuk menjaga navigasi situs dan informasi hak cipta yang benar dan dipertahankan untuk semua halaman individual di situs. Sebagai contoh mengambil berikut dua file, header.jsp dan footer.jsp. Berkas header.jsp (Listing 3-7) termasuk informasi yang muncul di atas halaman. Ini termasuk navigasi situs dan informasi lain-lain. Header ini juga melacak berapa banyak orang telah mengunjungi situs itu sejak terakhir kali Aplikasi Web yang reloaded dengan menggunakan kembali kode dari PageCounter.jsp. Listing 3-7 header.jsp <%! int PageCount = 0; batal addCount () { PageCount + +; } %> <% AddCount ();%> <html> <head> <title> Header / Footer Contoh </ title> </ Head> <body> <center> Servlets dan JSP <h2> J2EE Web Tier </ h2> <a href="http://www.jspbook.com"> Buku Situs Dukungan </ a> <a href="ShowSource"> Situs Source code </ a> <br> Situs ini telah dikunjungi <% = PageCount%> kali. </ Center> <br> Berkas footer.jsp (Listing 3-8) termasuk informasi yang muncul di bagian paling bawah halaman. Ini termasuk informasi hak cipta, penolakan, dan informasi lain-lain. Listing 3-8 <br> <center> footer.jsp

136

</ Center> </ Body> </ Html> Sendiri header.jsp dan footer.jsp tidak berbuat banyak, tapi ketika comdigabung dengan beberapa konten, satu halaman penuh dapat dihasilkan. Sebagai contoh ini konten tidak masalah. Sewenang-wenang membuat sebuah JSP, tetapi pastikan untuk menyertakan header.jsp di bagian atas halaman dan footer.jsp di bagian bawah. Listing 3-9 provides contoh halaman tersebut. Listing 3-9 content.jsp <% @ Include file = "header.jsp"%> Hanya isi dari halaman yang unik. Header dan footer yang sama digunakan kembali dari header.jsp dan footer.jsp dengan cara include direktif <% @ Include file = "footer.jsp"%> Simpan semua tiga file, header.jsp, footer.jsp, dan content.jsp, di dasar direktori dari jspbook Aplikasi Web dan browse ke http://127. 0.0.1/jspbook/content.jsp. Semua tiga file yang dihaluskan bersama di terjemahan waktu untuk menghasilkan Servlet yang mencakup isi header.jsp, content.jsp, dan footer.jsp dalam urutan yang tepat. Gambar 3-6 menunjukkan browser rendering dari output.

137

Jadi apa keuntungan dari pendekatan ini lebih menggabungkan header.jsp, content.jsp, dan footer.jsp semua dalam satu file di tempat pertama? Sebagai file diatur sekarang, banyak halaman konten dapat dibuat yang menggunakan kembali header dan footer. Header dan footer juga dapat diubah pada waktu tertentu, dan perubahan mudah tercermin di semua JSP. Terjemahan-Time Termasuk Time terjemahan terjadi ketika JSP sedang diterjemahkan ke dalam Servlet. Itu Servlet dihasilkan tidak tahu atau peduli tentang file apa yang digunakan untuk menghasilkan itu. Akibatnya Servlet tidak mampu untuk memberitahu ketika perubahan telah terjadi di termasuk file. Spesifikasi JSP tidak menentukan mekanisme untuk pemecahan masalah ini, tapi vendor kontainer JSP bebas untuk menerapkan solusi untuk masalah. Dalam kasus di mana seluruh situs bergantung pada terjemahan-waktu termasuk untuk efisiensi, solusi sederhana memang ada untuk memiliki perubahan dalam terjemahan-waktu termasuk tercermin di seluruh situs. Sebuah wadah bergantung pada memiliki kode diterjemahkan dari JSP untuk mengkompilasi dan menyebarkan Servlet yang sesuai. Ketika kurang kode, wadah harus kembali menerjemahkan JSP dan mengkompilasi dan menyebarkan yang sesuai Servlet. Dengan memaksa wadah untuk kembali menerjemahkan semua JSP, dapat dipastikan bahwa terjemahan-time termasuk dengan benar tercermin JSP yang menggunakannya. Dengan Tomcat, JSP diterjemahkan ke kode sumber Servlet dapat ditemukan di TOMCAT_HOME / direktori kerja. Cukup menghapus isi direktori ini untuk memiliki Tomcat kembali menerjemahkan semua JSP. Untuk non-terjemahan-time termasuk JSP juga mendefinisikan tindakan termasuk. Seperti direktif meliputi, tindakan ini digunakan untuk menyertakan sumber daya dengan output dari JSP, tapi tindakan termasuk berlangsung di runtime. Sementara tidak efisien, yang meliputi tindakan secara otomatis memastikan bahwa output terbaru yang disertakan file yang digunakan. Lihat <jsp:include /> bab ini untuk informasi lebih lanjut tentang tindakan termasuk. <% @ Taglib%> Tindakan kustom yang sebelumnya disebutkan dalam bab ini, tapi tidak sepenuhnya tertutup sampai Bab 7. Tindakan kustom, juga disebut perpustakaan tag kustom, memungkinkan JSP pengembang untuk menghubungkan bit markup untuk disesuaikan kode Java. The taglib direktif menginformasikan wadah apa bit dari markup pada halaman harus con-

138

sidered kode kustom dan kode markup link apa. The taglib direktif selalu mengikuti sintaks yang sama, <% @ taglib uri = "uri" prefix = "prefixOfTag" %>, Di mana nilai atribut uri resolve ke lokasi kontainer memahami dan atribut awalan menginformasikan wadah apa bit dari markup adalah custom tindakan. Penjelasan lebih lanjut dan contoh menggunakan taglib direktif dapat ditemukan dalam Bab 7. JSP Konfigurasi Arahan dalam informasi konfigurasi arti sederhana untuk JSP. Satu-satunya masalah dengan menggunakan petunjuk untuk konfigurasi adalah bahwa mereka harus ditentukan pada basis per-JSP. Jika Anda memiliki 20 halaman, maka Anda harus mengedit setidaknya 20 Director, tives. Untuk menyederhanakan tugas melakukan massa JSP konfigurasi, jsp-config Unsur yang tersedia untuk digunakan dalam web.xml. Ada dua sub-elemen jspconfig: taglib dan jsp-properti-kelompok. The taglib elemen dapat digunakan untuk conmencari tag JSP perpustakaan kustom untuk digunakan dengan JSP. Jsp-properti-kelompok elemen memungkinkan untuk konfigurasi yang mirip dengan arahan tetapi bisa diterapkan pada sekelompok JSP. Untuk kelengkapan elemen taglib akan dibahas di sini dan dirujuk dalam bab kemudian yang bersangkutan mengenai kustom JSP tag perpustakaan. Penggunaan taglib elemen sangat mudah, pertama menentukan taglib-uri elemen anak, yang mendefinisikan tag kustom awalan yang digunakan, selanjutnya menentukan elemen taglib-lokasi, yang mendefinisikan lokasi perpustakaan tag kustom. Sebagai contoh: ... <jsp-config> <taglib> <taglib-uri> foo </ taglib-uri> <taglib-location> WEB-INF/foo.tld </ taglib-lokasi> </ Taglib> </ Jsp-config> ... Untuk lebih lanjut tentang perpustakaan tag lihat Bab 7. Unsur jsp-properti-kelompok saat ini lebih banyak lagi relevansi karena merupakan alternatif bagi banyak fungsi yang ditawarkan oleh JSP Director, tives. Menggunakan dasar elemen jsp-properti-kelompok selalu sama; penggunaan pertama elemen url-pola anak untuk menentukan JSP untuk menerapkan properti ke: <jsp-config> <jsp-property-group>

139

<url-pattern> *. jsp </ url-pattern> ... </ Jsp-properti-kelompok> </ Jsp-config> Dalam kode sebelumnya konfigurasi akan diterapkan ke semua file berekstensi Jsp yang kemungkinan akan menjadi semua JSP dalam Aplikasi Web.. Secara umum Unsur url-pola dapat memiliki salah satu dari nilai-nilai yang valid untuk digunakan saat penggelaran Servlets atau JSP via web.xml. Dengan sendirinya elemen url-pola tidak apa-apa tapi cocok satu set properti untuk satu set tertentu dari JSP. Sifat merekadiri harus selanjutnya akan ditentukan dengan menggunakan lebih elemen anak jsp-propertikelompok. Unsur jsp-properti-kelompok memiliki keturunan sebagai berikut elemen, yaitu semua cukup self-deskriptif. el-enabled The mengkonfigurasi elemen el-enabled jika JSP EL yang tersedia untuk digunakan pada JSP tertentu. Sebuah nilai true memungkinkan penggunaan EL. Sebuah nilai menonaktifkan palsu itu. Fungsi ini analog dengan atribut isELEnabled halaman arahan itu. scripting-diaktifkan Elemen scripting-enabled analog ke halaman isScriptingEnabled atribut arahan itu. Suatu nilai palsu akan menyebabkan JSP untuk meningkatkan kesalahan penerjemahan jika ada scriptlets, ekspresi (non-EL), atau direktif digunakan. Sebuah nilai true akan memungkinkan elemen scripting untuk digunakan. Halaman-encoding Elemen Halaman-encoding analog ke halaman pageEncoding atribut arahan itu. Sebuah kesalahan akan dimunculkan jika pengkodean diatur menggunakan halaman-encoding atribut dan pengkodean yang berbeda ditentukan dengan menggunakan pageEncoding atribut halaman direktif JSP. meliputi pendahuluan-Unsur meliputi-pendahuluan dapat digunakan untuk memasukkan isi sumber daya lain dalam Aplikasi Web sebelum isi generated oleh JSP. Efektif elemen include-awal menyediakan metode otomatis termasuk header untuk semua JSP bahwa jsp-properti-kelompok conpikir untuk. termasuk coda-Unsur meliputi-coda dapat digunakan untuk menyertakan isi sumber daya lain dalam Aplikasi Web setelah isi dihasilkan oleh JSP. Efektif elemen termasuk-coda menyediakan metode yang secara otomatis termasuk footer untuk semua JSP bahwa jsp-properti-kelompok dikonfigurasi untuk. adalah xml-Unsur adalah-xml dapat digunakan untuk menunjukkan jika JSP XML dokumenKASIH. JSP ditulis dalam sintaks XML tidak perlu selalu secara eksplisit dinyatakan sebagai XML, namun, menyatakan sangat membantu untuk kedua memvalidasi dokumen dan mengambil keuntungan dari fitur-JSP XML seperti UTF-8 encoding.

140

Secara keseluruhan, elemen jsp-properti-kelompok harus sangat intuitif untuk digunakan. Satu-satunya fungsi baru yang telah diperkenalkan adalah karena termasukpendahuluan, termasuk-koda, dan elemen-adalah xml. Kedua termasuk-pendahuluan dan termasuk-coda juga sangat mudah untuk digunakan. Dalam penggunaannya, kedua elemen menggantikan kebutuhan header dan footer termasuk menggunakan JSP termasuk direktif atau tindakan kustom. Unsur adalah-xml baru, tapi jangan khawatir jika tidak jelas untuk elemen apa yang dilakukan. Kemudian dalam bab ini JSP dalam sintaks XML ditangani dengan benar. Header aplikasi-lebar dan footer Hal ini sangat umum untuk membangun aplikasi Web yang mencakup header yang sama dan footer pada setiap halaman. Dalam kasus ini ada banyak metode yang dapat Anda gunakan untuk pergi tentang mencapai fungsi tersebut, tetapi bisa dibilang yang paling mudah adalah dengan menggunakan meliputi pendahuluan dan elemen-termasuk-coda. Dibandingkan dengan manual termasuk header dan footer pada setiap halaman, seperti pada Listing 3-9, sedikit yang diperoleh, tetapi sedikit membantu untuk menggunakan include-awal dan elemen-termasuk coda untuk dua alasan. Pertama, masuknya header dan footer halaman dikonsolidasikan ke salah satu titik tunggal, web.xml. Nama-nama atau lokasi header dan footer sumber daya dapat dengan mudah diubah untuk alasan tertentu. Bila menggunakan direktif include atau tindakan, ini tidak akan terjadi. Sebuah perubahan akan sedikit sedikit lebih merepotkan, tapi masih bisa dilakukan. Manfaat kedua untuk menggunakan include-pendahuluan dan elemen termasuk-coda adalah bahwa halaman Web Application hanya harus fokus pada konten, tidak ada yang lain. Memang, mengingat untuk memasukkan header dan footer bukan tugas yang sulit, tetapi merupakan tugas semua sama. Menggunakan include-awal dan elemen-termasuk coda untuk aplikasiheader dan footer lebar mudah, dan selalu dilakukan dengan cara yang sama sebagai ilustrated pada Listing 3-10. Listing 3-10 Aplikasi-lebar Header dan Footer File <jsp-config> <jsp-property-group> <url-pattern> *. jsp </ url-pattern> <include-prelude> / header.jsp </ include-awal> <include-coda> / footer.jsp </ include-coda> </ Jsp-properti-kelompok> </ Jsp-config> Seperti ditunjukkan, jsp-properti-kelompok dikonfigurasi untuk diterapkan ke semua file JSP; Namun, konfigurasi dapat diperluas untuk mencakup sumber daya lain jika

141

dibutuhkan. Hal yang penting untuk melihat adalah bahwa konfigurasi yang diterapkan untuk semuanya penting. Selanjutnya, elemen-termasuk pendahuluan dan termasukelemen coda digunakan untuk memasukkan header dan footer, masing-masing. Lokasi diberikan adalah / header.jsp dan / footer.jsp, tetapi sumber daya lainnya dapat digunakan. Standar JSP Aksi Tindakan menyediakan metode yang nyaman menghubungkan kode dinamis untuk sederhana markup yang muncul dalam JSP. Fungsi tersebut adalah identik dengan elemen scripting namun memiliki keuntungan sepenuhnya abstrak kode yang secara normal harus bercampur dengan JSP. Tindakan yang dirancang untuk mudah digunakan dan bekerja dengan baik membantu menjaga JSP efisien dan dipertahankan. Ada dua jenis tindakan yang tersedia untuk digunakan dengan JSP: standar dan kustom. Semua tindakan mengikuti sintaks yang sama, <prefix: {elemen atribut = "Value"} * />, di mana tindakan lengkap tag XML-kompatibel dan mencakup awalan yang diberikan, elemen, dan satu set atribut dan nilai-nilai yang menyesuaikan tindakan. Tindakan standar benar-benar ditentukan oleh spesifikasi JSP dan, secara default, tersedia untuk digunakan dengan kontainer JSP. Tindakan kustom adalah mekanisme-a anism didefinisikan oleh spesifikasi JSP untuk meningkatkan JSP dengan memungkinkan pengembang JSP untuk membuat tindakan mereka sendiri. Fungsi tindakan kustom tidak didefinisikan oleh spesifikasi JSP, dan tindakan kustom harus diinstal dengan Web yang Aplikasi sebelum digunakan. Tindakan standar diringkas dalam bagian ini. Tindakan standar termasuk fungsi yang umum digunakan dengan JSP dan memungkinkan untuk: mudah menggunakan Java Applet, termasuk file pada runtime, memanipulasi JavaBeans, dan forwarding permintaan antara sumber daya Web Application. <jsp:include/> JSP melengkapi direktif include dengan memberikan tindakan standar untuk termasuk sumber daya selama runtime. Sintaks dari tindakan include mirip dengan include direktif dan adalah sebagai berikut: <jsp:include page="page" />, dimana Halaman nilai atribut adalah lokasi relatif dalam Aplikasi Web dari halaman ke termasuk. The meliputi tindakan dapat digunakan dalam JSP sama dengan direktif include. Menggunakan kembali file header.jsp dan footer.jsp dari direktif contoh termasuk pada Listing 3-11 adalah JSP yang mencakup header dan footer pada saat runtime.

142

Listing 3-11 runtimeInclude.jsp <jsp:include page="header.jsp" /> Hanya isi dari halaman yang unik. Header dan footer yang sama kembali dari header.jsp dan footer.jsp dengan cara include direktif. <jsp:include page="footer.jsp" /> Simpan kode sebagai runtimeInclude.jsp di direktori dasar yang jspbook Aplikasi Web dan browse ke http://127.0.0.1/jspbook/runtimeInclude. jsp. Halaman yang sama ditampilkan sebagai dengan content.jsp. Gambar 3-7 menunjukkan browser rendering runtimeInclude.jsp. Hasil akhirnya tampak sama, tetapi penting untuk membedakan difinterferensi antara include direktif dan tindakan termasuk. Sebuah termasuk bahwa terjadi pada runtime selalu saat ini dengan sumber daya itu termasuk. Sebuah termasuk dilakukan pada waktu translasi hanya saat ini dengan sumber daya seperti itu pada saat penerjemahan. Sebuah contoh sederhana (Listing 3-12) menggambarkan titik. Mengedit footer.jsp untuk memasukkan perubahan kecil, disclaimer. Listing 3-12 Footer.jsp Diedit <br> <center> Copyright 2003 <br> <small> Disclaimer: semua informasi pada halaman ini ditutupi oleh disclaimer ini. </ small> Gambar 3-7

142

</ Center> </ Body> </ Html> Sekarang melihat kedua content.jsp dan runtimeInclude.jsp lagi untuk melihat berubah. Gambar 3-8 menunjukkan render browser runtimeInclude.jsp (http:// 127.0.0.1/jspbook/runtimeInclude.jsp). Halaman ini mencerminkan update footer.jsp otomatis. Hal ini berlaku untuk setiap update yang dilakukan untuk sumber daya yang termasuk melalui aksi termasuk. Namun, content.jsp (http://127.0.0.1/ jspbook / content.jsp) tidak muncul untuk mencerminkan perubahan. Masih terlihat iDENvertikal ke halaman yang muncul di kedua Gambar 3-6 dan Gambar 3-7 sebelumnya. Runtime terhadap terjemahan-time termasuk adalah alasan untuk inkonsistensi. File content.jsp ini diterjemahkan ke dalam Servlet yang meliputi tepat contenda dari kedua header.jsp dan footer.jsp sebelum sunting dibuat untuk footer.jsp. Untuk memiliki perubahan tercermin, content.jsp harus kembali diterjemahkan ke menggunakan footer.jsp baru. The runtimeInclude.jsp Servlet tidak perlu menerjemahkan ulang karena hal itu bergantung pada footer.jsp termasuk saat runtime. Analogi ke API Servlet runtimeInclude.jsp yang menggunakan RequestDispatcher include () metode panggilan untuk mengakses kedua header.jsp dan footer.jsp, tapi content.jsp tidak. Kode untuk content.jsp dihasilkan oleh langsung termasuk kode untuk header.jsp dan footer.jsp sebelum kompilasi Servlet. Perbedaan antara include direktif dan termasuk tindakan penting dimengerti karena mempengaruhi kinerja dan konsistensi. Sebuah JSP yang menggunakan Gambar 3-8

termasuk arahan memiliki kinerja yang sama seperti jika termasuk tidak pernah digunakan, namun Kekurangannya adalah bahwa JSP ini tidak akan secara otomatis mencerminkan pembaruan file yang disertakan. Sebuah JSP yang menggunakan mencakup tindakan akan selalu mencerminkan arus isi halaman termasuk, tapi menderita kerugian kinerja sedikit untuk melakukannya. <jsp:plugin/>, <jsp:fallback/>, <jsp:params/>, dan <jsp:param/> JSP memiliki Java ikatan yang sangat kuat. JSP pada awalnya dirancang sebagai teknologi Java pengembang akan dengan mudah dapat menggunakan. Untuk alasan ini adalah umum untuk melihat JSP yang digunakan dalam hubungannya dengan banyak teknologi Java lain yang saat ini ada. Salah satu kegunaan menonjol dari Jawa masih Applet Java. Sebuah Applet Java adalah Java aplikasi, menjalankan dengan banyak pembatasan, yang mengeksekusi di browser Web klien melalui Java-mendukung plug-in. Java Applet kita tidak terlalu terikat dengan JSP dan spesifikasi Servlet dan tidak akan dibahas dalam buku ini. Spesifikasi JSP menentukan tindakan kustom untuk dengan mudah menghasilkan tepat kode kustom diperlukan untuk menanamkan Java Applet dalam sebuah halaman HTML. Applettindakan terkait: Plugin, mundur, dan params. Tindakan Plugin mewakili satu Applet yang harus tertanam dalam sebuah halaman HTML. Tindakan Plugin memungkinkan untuk atribut berikut: Jenis Jenis atribut mengidentifikasi jenis komponen: a Bean atau Applet. Sebutir komponen dibangun untuk mencocokkan niat asli dari Spesifikasi JavaBean. Sebuah Applet adalah sering terlihat client-side Java fungsi menambah arti browser menerapkan melalui Java plug-in. Kode Kode atribut menentukan baik nama file kelas yang berisi Applet yang disusun subclass atau jalan untuk mendapatkan kelas, termasuk file kelas sendiri. Hal ini ditafsirkan sehubungan dengan atribut basis kode. basis kode basis kode atribut menentukan URI dasar untuk Applet. Jika hal ini atribut tidak ditentukan, maka default basis URI yang sama seperti untuk JSP saat ini. Nilai untuk atribut ini hanya bisa merujuk ke subdirektori dari direktori conTaining dokumen saat. menyelaraskan The atribut align menentukan lokasi Applet relatif terhadap di mana ia sedang ditampilkan. Nilai yang valid adalah bawah, tengah, dan atas. Arsip atribut arsip menetapkan daftar dipisahkan koma URI untuk File JAR yang berisi kelas dan sumber daya lain yang harus dimuat sebelum Applet diinisialisasi. Kelas-kelas yang dimuat dengan menggunakan sebuah instance dari AppletClass Loader dengan basis kode yang diberikan. Relatif URI untuk arsip diinterpretasikan dengan

144

menghormati basis kode Applet ini. Sumber preloading secara signifikan dapat meningkatkan kinerja Applet. Ketinggian atribut tinggi mendefinisikan tinggi baik dalam pixel atau persen yang jendela yang menampilkan Applet harus menggunakan. Nilai ini dapat ditetapkan pada runtime melalui ekspresi jika diperlukan. hspace The hspace atribut menentukan jumlah spasi menjadi dimasukkan horizontal di sekitar Applet. jreversion The jreversion atribut mengidentifikasi nomor versi spec JRE komponen membutuhkan untuk beroperasi, default adalah 1,2. nama Atribut name menentukan nama untuk contoh Applet, yang membuat memungkinkan Applet pada halaman yang sama untuk menemukan dan berkomunikasi satu sama lainnya. vSpace The vSpace atribut menentukan jumlah spasi menjadi dimasukkan secara vertikal sekitar Applet. Lebar Lebar atribut mendefinisikan lebar baik pixel atau persen bahwa jendela yang menampilkan Applet harus menggunakan. Nilai ini dapat ditetapkan pada runtime melalui ekspresi jika diperlukan. Tindakan mundur yang digunakan untuk memberikan pemberitahuan kepada klien seharusnya Browser klien tidak dapat menggunakan Java plug-in. Tindakan mundur memungkinkan untuk pesan teks yang sewenang-wenang untuk dimasukkan sebagai tubuhnya, dan harus menjadi sub-tag untuk tindakan Plugin. Teks termasuk dalam tindakan mundur disajikan kepada klien harus browser mereka gagal untuk mendukung Java plug-in. Tindakan params digunakan untuk mengatur parameter untuk kode yang tertanam oleh tindakan Plugin. Tindakan params membutuhkan satu-ke-banyak tindakan sub param. A Tindakan param memiliki dua atribut, nama dan nilai, yang menentukan nama dan nilai, masing-masing, untuk parameter. Bila menggunakan tindakan params dengan tindakan Plugin, tindakan param harus menjadi sub-tag dari tindakan Plugin. Menggabungkan plugin, mundur, params, dan tindakan param, sepenuhnya customized Java Applet dapat dengan mudah tertanam dalam sebuah halaman HTML. Menggunakan semua tindakan bersama-sama yang terbaik ditunjukkan melalui contoh. Listing 3-13 embeds Applet, FooApplet.class, dalam sebuah halaman HTML yang dihasilkan oleh JSP. Listing 3-13 AppletExample.jsp <html> <head> <title> Applet Contoh </ title>

145

</ Head> <body> <Jsp: Plugin type = "applet" kode = "FooApplet.class" height = "100" width = "100" jreversion = "1.2"> <jsp:fallback> Dukungan applet tidak ditemukan, tidak bisa menjalankan contoh </ jsp: fallback>. </ Jsp: Plugin> </ Body> </ Html> Hal ini penting untuk mengingat di mana segala sesuatu terjadi saat menggunakan Applet dan JSP. JSP mengeksekusi pada server-side, Applet mengeksekusi pada sisi klien. Itu Hasil AppletExample.jsp akan menjadi sebuah dokumen HTML biasa dengan reference untuk FooApplet.class. Sebenarnya kode untuk FooApplet.class-download oleh browser Web dengan mengeluarkan permintaan kedua ke server Web dari mana HTML datang. Sebuah JSP tidak mengirimkan kode Applet di dalam HTML halaman yang generates, juga tidak kode Applet bisa dijalankan pada server Web asalnya. Untuk lebih menunjukkan titik ini, Listing 3-14 menyediakan kode untuk FooApplet. java. Listing 3-14 FooApplet.java import javax.swing *.; impor java.awt *.; FooApplet kelas publik meluas JApplet { public void init () { JLabel label = new JLabel ("Saya seorang Applet."); label.setHorizontalAlignment (JLabel.CENTER); . getContentPane () menambahkan (label, BorderLayout.CENTER); } } Kompilasi kode sebelumnya dan menempatkan kedua FooApplet.class dan Applet Example.jsp di direktori dasar Aplikasi Web jspbook. (Jangan letakkan FooApplet.class dalam folder / WEB-INF/classes/com/jspbook. Untuk menggunakan Applet, klien harus dapat mendownloadnya. Menempatkan kode dalam / WEB-INF direktori mencegah klien dari melakukannya.) Setelah menempatkan dua file, browse untuk http://127.0.0.1/jspbook/AppletExample.jsp. Jika browser Anda mendukung

145

plug-in Java versi 1.2, itu akan memuat contoh Applet. Gambar 3-9 menunjukkan apa yang tampak seperti ketika Applet dijalankan oleh browser Web. Haruskah browser Anda tidak mendukung Java plug-in, pesan fallback adalah ditampilkan. Tergantung pada browser tertentu, mungkin juga mencoba untuk secara otomatis download dan menginstal Java plug-in. Tindakan Plugin ini dirancang untuk mudah digunakan, tapi itu membawa beberapa poin-poin penting. Titik kunci dari bagian ini adalah bahwa tindakan Plugin membuatnya mudah untuk menanamkan sebuah applet Java yang ada dalam dokumen HTML yang dihasilkan oleh JSP. Plugin opsional dapat juga termasuk mundur, params, dan tindakan param sebagai subtags untuk menyesuaikan Applet. Poin tambahan dibesarkan dari fungsi ini menambah arti yang mana Applet mengeksekusi dibandingkan JSP dan di mana untuk menempatkan kode Applet dalam Aplikasi Web. Dua poin yang layak penjelasan lebih lanjut dan dismengumpat dalam sisa bagian ini. Untuk memperjelas apa yang terbaik tindakan Plugin tidak, akan sangat membantu untuk menunjukkan HTML kode sumber yang dihasilkan oleh tindakan. Kode sumber yang dihasilkan oleh Applet Example.jsp tercantum pada Listing 3-15 dengan garis yang dihasilkan oleh plugin tindakan yang ditandai. Listing 3-15 Output AppletExample.jsp <html> <head> <title> Applet Contoh </ title> </ Head> <body> <Objek classid = "CLSID: 8AD9C840-044E-11D1-B3E9-00805F499D93" width = "100" height = "100" Gambar 3-9

146

codebase = "http://java.sun.com/products/plugin/1.2.2/jinstall-1_2_2win.cab # Version = 1,2,2,0 "> <param name="java_code" value="FooApplet.class"> <param name="type" value="application/x-java-applet"> <comment> <Embed jenis = "application / x-java-applet;" width = "100" height = "100" pluginspage = "http://java.sun.com/products/plugin/" java_code = "FooApplet.class"> <noembed> </ Comment> Dukungan applet tidak ditemukan, tidak bisa menjalankan contoh. </ Noembed> </ embed> </ Object> </ Body> </ Html> Kode ini sedikit tersembunyi namun tentu bukan biner FooApplet.class. Apa yang disorot hanya menggunakan valid sempurna dari elemen HTML sebagai objek didefinisikan oleh HTML 4.0 specification5. HTML elemen objek adalah lebih bentuk generik dari elemen applet sekarang usang yang dirancang untuk memungkinkan Applet yang akan dirujuk dari HTML. Elemen objek mendefinisikan semua yang diperlukan Informasi browser perlu men-download file FooApplet.class bersama dengan memuat browser plug-in yang tepat untuk melaksanakannya. Setelah membaca objek elemen, browser menghasilkan permintaan HTTP benar-benar baru untuk Foo Applet.class. URL adalah kombinasi dari informasi yang ditentukan oleh obyek tag, tapi akhirnya menjadi http://127.0.0.1/jspbook/FooApplet.class. URL browser Web untuk men-download Applet adalah alasan bahwa Applet kode tidak harus ditempatkan di bawah direktori / WEB-INF/classes. Kode dalam direktori dimaksudkan hanya untuk penggunaan di server-side dan tidak dapat diakses oleh klien luar. Dengan menempatkan kode Applet dalam direktori dasar bersama AppletExample.jsp, browser Web adalah gratis untuk men-download dan menggunakannya. <jsp:forward/> JSP menyediakan setara dengan metode RequestDispather.forward () dengan menggunakan tindakan ke depan. Ke depan aksi ke depan permintaan untuk sumber daya baru dan membersihkan setiap konten yang mungkin sebelumnya telah dikirim ke buffer output dengan 5. http://www.w3.org/TR/html4/

147

JSP saat ini. Haruskah JSP saat ini tidak buffer, atau isi dari penyangga sudah dikirim ke klien, IllegalStateException dilemparkan. Itu maju tindakan menggunakan sintaks berikut: url="relativeURL"/> <jsp:forward, dimana nilai relativeURL adalah lokasi relatif di Web saat ini Penerapan sumber daya untuk meneruskan permintaan ke. Opsional depan tindakan mungkin memiliki tindakan param digunakan sebagai subelements untuk menentukan parameter permintaan. Mana yang berlaku, nilai-nilai tindakan param menimpa parameter permintaan yang ada. <jsp:forward/> dan <jsp:include/> parameter Baik JSP maju dan termasuk tindakan opsional dapat mencakup parameter. Mekanisme untuk melakukan hal ini adalah tindakan param JSP. Tindakan param mungkin hanya muncul dalam tubuh baik maju atau mencakup tindakan dan digunakan untuk mendefinisikan parameter. Sintaks dari tindakan param adalah sebagai berikut: <jsp:param name="parameter's Name" value="parameter's value"/> Parameter adalah kunci / nilai pasangan dengan nama atribut menentukan nama dan nilai atribut menentukan nilai. Nilai-nilai yang dibuat tersedia untuk untukdihindari atau termasuk sumber daya melalui getParameter HttpServletRequest () metode, misalnya, jika aksi ke depan itu ditulis sebagai berikut: page="examplePage.jsp"> <jsp:forward <jsp:param name="foo1" value="bar"/> <Jsp: Nama param = "foo2" value = "<% = foo%>" /> </ Jsp: maju> Halaman fiktif examplePage.jsp akan memiliki dua permintaan tambahan parameter yang ditetapkan untuk itu: foo1 dan foo2. Nilai foo1 akan 'bar' dan nilai foo2 akan menjadi representasi string apapun variabel foo adalah. Dalam kasus di mana parameter yang ditentukan oleh konflik aksi param dengan parameter yang ada, parameter yang ada diganti. JavaBean Tindakan Seperti Applet, JavaBeans biasanya digunakan objek Java, dan JSP menyediakan dukungan default untuk dengan mudah menggunakan mereka. The <jsp:useBean />, <jsp: getProperty />, Dan <jsp:setProperty /> tindakan semua berhubungan dengan JavaBeans, tetapi tidak akan sepenuhnya dibahas dalam bab ini. Tidak seperti Applet, JavaBeans jauh lebih umum digunakan dengan Servlet dan JSP proyek. Kemudian bab mengandalkan pengetahuan JavaBean, dan JavaBeans dijelaskan secara mendalam dalam buku ini. Bab 5 memperkenalkan,

148

menjelaskan, dan menunjukkan contoh JavaBeans dan tindakan JSP kustom untuk menggunakan mereka. Tag Actions Berkas Satu set JSP tindakan standar yang ada untuk digunakan dengan tag kustom. Tindakan ini <jsp:attribute/>, <jsp:body/>, <jsp:doBody/>, dan <jsp:invoke/>. Bab 7 meliputi tindakan ini secara mendalam. Spasi Preservation Servlets menyediakan kontrol langsung terhadap panggilan ke objek PrintWriter bertanggung jawab untuk mengirimkan teks dalam tanggapan. JSP tidak. JSP abstrak panggilan ke PrintWriter keberatan dan memungkinkan untuk teks template yang harus ditulis seperti itu harus disajikan kepada client. Spasi, sementara biasanya tidak penting, yang diawetkan seperti yang muncul dalam JSP. Pelestarian ini dapat dilihat dengan melihat kode sumber HTML yang dihasilkan oleh JSP di salah satu contoh bab ini. Spasi pelestarian juga alasan beberapa tampaknya tidak akuntabel format disertakan dengan output JSP. Ambil, misalnya, JSP berikut (Listing 3-16) yang merupakan modifikasi dari HelloWorld.jsp. Listing 3-16 HelloDate.jsp <% @ Page import = "java.util.Date"%> <html> <head> <title> Hello World! </ title> </ Head> <body> <h1> Hello World! </ h1> Saat tanggal / waktu: <% = new Date ()%>. </ Body> </ Html> Simpan HelloDate.jsp di direktori dasar Aplikasi Web jspbook dan browse ke http://127.0.0.1/jspbook/HelloDate.jsp. Halaman yang terlihat sangat mirip dengan HelloWorld.jsp tapi sekarang termasuk kencan. Dalam rangka untuk mengimpor kelas java.util.Date, halaman direktif digunakan. Gambar 3-10 menunjukkan browser render hasil. Kode adalah dokumen HTML yang valid sempurna dan terlihat baik ketika diberikan sebagai HTML. Namun, Anda akan melihat bahwa format yang mengelilingi halaman direktif dipertahankan. Ada baris baru dibutuhkan dimana halaman direktif

149

digunakan. Ini dapat diverifikasi dengan melihat kode sumber HTML yang generated seperti yang disorot pada Listing 3-17. Listing 3-17 HelloDate.jsp HTML Kode Sumber Dikirim ke Browser <html> <head> <title> Hello World! </ title> </ Head> <body> <h1> Hello World! </ h1> Saat tanggal / waktu: Sun April 7 19:33:11 EDT 2002. </ Body> </ Html> Penting untuk memahami bahwa format dipertahankan oleh JSP. Dalam kebanyakan kasus, khususnya HTML, format spasi tambahan tidak masalah. Namun, ada situasi di mana spasi dan format tambahan lainnya adalah signifikancance, terutama jika menggunakan XML. Dalam kasus ini ada adalah memperbaiki mudah. Jangan gunakan format tambahan di sekitar elemen JSP. Selain membuat sesuatu yang sedikit lebih cantik, tidak ada kebutuhan untuk itu. Misalnya, HelloDate.jsp dapat menghapus yang tidak diperlukan spasi jika ditulis seperti ditunjukkan pada Listing 3-18. Listing 3-18 HelloDate.jsp Menghapus tidak dibutuhkan Spasi <% @ Page import = "java.util.Date"%> <html> <head> <title> Hello World! </ title> </ Head>

150

<body> <h1> Hello World! </ h1> Saat tanggal / waktu: <% = new Date ()%>. </ Body> </ Html> Atribut Ada dua metode untuk menentukan atribut dalam elemen JSP: nilai runtime dan waktu penerjemahan atau nilai statis. Sebuah nilai statis adalah nilai keras-kode yang diketik ke dalam JSP sebelum waktu penerjemahan. Ada banyak contoh dari nilai statis, ambil misalnya meliputi tindakan <jsp: include page = "header. jsp "/> Dalam contoh ini atribut halaman memiliki nilai statis header.jsp. Setiap. waktu JSP dikunjungi, tindakan termasuk mencoba untuk menyertakan file ini. Namun, tidak semua nilai atribut yang diperlukan untuk menjadi statis. Beberapa atribut dapat memiliki runtime nilai. Sebuah nilai runtime berarti ekspresi dapat digunakan untuk secara dinamis membuat nilai atribut. Dalam contoh sebelumnya dari tindakan termasuk, yang folmelenguh mungkin muncul: <Jsp: include page = "<% = request.getParameter ('file')%>" /> Dalam hal ini nilai adalah dinamis dan ditentukan pada runtime. Ini akan menjadi berguna jika ada kebutuhan untuk menyesuaikan halaman yang termasuk setiap kali JSP dikunjungi. Penggunaan yang paling dasar JSP tidak bergantung pada nilai-nilai runtime untuk atribut. Runtime nilai jauh lebih bermanfaat bila digunakan dengan JSP tindakan kustom dan akan lanjut dibahas dalam Bab 7 dengan tag kustom dan dalam Bab 6 dengan JTSL tersebut. Komentar JSP memungkinkan pengembang untuk memasukkan komentar sisi server yang benar-benar diabaikan ketika menghasilkan respon untuk mengirim ke klien. Fungsi ini sangat mirip dengan komentar HTML, namun, komentar JSP hanya tersedia untuk melihat pada sisi server. Sebuah komentar JSP harus memiliki awal, <% -, berakhir, -%>, dan komentar informasi antara. Komentar ini berguna untuk memberikan informasi server-side atau untuk "komentar keluar" bagian kode JSP. Listing 3 19 menunjukkan contoh dua komentar: satu untuk memberikan beberapa informasi dan lain untuk komentar sedikit kode. Listing 3-19 JSPComment.jsp <% @ Page import = "java.util.Date"%> <html>

151

<title> Server-side JSP Komentar </ title> <body> <% - Sebuah contoh sederhana dari komentar JSP -%> <% Kode berkomentar keluar pada <% = new Date ()%>. -%> </ Body> </ Html> Simpan JSPComment.jsp di direktori dasar Aplikasi Web jspbook dan browse ke http://127.0.0.1/jspbook/JSPCcomment.jsp. Halaman kosong adalah ditampilkan karena semua kode pada JSP adalah komentar. Setelah lebih ujianination dari kode sumber yang dihasilkan oleh JSP, dapat ditunjukkan bahwa tidak ada informasi yang berkomentar dikirim dalam isi respon (Listing 3-20). Listing 3-20 Output JSPComment.jsp <html> <title> Server-side JSP Komentar </ title> <body> </ Body> </ Html> Selain server-side komentar JSP, lebih banyak jenis komentar yang tersedia untuk digunakan. Dengan scriptlets dan deklarasi, kedua komentar Jawa tersedia untuk digunakan. Sebuah baris kode tertanam dapat berkomentar dengan menggunakan / /, atau serangkaian kode mungkin komentar dengan menggunakan blok komentar dengan mulai / * Dan akhir * /. HTML / XML komentar <! ----> Tidak mencegah teks dari yang dikirim oleh JSP. Komentar HTML / XML biasanya tidak mendapatkan diberikan oleh browser Web, tetapi informasi tersebut diteruskan ke sisi klien. Dengan mengubah JSPComment.jsp ke menggunakan komentar HTML / XML, output JSP jelas menggambarkan perbedaan (Listing 3-21). Listing 3-21 XMLComment.jsp <% @ Page import = "java.util.Date"%> <html> <title> Server-side JSP Komentar </ title> <body>

152

<-! Sebuah contoh sederhana dari komentar JSP -> <! Kode berkomentar keluar pada <% = new Date ()%>. -> </ Body> </ Html> Simpan XMLComment.jsp di direktori dasar Aplikasi Web jspbook dan browse ke http://127.0.0.1/jspbook/XMLComment.jsp. Sebuah browser Web masih menampilkan halaman kosong, tetapi hanya karena komentar HTML / XML diabaikan di sisi klien. Listing 3-22 menunjukkan output dari xmlcomment.jsp. Listing 3-22 Output xmlcomment.jsp <html> <title> Server-side JSP Komentar </ title> <body> <-! Sebuah contoh sederhana dari komentar JSP -> <! Kode berkomentar keluar pada Sun 10 Maret 20:23:01 EST 2002. -> </ Body> </ Html> Berbeda dengan JSPComment.jsp, XMLComment.jsp tidak mengirim komentar kepada klien untuk menangani. Selain elemen JSP termasuk dalam Komentar XML / HTML masih dievaluasi pada server-side. Contoh ini menunjukkan bahwa ketika serangkaian kode yang akan komentar, hal itu harus dilakukan dengan komentar JSP. Namun, jika komentar dikirim ke klien, maka HTMLgaya komentar dapat digunakan. Mengutip dan Karakter Luput Ketika authoring JSP, mungkin diinginkan untuk mengirim teks ke klien yang sama sebagian atau keseluruhan pada elemen JSP. Hal ini menghasilkan konflik dengan kode ini dimaksudkan tujuan dan bagaimana wadah akan menafsirkan kode. Untuk mewakili nilai literal elemen JSP, sebagian atau keseluruhan, karakter escape harus digunakan. JSP menggunakan karakter escape berikut ini: Sebuah single-kutipan literal, ', yang lolos sebagai \'. Ini hanya diperlukan seharusnya literal diperlukan di dalam delimited single-quote nilai atribut. JSP SYNTAX DAN SEMANTIK

153

A double-kutipan literal, ", yang lolos sebagai \". Ini hanya diperlukan seharusnya literal diperlukan di dalam delimited single-quote nilai atribut. Sebuah back-slash literal, \, yang lolos sebagai \ \. Sebuah%> yang lolos sebagai% \>. A <% yang lolos sebagai <\%. Entitas 'dan "tersedia untuk mewakili tunggal dan ganda kutipan, masing-masing. Contoh-contoh sebelumnya harus cukup jelas, tetapi berikut contoh singkat diberikan untuk kelengkapan. Kode pada Listing 3-23 menunjukkan bagaimana mengidentifikasi nilai melarikan diri bahwa kontainer JSP biasanya menafsirkan sebagai elemen. Listing 3-23 EscapeCharacters.jsp <% String copy = "2000-2003";%> <html> <title> Server-side JSP Komentar </ title> <body> Scriptlets: <\% <i> Script </ i>%> <br> Ekspresi: <\% = <i> skrip </ i>%> <br> Deklarasi: <\%! <i> Script </ i>%> <br> <center> <small> Copyright <% = Copy + "Single-Quote/Double-Quote Ltd, </ Small> </ Center> </ Body> </ Html> \ '/ \ ""%> Simpan EscapeCharacters.jsp di direktori dasar Web jspbook Aplikasi dan browse ke http://127.0.0.1/jspbook/EscapeCharacters.jsp. Halaman kecil muncul dengan penjelasan singkat dari beberapa elemen JSP. Gambar 3-11 menunjukkan browser rendering output dari JSP. Nilai-nilai literal adalah benar terbukti klien bukannya disalahartikan oleh wadah JSP. Objek Implisit JSP menggunakan elemen scripting sebagai metode yang mudah kode embedding dalam temteks piring, tapi kami belum menunjukkan bagaimana untuk secara langsung memanipulasi permintaan, respon, sesi, atau benda lain yang digunakan dengan Servlets dalam Bab 2. Benda-benda ini semua masih eksis dengan JSP dan tersedia sebagai obyek implisit. Obyek implisit JSP

154

secara otomatis dideklarasikan oleh wadah JSP dan selalu tersedia untuk digunakan oleh scripting elemen. Berikut ini adalah daftar obyek implisit JSP yang recognizable dari Bab 2. config config ServletConfig objek. objek implisit adalah sebuah contoh dari sebuah javax.servlet. Sama seperti dengan Servlets, JSP dapat mengambil keuntungan dari awal parameter yang disediakan dalam Aplikasi Web Deployment Descriptor. Itu Tujuan implisit permintaan adalah contoh dari javax.servlet.http. Objek HttpServletRequest. Obyek implisit permintaan mewakili klien permintaan dan merupakan referensi ke objek HttpServletRequest dilewatkan ke dalam Metode layanan yang sesuai HttpServlet itu. Tanggapan objek implisit adalah sebuah contoh dari sebuah javax.servlet. objek http.HttpServletRequest. Tanggapan objek implisit merupakan Menanggapi respon klien dan merupakan acuan untuk HttpServlet yang Objek Respon dilewatkan ke metode layanan yang sesuai dengan HttpServlet ini. meminta tanggapan Itu Sesi objek implisit adalah sebuah contoh dari sebuah javax.servlet.http. Objek HttpSession. Secara default JSP menciptakan konteks menjaga sesi dengan semua klien. Sesi objek implisit adalah obyek kemudahan untuk digunakan dalam elemen scripting dan adalah setara dengan memanggil getSession HttpServletRequest () objek. objek implisit adalah sebuah contoh dari sebuah javax. Aplikasi objek implisit merupakan Pandangan servlet dari Aplikasi Web dan setara dengan memanggil Servlet Config getServletContext () metode. aplikasi objek servlet.ServletContext. sidang aplikasi tu

155

OBJEK IMPLISIT Menggunakan salah satu objek implisit JSP semudah asumsi mereka sudah ada dalam elemen scripting. Dengan objek yang tercantum sebelumnya, semua Servlet contoh dalam bab-bab sebelumnya dapat direplikasi dalam JSP. Ambil, misalnya, ShowHeaders Servlet (Listing 2-8 di Bab 2). The ShowHeaders Servlet dismemainkan halaman HTML kecil yang berisi daftar semua header permintaan HTTP yang dikirim oleh klien. Servlet mengandalkan getHeaderNames HttpServletRequest () dan Header () metode. Setelah menerjemahkan Servlet ini menjadi sebuah JSP, kode muncul sebagai Listing 3-24. Listing 3-24 ShowHeaders.jsp <% @ Page import = "java.util *."%> <html> <head> <title> Permintaan HTTP Header </ title> </ Head> <body> <p> HTTP header dikirim oleh klien Anda: </ p> <% Pencacahan enum = request.getHeaderNames (); sementara (enum.hasMoreElements ()) { String headerName = (String) enum.nextElement (); String headerValue = request.getHeader (headerName); %> <b> <% = headerName%> </ b>: <% = headerValue%> <br> <%}%> </ Body> </ Html> Simpan kode sebelumnya sebagai ShowHeaders.jsp di direktori dasar jspbook Web Application dan browse ke http://127.0.0.1/jspbook/Show Headers.jsp. Hasilnya identik dengan Servlet sebelumnya di http://127.0. 0.1/jspbook/ShowHeaders. Gambar 3-12 menunjukkan apa output dari ShowHeaders. jsp tampak seperti ketika diberikan oleh browser Web. Mengulangi contoh kode Servlet dan menerjemahkannya ke dalam JSP bukanlah tujuan bab ini. Contoh sebelumnya dimaksudkan untuk menunjukkan dengan jelas bagaimana menggunakan objek implisit dan bagaimana mereka dapat digunakan untuk mencapai semua fungsi dari Servlet. Scriptlets dalam JSP sebelumnya menunjukkan ini dengan menggunakan permintaan objek implisit seolah-olah itu sebelumnya telah dinyatakan oleh JSP.

15 6

<% Pencacahan enum = request.getHeaderNames (); sementara (enum.hasMoreElements ()) { String headerName = (String) enum.nextElement (); String headerValue = request.getHeader (headerName); %> Penting untuk dicatat bahwa tidak ada tempat itu sebuah benda bernama permintaan menyatakan untuk digunakan oleh JSP. Itu hanya digunakan. JSP kontainer secara otomatis dan appropriately menyatakan objek implisit ketika menerjemahkan ke dalam JSP Servlet. JSP mendefinisikan objek yang lebih implisit beberapa untuk menemani tersebut. Yang tidak terdaftar tidak langsung peta ke setara Servlet. Tambahan objek implisit adalah pageContext, halaman, keluar, dan pengecualian, yang semuanya dijelaskan dalam bagian berikut. pageContext The pageContext variabel scripting implisit adalah sebuah contoh dari sebuah javax.servlet. objek jsp.PageContext. Sebuah benda PageContext merupakan konteks tunggal JavaServer Halaman termasuk semua benda implisit lainnya, metode untuk forwarding dengan dan termasuk sumber daya Web Application, dan ruang untuk benda mengikat halaman. Obyek PageContext tidak selalu membantu ketika digunakan dengan sendirinya karena objek implisit lainnya sudah tersedia untuk digunakan. A PageContext

157

objek terutama digunakan sebagai objek tunggal yang mudah dapat dikirimkan ke objek lain seperti tindakan kustom. Hal ini berguna karena konteks halaman memegang referensi untuk obyek implisit lainnya. Permintaan Delegasi The pageContext objek implisit memberikan setara dengan include dan meneruskan arahan untuk menyediakan JSP delegasi permintaan. Scriptlets dapat menggunakan folmelenguh metode PageContext untuk menyediakan JSP delegasi permintaan: maju (relativeUrlPath java.lang.String) redirect, atau 'maju', arus ke sumber lain di Web Aplikasi. Nilai relativeUrlPath adalah path relatif terhadap sumber daya di Web Aplikasi: termasuk (relativeUrlPath java.lang.String) metode forward () digunakan untuk ServletRequest dan ServletResponse Itu Metode include () menyebabkan sumber daya yang ditentukan untuk diproses sebagai bagian dari ServletRequest saat ini dan ServletResponse sedang diproses. Pemain depan () dan include () metode dapat digunakan untuk memasukkan atau meneruskan ServletRequest dan ServletResponse untuk sumber daya apapun dalam Aplikasi Web. Sumber daya dapat menjadi Servlet, JSP, atau sumber daya statis. Fungsi tersebut adalah iDENvertikal dengan yang sebelumnya disebutkan untuk Servlet delegasi permintaan. Halaman Lingkup Selain permintaan, sesi, dan lingkup aplikasi, JSP memperkenalkan halaman lingkup. Obyek PageContext menyediakan getAttribute (), setAttribute (), dan removeAttribute () metode untuk benda mengikat ke halaman saat ini. Objects terikat dalam lingkup halaman hanya ada selama halaman saat ini. Lingkup halaman objek tidak dibagi di beberapa JSP, dan ruang lingkup halaman ini ditujukan hanya untuk melewati objek antara tindakan kustom dan elemen scripting. Bila menggunakan JSP untuk JSP komunikasi, ruang lingkup permintaan masih lingkup yang tepat untuk digunakan. di luar Tujuan implisit keluar adalah turunan dari objek javax.servlet.jsp.JspWriter dan digunakan untuk mengirim konten dalam tanggapan. Obyek JspWriter mengemulasi beberapa dari fungsi yang ditemukan di java.io.PrintWriter dan java.io.Buffered Objek penulis untuk menyediakan metode yang nyaman menulis teks dalam buffer

159

fashion. Obyek keluar implisit dapat dikonfigurasi berdasarkan per JSP dengan halaman direktif. Buffering Obyek JspWriter awal dikaitkan dengan objek PrintWriter dari ServletResponse dengan cara yang tergantung pada apakah halaman tersebut atau tidak buffered. Jika halaman tidak buffered, keluaran ditulis ke obyek JspWriter akan ditulis melalui ke PrintWriter langsung. Tetapi jika halaman buffered, PrintWriter objek tidak akan dibuat sampai buffer memerah, berarti operasi seperti setContentType () adalah legal sampai buffer akan memerah. Karena fleksibilitas ini menyederhanakan pemrograman substansial, penyangga adalah default untuk halaman JSP. Dengan menggunakan penyangga, masalah ini diajukan tentang apa yang terjadi ketika buffer terlampaui. Dua kemungkinan ada: Siram Buffer Salah satu pilihan mudah adalah dengan hanya flush buffer sekali sudah penuh. Konten yang biasanya akan buffer overflow sekarang tidak akan karena buffer menulis konten ekstra untuk klien. Kelemahan dari pendekatan ini adalah bahwa HTTP header tidak dapat diubah setelah konten telah dikirim ke klien. Header selalu muncul di awal respon HTTP sehingga mereka harus diselesaikan sebelum konten memerah oleh buffer. Melempar Exception Flushing buffer bukan pendekatan yang baik ketika ketat Kontrol perlu disimpan lebih bila konten dikirim ke klien. Dalam kasus seperti ini, melebihi buffer adalah kesalahan fatal. Melakukannya dapat menyebabkan pengecualian untuk dilempar. Kedua pendekatan adalah valid, dan dengan demikian keduanya didukung oleh JSP. Itu perilaku halaman dikendalikan oleh atribut autoflush, yang defaultnya benar. Secara umum, JSP yang perlu untuk memastikan data yang benar dan lengkap telah dikirim ke klien mereka mungkin ingin mengatur autoflush ke false. Di sisi lain, JSP yang tidak memerlukan kontrol yang ketat dapat meninggalkan atribut autoflush sebagai benar, yang umumnya terjadi ketika mengirim HTML ke browser. Kedua jenis menggunakan penyangga yang paling cocok untuk kebutuhan yang berbeda dan harus dipertimbangkan pada per menggunakan dasar. JspWriter dan Respon Pengecualian Committed Sebuah kesalahan terlalu umum dan disalahpahami saat menggunakan JSP adalah IllegalStateException terkecuali dengan "respon sudah berkomitmen" diberikan sebagai pesan pengecualian itu. Kesalahan ini muncul setelah JspWriter yang telah mengirimkan beberapa information ke klien dan JSP mencoba untuk melakukan sesuatu dengan asumsi tidak ada konten telah

160

dikirim. Menghindari pengecualian ini mudah dilakukan tetapi membutuhkan bahwa ketika pengembang program, ia sadar bagaimana objek JspWriter bekerja. The folmelenguh merupakan dua tersangka utama pengecualian tersebut. Memanipulasi Header Dengan JSP, manipulasi respon HTTP header hanya diperbolehkan sebelum konten yang sebenarnya dari respon dikirim. Ketika diutarakan seperti ini, harus tampak cukup intuitif, tetapi terlalu sering pengembang JSP akan bertanya mengapa IllegalStateException dilemparkan ketika mereka berubah informasi header. Sebuah mudah untuk memperbaiki masalah ini adalah baik untuk meningkatkan buffer ukuran dengan meningkatkan nilai dari halaman direktif penyangga atribut atau hanya memindahkan kode bermasalah ke atas JSP. Memindahkan kode header-berubah sebelum kode konten yang menghasilkan biasanya memastikan tidak ada konflik penyangga ketika mengedit header HTTP informasi. Forwarding Ketika forwarding antara JSP, kontrol penuh dari Servlet Permintaan dan ServletResponse objek diberikan kepada diteruskan JSP. Hal ini memungkinkan untuk halaman diteruskan untuk memiliki kontrol penuh atas menghasilkan sesuai respon. Tidak seperti Servlets, JSP otomatis panggilan tersebut HttpServletRequest Metode getWriter () untuk mendapatkan obyek yang cocok untuk menulis informasi ke klien. Forwarding antara dua JSP memastikan memanggil metode ini dua kali, yang dalam Servlet normal akan melemparkan sebuah pengecualian. Namun, JSP tikungan aturan ini sedikit dengan mengambil keuntungan dari buffer JspWriter. Haruskah JSP meneruskan permintaan untuk JSP lain setelah konten telah dikirim ke buffer tapi sebelum respon memiliki telah berkomitmen untuk klien, maka semuanya baik-baik saja. Data buffer hanya dibuang dan JSP baru bebas dapat membuat respon terhadap klien. Haruskah JSP melakukan respon terhadap klien dan kemudian meneruskan permintaan ke JSP berbeda, pengecualian terjadi. Melakukan respon dan kemudian meneruskan permintaan selalu melempar IllegalStateException. Masalah ini dapat diselesaikan dengan baik, termasuk semua informasi dalam satu JSP, tidak melakukan respon, atau termasuk yang diinginkan JSP daripada forwarding untuk itu. Inklusi menggunakan kembali objek JspWriter dari Halaman melakukan termasuk. Memahami dan menghindari atas dua masalah. Samar Kesalahan umum tulah baru JSP pengembang. Pemecahan masalah mudah jika objek JspWriter dan penyangga terkait dipahami dengan benar. config Skema penyebaran JSP biasa dilakukan secara otomatis oleh wadah bekerja, tapi tidak menghentikan pengembang JSP untuk mendeklarasikan dan pemetaan JSP melalui Web

161

Aplikasi Deployment Descriptor, web.xml. Sebuah JSP dapat digunakan secara manual di cara yang sama seperti Servlet dengan membuat deklarasi di web.xml Servlet dan menggantikan elemen servlet kelas dengan elemen jsp halaman. Setelah menyatakan, JSP dapat dipetakan ke sama tunggal atau set URL sebagai Servlet. Sebagai contoh, jika itu diperlukan untuk menghapus ShowHeaders Servlet dan Peta ShowHeaders.jsp ke ShowHeaders path / di samping otomatis didefinisikan / path ShowHeaders.jsp, tugas dapat dicapai dengan folmelenguh entri dalam web.xml. <servlet> <servlet-name> ShowHeaders </ servlet-name> <jsp-file> / ShowHeaders.jsp </ jsp-berkas> </ Servlet> <servlet-mapping> <servlet-name> ShowHeaders </ servlet-name> <url-pattern> / ShowHeaders </ url-pattern> </ Servlet-mapping> Satu-satunya perubahan adalah mengganti baris sebelumnya, <servlet-class> com. jspbook.ShowHeaders </ servlet-class>, dengan elemen jsp-berkas dan lokasi JSP. Konfigurasi Parameter Awal Melalui penggunaan elemen jsp-berkas, JSP dapat dipetakan menggunakan entri kustom di web.xml. Semua elemen anak dari elemen servlet masih berlaku, dan parameter awal dapat didefinisikan. Dalam Bab 2 yang InternationalizedHelloDunia Servlet, Listing 2-3, digunakan untuk menunjukkan fungsi awal parameter. Listing 3-25 adalah pengulangan cepat contoh, tapi dalam bentuk JSP. Listing 3-25 InternationalizedHelloWorld.jsp <html> <head> <title> Hello World! </ title> </ Head> <body> <h1> <% = config.getInitParameter ("ucapan")%> </ h1> </ Body> </ Html> Kode ini tidak ada yang spektakuler. Yang penting untuk diperhatikan adalah JSP mengandalkan pada parameter awal bernama "ucapan". Tanpa parameter awal, JSP

162

tidak akan berfungsi dengan benar, tetapi wadah akan secara otomatis menyebarkan halaman bagaimanapun. Simpan kode sebagai InternationalizedHelloWorld.jsp di dasar direktori dari jspbook Aplikasi Web dan browse ke http://127.0.0.1/ jspbook / InternationalizedHelloWorld.jsp. Sebuah halaman akan muncul yang mengatakan "nol". Gambar 3-13 menunjukkan browser rendering output. Secara default JSP tidak memiliki parameter awal, dan wadah JSP tidak memvalidasi bahwa parameter awal adalah didefinisikan dengan baik sebelum menjalankan sebuah JSP. Hasilnya adalah contoh HelloWorld yang mengatakan apa-apa. Untuk memperbaiki JSP, entri dalam kebutuhan web.xml dibuat sehingga "ucapan" awal Parameter dapat didefinisikan. Tambahkan elemen berikut untuk web.xml. <servlet> <servlet-name> InternationalizedHelloWorldJSP </ servlet-name> <jsp-file> / InternationalizedHelloWorld.jsp </ jsp-berkas> <init-param> <param-name> ucapan </ param-name> <param-value> Bonjour! </ param-value> </ Init-param> </ Servlet> <servlet-mapping> <servlet-name> InternationalizedHelloWorldJSP </ servlet-name> <url-pattern> / InternationalizedHelloWorld.jsp </ url-pattern> </ Servlet-mapping> Unsur servlet mendefinisikan penyebaran Servlet untuk Servlet dihasilkan dari InternationalizedHelloWorld.jsp, dan unsur servlet-mapping memetakan pola URL / InternationalizedHelloWorld.jsp ke JSP. Dalam elemen servlet, yang dibutuhkan "ucapan" parameter awal diberikan untuk membuat JSP menampilkan "Hello World" pesan. Reload jspbook Aplikasi Web dan

163

menelusuri kembali ke http://127.0.0.1/jspbook/InternationalizedHelloWorld. jsp. Kali ini JSP menampilkan halo pesan yang sesuai. Gambar 3-14 menunjukkan rendering browser output. halaman Halaman objek implisit merupakan implementasi kelas saat halaman sedang dievaluasi. Jika bahasa scripting halaman adalah java, yang secara default adalah, obyek halaman setara dengan kata kunci ini dari kelas Java. JSP dalam XML Sintaks JSP datang dalam dua varietas yang berbeda dari sintaks. Asli, atau klasik, JSP menggunakan bebas-bentuk sintaks. Dengan JSP 1.2, bentuk lain XML-compliant sintaks JSP, JSP Dokumen, diperkenalkan. Kedua sintaks menyediakan fungsi yang sama dan memanfaatkan semua fitur JSP. Alasannya sintaks kedua adalah introdiproduksi adalah untuk menjaga JSP saat ini dengan adopsi XML. XMLcompliant JSP dapat dibuat dan dimanipulasi menggunakan alat XML yang ada. Klasik JSP membutuhkan parser khusus dibangun untuk secara khusus memahami sintaks unik JSP. Sejak diperkenalkannya XML-compliant JSP, tidak ada yang signifikan bergerak di komunitas JSP arah mendukung sintaks baru. Mayoritas JSP pengembang, buku, dan alat-alat sebagian besar masih menggunakan JSP klasik. Alasan untuk ini yang sebagian disebabkan oleh kenyataan bahwa dokumen JSP baru, tetapi terutama terkait dengan fakta bahwa sintaks XML JSP tidak mudah digunakan. Dalam beberapa hal rilis pertama dari sintaks XML JSP sangat setengah matang dengan cara yang aneh. Hal ini terlalu ketat. Sintaks JSP DI XML Sintaks

164

tidak kekurangan kepatuhan terhadap aturan XML, juga tidak kekurangan fungsionalitas. Hal ini hanya terlalu membatasi dan samar untuk rata-rata pengembang JSP untuk digunakan. Cara terbaik untuk menggambarkan cacat asli dalam sintaks XML JSP adalah dengan menunjukkan contoh kecil. Halaman ini adalah versi sederhana dari apa yang dapat diharapkan untuk dilihat di sebagian besar JSP. Listing 3-26 adalah versi halaman dalam sintaks JSP klasik. Listing 3-26 ClassicJSP.jsp <html> <head> <title> A Simple Page di Klasik JSP </ title> </ Head> <body> <h1> Sebuah Judul </ h1> <% String teks = "<b> teks tebal </ b>"; Link String = "http://www.jspbook.com"; if (benar) {%> Berikut adalah teks tebal: <% = text%> <br> <%}%> Sebuah link ke <a href = "<% = link%>"> situs </ a>. </ Body> </ Html> Semuanya di atas harus dikenali. Ini adalah halaman yang menggunakan beberapa scriptlets dan ekspresi. Listing 3-27 menunjukkan kode yang sama dalam Dokumen JSP. Listing 3-27 JSPDocument.jsp <? Versi xml = "1.0"?> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"> <html> <head> <title> A Simple Page dalam XML Kompatibel JSP </ title> </ Head> <body> <h1> Sebuah Judul </ h1> <jsp:scriptlet> String teks = "<b> teks tebal </ b>"; Link String = "http://www.jspbook.com"; if (benar) { </ Jsp: scriptlet> Berikut adalah teks tebal: <jsp:expression> teks </ jsp: ekspresi> <! [CDATA [Close]]> <jsp:scriptlet>} </ jsp: scriptlet> <! [CDATA [A link ke <a href="]]> 165

<jsp:expression> Link </ jsp: ekspresi> <! [CDATA ["> situs </ a>.]]> </ Body> </ Html> </ Jsp: root> Poin pertama yang perlu diperhatikan adalah bahwa halaman akan lebih besar. Hal ini selalu di bawah umur kelemahan menggunakan bentuk XML. Sedikit inefisiensi ruang dibayar untuk kepatuhan terhadap aturan penataan dokumen XML. Ruang itu sendiri bukan dari keprihatinan dalam kasus ini, tapi apa yang harus menjadi perhatian adalah bahwa JSP tidak bisa lagi gunakan formulir-teks bebas. JSP scripting elemen harus diperluas ke dalam tag penuh, dan HTML patuh harus dikelilingi oleh sintaks XML khusus, <! [CDATA []]>. Ini membosankan untuk penulis dan membuat halaman sulit untuk mempertahankan tanpa membaca dan menulis XML khusus alat. JSP Dokumen tidak semuanya buruk. Ide di belakang mereka adalah satu yang baik. XML, bila digunakan sebagaimana dimaksud, dapat menjadi hal yang sangat membantu. Kustom dokumen XML dapat menjadi sangat mudah dipahami dan mudah dimanipulasi oleh banyak XML alat yang saat ini ada. Satu-satunya kelemahan adalah bahwa HTML tidak XML. JSP sebagian besar dipromosikan sebagai alat yang membuat generasi HTML yang dinamis mudah. Ini bukan pembatasan JSP, tetapi ini bisa dibilang yang paling umum dari teknologi. Pertanyaan yang harus dijawab adalah, "Sampai sejauh mana kompatibilitas XML dibutuhkan Anda kode? "Jika JSP perlu dimanipulasi dengan mudah oleh kode lain, maka XML adalah baik pilihan. Pertanyaan lain untuk bertanya adalah, "Apakah Anda hanya menggunakan JSP untuk menyederhanakan menciptakan dinamis HTML? "Jika demikian, maka itu adalah pilihan yang lebih baik untuk menggunakan sintaks JSP asli. Dalam versi sebelumnya JSP, mayoritas pengguna diarahkan menggunakan JSP untuk membuat HTML yang dinamis. Hal ini terutama disebabkan oleh kenyataan bahwa HTML memiliki menjadi teknologi dominan di Web, dan ini menjelaskan mengapa sangat banyak JSP awalnya diciptakan untuk menyederhanakan tugas menciptakan itu. Namun, HTML tidak lagi teknologi yang paling populer digunakan. XML, meskipun tidak sempurna, cukup mengisi kekurangan dari banyak teknologi, termasuk HTML, dan telah memperoleh besar momentum, yang ditunjukkan oleh penggunaan industri-lebar. Saat ini, salah satu yang terbaik pendekatan untuk mengelola konten adalah baik menyimpannya atau berkomunikasi melalui XML.

166

Menggunakan XML untuk tujuan ini memungkinkan informasi untuk dengan mudah dibagi dan mainverifikasi dipelihara dengan cara yang bermanfaat. Karena fleksibilitas besar ini, tren memiliki berkunjung ke menjauh dari teknologi yang lebih terbatas, seperti HTML, dan arah XML. JSP mencerminkan perubahan ini karena terlalu telah berubah untuk lebih menggabungkan XML untuk digunakan dalam J2EE Web Tier. Memahami dokumen JSP adalah penting. Penggunaan XML hanya akan terus tumbuh di masa depan, dan itu penting untuk memahami apa yang fleksibilitas JSP memiliki untuk berinteraksi dengan itu. Memahami bagaimana penulis dokumen JSP juga mudah JSP DI XML Sintaks Selama Anda memahami aturan konversi sederhana antara klasik dan JSP JSP dalam sintaks XML. Aturan XML Aturan XML cukup permainan kata. XML tidak aturan sebagai teknologi untuk authoring dan berbagi informasi di internet, tapi XML memiliki beberapa aturan penting seseorang harus mengikuti ketika menggunakannya. JSP Dokumen secara otomatis mewarisi aturan-aturan ini. Tidak banyak gunanya untuk langsung menjelaskan JSP dalam sintaks XML jika sintaks XML reguler tidak dipahami. Namun, buku ini bukan tentang XML. Ini adalah tentang JSP dan Servlets. Sebuah tutorial lengkap tentang XML tidak diberikan dalam buku ini. Hanya dasardasar menjelaskan untuk membantu melewati sebagian besar JSP dalam XML sintaks kasus digunakan. Jika Anda berencana ekstensif menggunakan XML dengan JSP dan belum tahu banyak tentang XML, buku ini bukan pengganti untuk panduan XML. Untuk menemani ini teks, baik membaca spesifikasi XML, http://www.w3.org/ XML, atau mengambil sebuah buku yang bagus pada XML. JSP Dokumen Selain memahami aturan XML yang diperlukan untuk penulis JSP dalam sintaks XML, hanya ada konversi sederhana antara JSP reguler dan JSP Documents. Tidak semua potongan sintaks JSP reguler dalam bentuk XML-kompatibel. JSP tindakan dan tindakan kustom sudah dalam sintaks XML-kompatibel. Mereka digunakan identik dalam Dokumen JSP seperti yang digunakan dalam JSP biasa. Sisa JSP, yaitu elemen scripting dan arahan, harus dikonversi ke bentuk XML. JSP Deklarasi Dokumen JSP Dokumen harus benar-benar dikemas oleh akar elemen XML, root. Unsur ini perlu juga memiliki namespace JSP, jsp, pra-ditambahkan bersama dengan deklarasi namespace. Secara umum, Dokumen JSP selalu menyerupai Listing 3-28.

167

Listing 3-28 Deklarasi Dokumen JSP <? Versi xml = "1.0"?> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"> / / JSP isi Dokumen </ Jsp: root> Isi dikemas oleh Dokumen JSP adalah isi dari JSP.

Scripting Elements Semua elemen scripting harus dikonversi untuk digunakan dalam Dokumen JSP. Itu scripting elemen sintaks klasik JSP menggunakan secara langsung bertentangan dengan sintaks XML. Alih-alih menggunakan <%%>, <% =%>, dan <%! %>, Untuk scriptlets, ekspresi, dan declaransum, gunakan <jsp:scriptlet> </ jsp: scriptlet>, <jsp:expression> </ jsp: ekspresi>, dan <jsp:declaration> </ jsp: deklarasi>, masing-masing. Konversi ini dalam banyak kasus cukup sederhana. Lihat kembali ke klasik pertama JSP JSP vs Dokumen contoh, Daftar 3-25 dan Pencatatan 3-26. Berikut ini adalah bagian dari kode dari contoh JSP klasik yang menggunakan scriptlets dan ekspresiaksesi. <% String teks = "<b> teks tebal </ b>"; Link String = "http://www.jspbook.com"; if (benar) {%> Berikut adalah teks tebal: <% = text%> <br> <%}%> Sebuah link ke <a href = "<% = link%>"> situs </ a>. Disorot adalah scriptlets dan ekspresi. Konversi ke JSP dalam XML sintaks adalah sebagai berikut: <jsp:scriptlet> String teks = "<b> teks tebal </ b>"; Link String = "http://www.jspbook.com"; if (benar) { </ Jsp: scriptlet> Berikut adalah teks tebal: <jsp:expression> teks </ jsp: ekspresi> <! [CDATA [Close]]> <jsp:scriptlet>} </ jsp: scriptlet> <! [CDATA [A link ke <a href="]]> <jsp:expression> Link </ jsp: ekspresi> <! [CDATA ["> situs </ a>.]]>

168

Perubahan langsung dari elemen scripting klasik untuk JSP Dokumen setara harus mudah dilihat. Setiap teks pencarian dan alat ganti dapat dengan mudah menyelesaikan pekerjaan. Yang lebih sulit adalah memeriksa untuk memastikan hasil konversi dalam dokumen XML yang valid. Dalam sebelum kasus, ternyata tidak. Contoh khusus termasuk salah satu dari kesalahan yang paling umum yang terjadi ketika menggunakan JSP Documents. Dalam klasik JSP, itu adalah hal yang sah untuk menggunakan ekspresi atau scriptlet tepat di tengah-tengah teks Template: Sebuah link ke <a href = "<% = link%>"> situs </ a>. JSP DI XML Sintaks

Dalam konversi sepele untuk Dokumen JSP, ini awalnya menjadi folmelenguh: Sebuah link ke <a href = " <jsp:expression> Link </ jsp: ekspresi> "> Situs </ a>. Namun, kode di atas tidak XML karena dokumen tidak lagi baik terbentuk. Template teks itu diperlakukan sebagai XML. Menanamkan sebuah ekspresi tag untuk nilai atribut tidak diperbolehkan. Untuk mengatasi masalah ini, konversi memiliki juga termasuk enkapsulasi tertentu dari teks template yang dengan XML CDATA sections atau mewakili isi bermasalah dengan entitas. <! [CDATA [A link ke <a href="]]> <jsp:expression> Link </ jsp: ekspresi> <! [CDATA ["> situs </ a>.]]> bagian yang digunakan dalam potongan sebelumnya. Ini adalah pilihan pribadi preferensi memilih untuk menggunakan CDATA bagian atau entitas saat menangani menyinggung kode. Intinya adalah, bahwa mengkonversi lurus antara <%%> dan <jsp:scriptlet> </ Jsp: scriptlet> sepele. Yang paling penting adalah memastikan baik-formed Dokumen XML dibuat. Jika tidak, ganti kode menyinggung dengan entitas atau CDATA bagian. CDATA Direktif Ingat bahwa arahan JSP selalu mengikuti format <% @ direktif {atribut = "Value"} *%>, di mana direktif nama direktif dan atribut adalah seperangkat atribut dengan nilai-nilai tertentu. Seperti elemen scripting, sintaks ini tidak mematuhi XML dan kebutuhan yang akan dikonversi. Tidak seperti elemen scripting conversi selalu sepele. JSP Dokumen menggunakan perintah yang sama seperti klasik JSP tapi dengan sintaks berikut: <jsp: directive.directive {atribut = "nilai"} * />. Konversi ini hanya swap lurus dan termasuk direktif yang sama dan nilai atribut. 169

Untuk kejelasan, Listing 3-29 menunjukkan contoh singkat dari JSP dalam sintaks klasik, yang menggunakan halaman dan termasuk direktif. Listing 3-29 JSPDocumentDirectives.jsp <% @ Page errorPage = "ErrorPage.jsp"%> <% @ Include file = "header.jsp"%> <h1> Sebuah Judul </ h1> <p> Beberapa teks </ p>. <% @ Include file = "footer.jsp"%> Konversi kode sebelumnya dengan sintaks XML semudah melakukan langsung penggantian arahan. Secara umum, ini akan selalu menjadi kasus dengan direcRakyat (Listing 3-30). Listing 3-30 JSPDirectives.jsp <? Versi xml = "1.0"?> <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"> <jsp:directive.page errorPage="ErrorPage.jsp"/> <jsp:directive.include file="header.jsp"/> <h1> Sebuah Judul </ h1> <p> Beberapa teks </ p>. <jsp:directive.include file="footer.jsp"/> </ Jsp: root> Encapsulating Text Template Salah satu persyaratan unaccountably konyol yang asli JSP dalam XML sintaks adalah dengan mewajibkan Dokumen JSP mengelilingi teks Template dengan <jsp:text> elemen. Tidak ada persyaratan XML mandat ini. Persyaratan ini adalah dimaksudkan untuk menjadi sebuah fitur untuk membantu parser JSP tapi sangat mempersulit authoring teks template Dokumen JSP.

170

Ringkasan
Bab ini merupakan pengantar untuk JavaServer Pages (JSP). JSP merupakan pelengkap teknologi untuk Servlets yang menyediakan cara yang sangat efisien untuk mengembangkan teks penghasil Servlet. Tidak seperti Servlets, JSP tidak ditulis dalam Java 2-compliant sintaks, tapi JSP diterjemahkan ke dan dikelola oleh sebuah wadah yang sama seperti Servlet. Setelah authoring JSP, tidak perlu secara manual menyebarkan JSP ke URL ekstensi via web.xml. Sebuah wadah otomatis menyebarkan JSP, tapi web.xml entri masih dapat digunakan untuk memberikan parameter awal atau ekstensi URL acak untuk JSP. Sebuah JSP dibagi menjadi dua bagian utama: teks Template dan elemen dinamis. Teks Template terdiri dari segala sesuatu yang biasanya akan muncul di cetak () atau println () panggilan dari Servlet. Unsur dinamis bit khusus sintaks didefinisikan oleh spesifikasi JSP. Sebuah unsur dinamis tidak ditangani secara langsung sebagai teks tetapi bukan dievaluasi oleh sebuah wadah untuk melakukan beberapa fungsionalitas kustom. Elemen JSP dipecah menjadi tiga kategori utama: scripting eleKASIH, arahan, dan tindakan. Elemen Scripting adalah metode langsung melekatkan kode antara teks Template. Direktif adalah metode pemberian JSP informasi konfigurasi kontainer saat penerjemahan. Tindakan yang digunakan untuk menghubungkan Tag XML-kompatibel untuk kode kustom yang tidak termasuk dalam JSP. JSP Spesifikasi mendefinisikan tindakan bawaan beberapa, tapi ada juga ada sebuah metode untuk kode kustom mengikat tindakan kustom. Tindakan kustom adalah salah satu yang lebih fitur canggih dari JSP dan yang tersisa untuk cakupan penuh dalam Bab 7. Ada dua gaya sintaks yang berbeda tersedia untuk authoring JSP. Yang pertama adalah sintaks JSP klasik dan telah tersedia sejak rilis asli JSP. Ini sintaks klasik adalah apa yang mayoritas buku ini menggunakan dan apa yang umumnya dianggap sintaks termudah untuk penulis JSP. Alternatif sintaks JSP tersedia untuk situasi di mana akan sangat membantu untuk memiliki JSP harus ditulis sebagai XMLcompliant dokumen. Kedua gaya sintaks menyediakan fungsi yang sama. Konversi antara dua jenis sintaks JSP biasanya tugas sepele.

171

You might also like