Panggil kaedah JavaBean dari halaman JSP 2.0

Versi JavaServer Pages (JSP) baru menggabungkan bahasa ekspresi (EL) yang diperkenalkan oleh JSP Standard Tag Library (JSTL) untuk memungkinkan pereka Web menghasilkan halaman JSP tanpa skrip yang tidak mengandungi kod Java. Oleh kerana JSP 2.0 memberikan keserasian ke belakang untuk JSP 1.x, Anda mungkin masih menyertakan potongan Java di halaman anda, tetapi pengendali tag dan komponen JavaBean adalah tempat yang lebih baik untuk fungsi berasaskan Java.

JSP 2.0 menyediakan ciri baru untuk pengendali tag seperti atribut dinamik, Protokol Permintaan Mudah, dan .tagfail. Anda masih menggunakan tindakan standar JSP 1.0 lama untuk membuat instance JavaBean dan menetapkan sifatnya, tetapi sekarang anda dapat mengakses sifat kacang, parameter permintaan, dan atribut / pemboleh ubah JSP dengan bahasa ekspresi baru.

Semua peningkatan teknologi JSP ini membolehkan anda mencapai matlamat untuk memisahkan markup JSP / HTML dari kod Java. Namun, satu perkara hilang. JSP 2.0 tidak mempunyai sintaks untuk memanggil kaedah JavaBean yang tidak statik awam dari halaman JSP tanpa skrip. Artikel ini menyelesaikan masalah itu dengan memberikan teg sederhana JSP 2.0 dengan atribut dinamik.

Catatan: Anda boleh memuat turun kod sumber artikel ini dari Sumber.

Bahasa ekspresi diperlukan

Katakan anda mempunyai java.util.Listcontoh yang mesti anda tunjukkan sebagai senarai HTML. Berikut adalah penyelesaian pantas berdasarkan JSP 1.x:

   

Aplikasi Web berasaskan JSP yang ada terdiri daripada kod Java yang dicampur dengan markup HTML seperti fragmen kod di atas. Menjaga beratus halaman seperti itu boleh menjadi mimpi buruk jika anda mempunyai pasukan pembangunan Java dan reka bentuk Web yang berasingan. Solusinya adalah dengan memindahkan kod Java ke perpustakaan tag sehingga pengembang dapat melakukan pekerjaan mereka tanpa menempelkan kod Java dalam Halaman Web dan perancang dapat mengedit Halaman Web mereka tanpa perlu khawatir melanggar kod Java.

Walau bagaimanapun, JSP 1.x mempunyai beberapa masalah yang tidak membiarkan anda dengan mudah mengembangkan halaman JSP tanpa skrip. Sehingga baru-baru ini, tidak ada metode standar yang ada untuk mengakses objek Java dari halaman JSP tanpa menggunakan kode Java. Di samping itu, kelas pengendali tag pengekodan tidak semudah yang boleh.

Garis kod berikut berdasarkan JSTL 1.0, yang dapat digunakan dengan JSP 1.2. The tag iterates lebih unsur-unsur yang diberikan listdan eksport yang elemberubah-ubah bagi setiap elemen. Daripada menyatakan elemsebagai pemboleh ubah tempatan, tag membuat atribut halaman dengan pageContext.setAttribute(). Nilai atribut ini dicetak dengan teg JSTL :

   

JSTL menyediakan tag standard untuk memproses dokumen XML dan mengakses pangkalan data hubungan bersama dengan tag pemformatan, tag pengantarabangsaan, tag bersyarat, tag iterator, tag yang berkaitan dengan URL, dan tag tujuan umum lainnya. JSTL telah menyelesaikan banyak masalah JSP 1.x dengan bantuan bahasa ekspresi yang membolehkan anda mengakses objek Java dari halaman JSP tanpa menggunakan kod Java. Sebagai contoh, bukannya mencari atribut atau mengakses parameter permintaan dengan:


  

anda kini boleh menggunakan:

$ {a} $ {param.p} 

Anda dapat mengakses objek konteks halaman JSP, atribut halaman / permintaan / sesi / aplikasi (juga dikenal sebagai variabel JSP), sifat JavaBean, elemen pengumpulan, parameter permintaan, parameter inisialisasi, kuki, dan tajuk HTTP.

Dengan JSP 1.2, bahasa ekspresi hanya tersedia untuk aplikasi dan perpustakaan teg berasaskan JSTL. JSP 2.0 menjadikan EL tersedia untuk semua aplikasi JSP dan semua pustaka tag (termasuk taglib lama yang dirancang untuk JSP 1.x). JSP 2.0 juga mempermudah pengembangan pustaka tag, seperti yang akan anda lihat nanti dalam artikel ini.

Sejak versi pertamanya, JSP telah memberikan tag standard untuk menggunakan JavaBeans di halaman JSP. Anda boleh membuat atau mencari contoh JavaBean dengan , dan kemudian anda boleh mendapatkan dan menetapkan sifat mereka dengan dan . Dengan JSP 2.0, anda juga boleh mendapatkan nilai harta tanah dengan:

$ {bean.property} 

Sebagai tambahan kepada sifat, komponen JavaBean memiliki kaedah umum yang sering harus dipanggil dari halaman JSP. Sisa artikel ini akan menyajikan tiga cara untuk memanggil kaedah JavaBean tanpa menggunakan kod Java. Satu berdasarkan sokongan JSP 2.0 untuk fungsi, yang merupakan konstruksi EL yang membolehkan anda memanggil kaedah statik kelas Java. Penyelesaian lain menggunakan tag khas yang mendapatkan parameter kaedah sebagai atribut tag. Cara ketiga adalah berdasarkan tag generik yang membolehkan anda memanggil kaedah umum mana-mana kelas JavaBean dari halaman JSP.

Gunakan fungsi

JSTL 1.0 EL awal tidak mempunyai sokongan untuk fungsi. JSP 2.0 EL membolehkan anda memanggil kaedah statik awam kelas Java menggunakan sintaks berikut:

$ {awalan: methodName (param1, param2, ...)} 

Fungsi JSP mesti dinyatakan dalam deskriptor perpustakaan tag (TLD):

 methodName className returnType methodName (param1Type, param2Type, ...)   

Kelas Java tidak perlu melaksanakan antara muka khas. Satu-satunya syarat adalah menjadikan kaedah Java umum dan statis.

Kelas TestBean

The TestBeankelas mempunyai kaedah awam yang dinamakan testMethod(), yang dipanggil dari laman JSP dibentangkan dalam bahagian berikut. The JavaBean mempunyai tiga hartanah bernama text, number, dan logic. Sifat-sifat ini diubah oleh testMethod(), yang mengembalikan rentetan yang mengandungi tiga nilai yang diubah suai sifat:

pakej com.devsphere.articles.calltag; kelas awam TestBean {teks String peribadi; nombor int peribadi; logik boolean peribadi; TestBean awam () {text = ""; nombor = 0; logik = salah; } public String getText () {mengembalikan teks; } public void setText (String text) {this.text = teks; } public int getNumber () {nombor pengembalian; } public void setNumber (nombor int) {this.number = number; } getLogic boolean awam () {logik kembali; } public void setLogic (logik boolean) {this.logic = logik; } Public String testM Method (String text, int number, boolean logic) setText (getText () + text); setNumber (getNumber () + nombor); setLogic (getLogic ()}

Kelas TestFungsi

Kerana JSP 2.0 EL hanya membenarkan panggilan untuk kaedah statik, TestBean's testMethod()mesti dibalut dengan kaedah statik. The TestFunctionkelas menyediakan apa-apa pembungkus statik yang mengambil parameter yang sama sebagai kaedah kacang ditambah objek kacang yang kaedah mesti dipanggil:

pakej com.devsphere.articles.calltag; kelas awam TestFunction {public static String testM Method (objek TestBean, String text, int number, boolean logic) {return object.testMethod (teks, nombor, logik); }}

TestFunction.classFail yang disusun mesti diletakkan bersama-sama TestBean.classke dalam /WEB-INF/classesdirektori aplikasi Web . Sebagai alternatif, dua classfile boleh dibungkus dalam fail balang dan disimpan di dalam /WEB-INF/lib.

JSP TestFungsi

Before calling the testMethod() function, the TestFunction.jsp page must specify the function's prefix and the library's Uniform Resource Identifier (URI):


  

The tag creates an instance of the TestBean class:


  

The testMethod() function is called twice. The first call gets some constant parameters, while the second call gets the values of the bean properties as parameters:

  ${tf:testMethod(obj, "abc", 123, true)} 
   
${tf:testMethod(obj, obj.text, obj.number, obj.logic)}

The TestFunction.jsp page produces the following HTML output:

  abc 123 true 
   
abcabc 246 true

The TestFunction TLD

As mentioned earlier, the JSP function must be declared in a tag library descriptor. The TestFunction.tld file defines some version number, the tf short name used in JSP pages as prefix for testMethod(), the library's URI, the function's name, the name of the class containing the static method, and the method's signature. The URI doesn't have to point to an existing Web resource, but it must be unique. You may not use the same URI for two different tag libraries.

Here is the TestFunction.tld file's content:

  1.0 tf //devsphere.com/articles/calltag/TestFunction.tld  testMethod  com.devsphere.articles.calltag.TestFunction   java.lang.String testMethod( com.devsphere.articles.calltag.TestBean, java.lang.String, int, boolean)    

The TestFunction.tld file must be placed into the Web application's /WEB-INF directory. The same directory also contains the web.xml application descriptor, which declares the library within a element. The URI that identifies the library in JSP pages and the TLD file's location are specified within two separate XML elements, and :

  //devsphere.com/articles/calltag/TestFunction.tld   /WEB-INF/TestFunction.tld   

Use custom tags

Tag libraries were introduced by JSP 1.1, which defined the Tag and BodyTag interfaces. JSP 1.2 added IterationTag and support for catching exceptions. These interfaces have handler methods such as doStartTag(), doInitBody(), doAfterBody(), and doEndTag(). Once you understand how these methods should be implemented, it's easy to build tag libraries. However, many developers viewed JSP 1.x's tag-handling mechanism as unnecessarily complex.

JSP 2.0 introduced a much simpler tag-handling protocol. If you extend the SimpleTagSupport class, you just have to implement the doTag() method for handling a JSP tag.

The TestMethodTag class

The TestMethodTag.jsp page calls the testMethod() JavaBean method using the following syntax:


  

When the application server translates the JSP page into a servlet, the above tag is replaced with a Java code fragment that calls the methods of a TestMethodTag instance created for handling the tag.

The tag handler extends the JSP 2.0 API's SimpleTagSupport class and defines one field for each attribute. These fields will maintain the tag attributes' values:

package com.devsphere.articles.calltag; import javax.servlet.jsp.JspException; import javax.servlet.jsp.JspWriter; import javax.servlet.jsp.tagext.SimpleTagSupport; import java.io.IOException; public class TestMethodTag extends SimpleTagSupport { private TestBean object; private String text; private int number; private boolean logic; 

For each tag attribute, there must be a set method, which gets the attribute value and stores it in a field so that the tag handler can use it later:

 public void setObject(TestBean object) { this.object = object; } public void setText(String text) { this.text = text; } public void setNumber(int number) { this.number = number; } public void setLogic(boolean logic) { this.logic = logic; } 

After setting the tag handler's attributes, the Java fragment (resulting from the JSP tag) invokes the tag handler's doTag() method, which calls the bean method. The doTag() method prints the string value returned by testMethod(). Therefore, the JSP output contains the returned value:

public void doTag () melemparkan JspException, IOException {String ret = object.testMethod (teks, nombor, logik); JspWriter out = getJspContext (). GetOut (); out.println (ret); }}

Kelas TestMethodTag2

Katakan anda ingin menggunakan nilai yang dikembalikan dengan kaedah kacang dalam JSP. Contohnya, anda mungkin harus meneruskannya sebagai nilai atribut ke tag lain. Atau, anda mungkin mahu mengawal outputnya di halaman JSP:

 ... $ {ret} ...