Panggil metode JavaBean dari halaman JSP 2.0

Versi baru JavaServer Pages (JSP) menggabungkan ekspresi bahasa (EL) yang diperkenalkan oleh JSP Standard Tag Library (JSTL) untuk memungkinkan desainer Web membuat halaman JSP tanpa skrip yang tidak berisi kode Java. Karena JSP 2.0 menyediakan kompatibilitas mundur ke JSP 1.x, Anda masih dapat menyertakan cuplikan Java di halaman Anda, tetapi penangan tag dan komponen JavaBean adalah tempat yang jauh lebih baik untuk fungsionalitas berbasis Java.

JSP 2.0 menyediakan fitur baru untuk penangan tag seperti atribut dinamis, Simple Invocation Protocol, dan .tagfile. Anda masih menggunakan aksi standar JSP 1.0 lama untuk membuat instance JavaBean dan menyetel propertinya, tetapi sekarang Anda dapat mengakses properti kacang, parameter permintaan, dan atribut / variabel JSP dengan bahasa ekspresi baru.

Semua peningkatan teknologi JSP tersebut memungkinkan Anda mencapai tujuan untuk memisahkan markup JSP / HTML dari kode Java. Namun ada satu hal yang hilang. JSP 2.0 tidak memiliki sintaks untuk memanggil metode JavaBean nonstatis publik dari halaman JSP tanpa skrip. Artikel ini memecahkan masalah tersebut dengan memberikan tag sederhana JSP 2.0 dengan atribut dinamis.

Catatan: Anda dapat mengunduh kode sumber artikel ini dari Sumber.

Bahasa ekspresi dibutuhkan

Misalkan Anda memiliki java.util.Listinstance yang harus Anda tampilkan sebagai daftar HTML. Berikut adalah solusi cepat berdasarkan JSP 1.x:

   

Aplikasi web berbasis JSP yang ada terdiri dari kode Java yang dicampur dengan markup HTML seperti potongan kode di atas. Mempertahankan ratusan halaman seperti itu bisa menjadi mimpi buruk jika Anda memiliki tim pengembangan Java dan desain Web yang terpisah. Solusinya adalah memindahkan kode Java ke pustaka tag sehingga pengembang dapat melakukan pekerjaan mereka tanpa menempelkan kode Java di dalam Halaman Web dan desainer dapat mengedit Halaman Web mereka tanpa khawatir akan merusak kode Java.

Namun, JSP 1.x memiliki beberapa masalah yang tidak memungkinkan Anda mengembangkan halaman JSP tanpa skrip dengan mudah. Hingga saat ini, tidak ada metode standar untuk mengakses objek Java dari halaman JSP tanpa menggunakan kode Java. Selain itu, kelas penangan tag pengkodean tidak sesederhana yang seharusnya.

Baris kode berikut didasarkan pada JSTL 1.0, yang dapat digunakan dengan JSP 1.2. The tag iterates atas unsur-unsur yang diberikan listdan ekspor elemvariabel untuk setiap elemen. Alih-alih mendeklarasikan elemsebagai variabel lokal, tag membuat atribut halaman dengan pageContext.setAttribute(). Nilai atribut ini dicetak dengan tag JSTL :

   

JSTL menyediakan tag standar untuk memproses dokumen XML dan mengakses database relasional bersama dengan tag format, tag internasionalisasi, tag kondisional, tag iterator, tag terkait URL, dan tag tujuan umum lainnya. JSTL telah memecahkan banyak masalah JSP 1.x dengan bantuan bahasa ekspresi yang memungkinkan Anda mengakses objek Java dari halaman JSP tanpa menggunakan kode Java. Misalnya, daripada mencari atribut atau mengakses parameter permintaan dengan:


  

Anda sekarang dapat menggunakan:

$ {a} $ {param.p} 

Anda dapat mengakses objek konteks halaman JSP, atribut halaman / permintaan / sesi / aplikasi (juga dikenal sebagai variabel JSP), properti JavaBean, elemen koleksi, parameter permintaan, parameter inisialisasi, cookie, dan header HTTP.

Dengan JSP 1.2, bahasa ekspresi hanya tersedia untuk aplikasi berbasis JSTL dan pustaka tag. JSP 2.0 membuat EL tersedia untuk semua aplikasi JSP dan semua pustaka tag (termasuk taglib lama yang dirancang untuk JSP 1.x). JSP 2.0 juga menyederhanakan pengembangan pustaka tag, seperti yang akan Anda lihat nanti di artikel ini.

Sejak versi pertamanya, JSP telah menyediakan tag standar untuk menggunakan JavaBeans di halaman JSP. Anda bisa membuat atau menemukan instance JavaBean dengan , lalu Anda bisa mendapatkan dan menyetel propertinya dengan dan . Dengan JSP 2.0, Anda juga bisa mendapatkan nilai properti dengan:

$ {bean.property} 

Selain properti, komponen JavaBean memiliki metode publik yang sering kali harus dipanggil dari halaman JSP. Sisa artikel ini akan menyajikan tiga cara untuk memanggil metode JavaBean tanpa menggunakan kode Java. Satu didasarkan pada dukungan JSP 2.0 untuk fungsi, yang merupakan konstruksi EL yang memungkinkan Anda memanggil metode statis kelas Java. Solusi lain menggunakan tag khusus yang mendapatkan parameter metode sebagai atribut tag. Cara ketiga didasarkan pada tag umum yang memungkinkan Anda memanggil metode publik apa pun dari kelas JavaBean apa pun dari halaman JSP.

Gunakan fungsi

JSTL 1.0 EL awal tidak memiliki dukungan untuk fungsi. JSP 2.0 EL memungkinkan Anda memanggil metode statis publik kelas Java menggunakan sintaks berikut:

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

Fungsi JSP harus dideklarasikan dalam deskriptor pustaka tag (TLD):

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

Kelas Java tidak harus mengimplementasikan antarmuka khusus apa pun. Satu-satunya persyaratan adalah membuat metode Java menjadi publik dan statis.

Kelas TestBean

The TestBeankelas memiliki metode umum bernama testMethod(), yang disebut dari halaman JSP yang disajikan dalam bagian berikut. The JavaBean memiliki tiga sifat bernama text, number, dan logic. Properti ini diubah oleh testMethod(), yang mengembalikan string yang berisi nilai tiga properti yang dimodifikasi:

paket com.devsphere.articles.calltag; public class TestBean {private String text; nomor int pribadi; logika boolean pribadi; publik TestBean () {text = ""; angka = 0; logika = salah; } public String getText () {return text; } public void setText (String teks) {this.text = text; } public int getNumber () {return number; } public void setNumber (int number) {this.number = number; } public boolean getLogic () {logika pengembalian; } public void setLogic (logika boolean) {this.logic = logika; } public String testMethod (Teks string, nomor int, logika boolean) setText (getText () + teks); setNumber (getNumber () + number); setLogic (getLogic ()}

Kelas TestFunction

Karena JSP 2.0 EL memungkinkan hanya panggilan ke metode statis, TestBean's testMethod()harus dibungkus dalam metode statis. The TestFunctionkelas menyediakan seperti pembungkus statis yang mengambil parameter yang sama sebagai metode kacang ditambah objek kacang yang metode harus dipanggil:

paket com.devsphere.articles.calltag; public class TestFunction {public static String testMethod (objek TestBean, teks String, nomor int, logika boolean) {return object.testMethod (teks, angka, logika); }}

File yang dikompilasi TestFunction.classharus ditempatkan bersama TestBean.classke dalam /WEB-INF/classesdirektori aplikasi Web . Sebagai alternatif, dua file kelas dapat dikemas dalam file jar dan disimpan di /WEB-INF/lib.

TestFunction JSP

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 () melempar JspException, IOException {String ret = object.testMethod (teks, angka, logika); JspWriter out = getJspContext (). GetOut (); out.println (ret); }}

Kelas TestMethodTag2

Misalkan Anda ingin menggunakan nilai yang dikembalikan oleh metode kacang di JSP. Misalnya, Anda mungkin harus meneruskannya sebagai nilai atribut ke tag lain. Atau, Anda mungkin ingin mengontrol outputnya di halaman JSP:

 ... $ {ret} ...