JSP2.0ページからJavaBeanメソッドを呼び出す

新しいJavaServerPages(JSP)バージョンには、JSP標準タグライブラリ(JSTL)によって導入された式言語(EL)が組み込まれており、WebデザイナーはJavaコードを含まないスクリプトレスJSPページを作成できます。JSP2.0はJSP1.xとの下位互換性を提供するため、ページにJavaスニペットを含めることもできますが、Javaベースの機能にはタグハンドラーとJavaBeanコンポーネントの方がはるかに適しています。

JSP 2.0は、動的属性、Simple Invocation Protocol、.tagファイルなどのタグハンドラーの新機能を提供します。JavaBeanインスタンスの作成とそのプロパティの設定には引き続き古いJSP1.0標準アクションを使用しますが、新しい式言語を使用してBeanプロパティ、リクエストパラメータ、JSP属性/変数にアクセスできるようになりました。

これらすべてのJSPテクノロジの改善により、JSP / HTMLマークアップをJavaコードから分離するという目標を達成できます。ただし、1つ欠けていることがあります。JSP 2.0には、スクリプトのないJSPページからパブリック非静的JavaBeanメソッドを呼び出すための構文がありません。この記事では、動的属性を持つJSP2.0シンプルタグを提供することでこの問題を解決します。

注:この記事のソースコードは、リソースからダウンロードできます。

必要な表現言語

java.util.ListHTMLリストとして提示する必要のあるインスタンスがあるとします。以下は、JSP1.xに基づく簡単なソリューションです。

   

既存のJSPベースのWebアプリケーションは、上記のコードフラグメントのようなHTMLマークアップと混合されたJavaコードで構成されています。Java開発チームとWebデザインチームが別々にいる場合、そのような何百ものページを維持することは悪夢になる可能性があります。解決策は、Javaコードをタグライブラリに移動して、開発者がWebページ内にJavaコードを貼り付けずに作業を実行できるようにし、設計者がJavaコードを壊すことを心配せずにWebページを編集できるようにすることです。

ただし、JSP 1.xには、スクリプトのないJSPページを簡単に開発できないいくつかの問題があります。最近まで、Javaコードを使用せずにJSPページからJavaオブジェクトにアクセスするための標準的な方法は存在しませんでした。さらに、タグハンドラークラスのコーディングは、それほど単純ではありませんでした。

次のコード行は、JSP1.2で使用できるJSTL1.0に基づいています。タグは、所定の要素で反復listし、輸出elem各要素の変数。タグは、elemローカル変数として宣言する代わりに、を使用してページ属性を作成しますpageContext.setAttribute()。この属性の値は、JSTLのタグとともに出力されます。

   

JSTLは、XMLドキュメントを処理し、リレーショナルデータベースにアクセスするための標準タグを、フォーマットタグ、国際化タグ、条件付きタグ、イテレータタグ、URL関連タグ、およびその他の汎用タグとともに提供します。JSTLは、Javaコードを使用せずにJSPページからJavaオブジェクトにアクセスできる式言語の助けを借りて、JSP1.xの問題の多くを解決しました。たとえば、属性を検索したり、次のコマンドでリクエストパラメータにアクセスしたりする代わりに、


  

あなたは今使うことができます:

$ {a} $ {param.p} 

JSPページコンテキストオブジェクト、ページ/リクエスト/セッション/アプリケーション属性(JSP変数とも呼ばれます)、JavaBeanプロパティ、コレクション要素、リクエストパラメータ、初期化パラメータ、Cookie、およびHTTPヘッダーにアクセスできます。

JSP 1.2では、式言語はJSTLベースのアプリケーションとタグライブラリでのみ使用できます。JSP 2.0は、すべてのJSPアプリケーションとすべてのタグライブラリ(JSP 1.x用に設計された古いtaglibを含む)でELを利用できるようにします。また、JSP 2.0は、この記事の後半で説明するように、タグライブラリの開発を簡素化します。

最初のバージョン以来、JSPはJSPページでJavaBeansを使用するための標準タグを提供してきました。作成またはとのJavaBeanインスタンスを見つけることができ、その後、あなたは取得してそのプロパティを設定することができますし、。JSP 2.0では、次のようにしてプロパティの値を取得することもできます。

$ {bean.property} 

プロパティに加えて、JavaBeanコンポーネントには、JSPページから呼び出さなければならないことが多いパブリックメソッドがあります。この記事の残りの部分では、Javaコードを使用せずにJavaBeanメソッドを呼び出す3つの方法を紹介します。1つは、関数のJSP 2.0サポートに基づいています。関数は、Javaクラスの静的メソッドを呼び出すことができるEL構造です。別のソリューションでは、メソッドパラメータをタグ属性として取得するカスタムタグを使用します。3番目の方法は、JSPページから任意のJavaBeanクラスの任意のパブリックメソッドを呼び出すことができる汎用タグに基づいています。

関数を使用する

初期のJSTL1.0 ELには、機能のサポートがありませんでした。JSP 2.0 ELでは、次の構文を使用してJavaクラスのパブリック静的メソッドを呼び出すことができます。

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

JSP関数は、タグライブラリ記述子(TLD)で宣言する必要があります。

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

Javaクラスは、特別なインターフェースを実装する必要はありません。唯一の要件は、Javaメソッドをパブリックおよび静的にすることです。

TestBeanクラス

このTestBeanクラスにはtestMethod()、次のセクションで説明するJSPページから呼び出されるという名前のパブリックメソッドがあります。JavaBeanは、名前の3つのプロパティを持っているtextnumberlogic。これらのプロパティはによって変更されますtestMethod()。これは、3つのプロパティの変更された値を含む文字列を返します。

パッケージcom.devsphere.articles.calltag; パブリッククラスTestBean {プライベート文字列テキスト; プライベートint番号; プライベートブール論理; public TestBean(){text = ""; 数= 0; 論理= false; } public String getText(){テキストを返す; } public void setText(String text){this.text = text; } public int getNumber(){数値を返す; } public void setNumber(int number){this.number = number; } public boolean getLogic(){リターンロジック; } public void setLogic(boolean logic){this.logic = logic; } public String testMethod(String text、int number、boolean logic)setText(getText()+ text); setNumber(getNumber()+ number); setLogic(getLogic()}

TestFunctionクラス

Because the JSP 2.0 EL allows only calls to static methods, TestBean's testMethod() must be wrapped in a static method. The TestFunction class provides such a static wrapper that takes the same parameters as the bean method plus the bean object whose method must be called:

package com.devsphere.articles.calltag; public class TestFunction { public static String testMethod(TestBean object, String text, int number, boolean logic) { return object.testMethod(text, number, logic); } } 

The compiled TestFunction.class file must be placed together with TestBean.class into the Web application's /WEB-INF/classes directory. As an alternative, the two classfiles can be packed in a jar file and stored in /WEB-INF/lib.

The 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()throws JspException、IOException {String ret = object.testMethod(text、number、logic); JspWriter out = getJspContext()。getOut(); out.println(ret); }}

TestMethodTag2クラス

Beanメソッドによって返された値をJSPで使用するとします。たとえば、属性値として別のタグに渡す必要がある場合があります。または、JSPページでその出力を制御することもできます。

 ... $ {ret}..。