Извикайте JavaBean методи от JSP 2.0 страници

Новата версия на JavaServer Pages (JSP) включва езика на израза (EL), въведен от JSP стандартната библиотека с маркери (JSTL), за да позволи на уеб дизайнерите да създават JSP страници без скриптове, които не съдържат Java код. Тъй като JSP 2.0 осигурява обратна съвместимост с JSP 1.x, все още може да включите Java фрагменти във вашите страници, но манипулаторите на маркери и компонентите JavaBean са много по-добри места за базирана на Java функционалност.

JSP 2.0 предоставя нови функции за манипулатори на маркери, като динамични атрибути, протоколът за обикновено призоваване и .tagфайлове. Все още използвате старите стандартни действия на JSP 1.0 за създаване на екземпляри на JavaBean и задаване на техните свойства, но сега можете да получите достъп до свойства на боб, параметри на заявки и JSP атрибути / променливи с новия език на израза.

Всички тези подобрения на JSP технологията ви позволяват да постигнете целта да отделите маркировката JSP / HTML от кода на Java. Липсва обаче едно нещо. JSP 2.0 няма синтаксис за извикване на публичен нестатичен метод JavaBean от JSP страница без скриптове. Тази статия решава този проблем, като предоставя JSP 2.0 прост маркер с динамични атрибути.

Забележка: Можете да изтеглите изходния код на тази статия от ресурси.

Необходим е език за израз

Да предположим, че имате java.util.Listекземпляр, който трябва да представите като HTML списък. Ето едно бързо решение, базирано на JSP 1.x:

   

Съществуващите базирани на JSP уеб приложения се състоят от Java код, смесен с HTML маркиране като горния фрагмент от код. Поддържането на стотици подобни страници може да бъде кошмар, ако имате отделни екипи за разработка на Java и уеб дизайн. Решението е да преместите Java кода в библиотеките на тагове, така че разработчиците да могат да си вършат работата, без да поставят Java кода в уеб страниците, а дизайнерите да редактират своите уеб страници, без да се притесняват дали не разбиват Java кода.

JSP 1.x обаче има няколко проблема, които не ви позволяват лесно да разработвате JSP страници без скриптове. Доскоро не съществуваше стандартен метод за достъп до Java обекти от JSP страница без използване на Java код. Освен това класовете за обработка на кодиращи маркери не бяха толкова прости, колкото биха могли да бъдат.

Следващите редове код се базират на JSTL 1.0, който може да се използва с JSP 1.2. В маркер итерации над елементите на дадените listи износа на elemпроменливата за всеки елемент. Вместо да декларира elemкато локална променлива, тагът създава атрибут на страница с pageContext.setAttribute(). Стойността на този атрибут се отпечатва с маркера на JSTL :

   

JSTL предоставя стандартни тагове за обработка на XML документи и достъп до релационни бази данни, заедно с тагове за форматиране, маркери за интернационализация, условни тагове, итераторни тагове, свързани с URL адреси и други маркери с общо предназначение. JSTL е решил много от проблемите на JSP 1.x с помощта на език на изрази, който ви позволява достъп до Java обекти от JSP страници, без да използвате Java код. Например, вместо да търсите атрибут или да осъществявате достъп до параметър на заявка с:


  

сега можете да използвате:

$ {a} $ {param.p} 

Можете да получите достъп до контекстните обекти на JSP страница, атрибутите на страница / заявка / сесия / приложение (известни също като JSP променливи), свойства на JavaBean, елементи на колекция, параметри на заявките, параметри за инициализация, бисквитки и HTTP заглавки.

С JSP 1.2 езикът на израза е достъпен само за JSTL-базирани приложения и библиотеки с маркери. JSP 2.0 прави EL достъпна за всички JSP приложения и всички библиотеки с маркери (включително старите таглиби, проектирани за JSP 1.x). JSP 2.0 също опростява разработването на библиотека с тагове, както ще видите по-нататък в тази статия.

От първата си версия JSP предоставя стандартни тагове за използване на JavaBeans в JSP страници. Можете да създадете или намерите JavaBean екземпляри с , а след това можете да получите и зададете техните свойства с и . С JSP 2.0 можете също да получите стойността на свойство със:

$ {bean.property} 

В допълнение към свойствата, JavaBean компонентите имат публични методи, които често трябва да се извикват от JSP страници. Останалата част от тази статия ще представи три начина за извикване на JavaBean методи без използване на Java код. Едната се основава на поддръжката на JSP 2.0 за функции, които са EL конструкции, които ви позволяват да извиквате статични методи на Java класове. Друго решение използва персонализирани маркери, които получават параметрите на метода като атрибути на маркери. Третият начин се основава на общ маркер, който ви позволява да извикате всеки публичен метод на който и да е клас JavaBean от JSP страница.

Използвайте функции

Първоначалният JSTL 1.0 EL нямаше поддръжка за функции. JSP 2.0 EL ви позволява да извикате публичния статичен метод на Java клас, като използвате следния синтаксис:

$ {префикс: methodName (param1, param2, ...)} 

Функцията JSP трябва да бъде декларирана в дескриптор на библиотека на маркери (TLD):

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

Класът Java не трябва да прилага специален интерфейс. Единственото изискване е да се направи методът Java публичен и статичен.

Класът TestBean

В TestBeanкласа има обществена метод с име testMethod(), което се нарича от страниците JSP, представени в следващите раздели. В JavaBean има три свойства на име text, numberи logic. Тези свойства са модифицирани от testMethod(), който връща низ, съдържащ модифицираните стойности на трите свойства:

пакет com.devsphere.articles.calltag; публичен клас TestBean {частен текст на низа; частен номер int; частна булева логика; публичен TestBean () {text = ""; число = 0; логика = невярно; } public String getText () {return text; } public void setText (Текст на низа) {this.text = text; } public int getNumber () {номер на връщане; } public void setNumber (int number) {this.number = number; } публичен булев getLogic () {логика на връщане; } public void setLogic (логическа логика) {this.logic = logic; } публичен String testMethod (Текст на низ, int номер, логическа логика) setText (getText () + текст); setNumber (getNumber () + номер); setLogic (getLogic ()}

Класът TestFunction

Тъй като JSP 2.0 EL позволява само обаждания към статични методи, TestBeanе testMethod()трябва да бъдат обвити в метод статична. В TestFunctionклас осигурява такъв статичен обвивка, която се същите параметри, както и метода на боб плюс боб обект, чиято метод трябва да се нарича:

пакет com.devsphere.articles.calltag; публичен клас TestFunction {публичен статичен String testMethod (TestBean обект, String текст, int номер, логическа логика) {return object.testMethod (текст, число, логика); }}

Компилираният TestFunction.classфайл трябва да бъде поставен заедно с TestBean.classв /WEB-INF/classesдиректорията на уеб приложението . Като алтернатива, двата класни файла могат да бъдат опаковани в Jar файл и съхранявани в /WEB-INF/lib.

JSP на TestFunction

Преди да извика testMethod()функцията, TestFunction.jspстраницата трябва да посочи префикса на функцията и единния идентификатор на ресурса на библиотеката (URI):


  

В маркер създава инстанция на TestBeanкласа:


  

Най- testMethod()функцията се нарича два пъти. Първото повикване получава някои постоянни параметри, докато второто повикване получава стойностите на свойствата на боб като параметри:

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

На TestFunction.jspстраницата произвежда следния HTML изход:

  abc 123 true 
   
abcabc 246 вярно

TLD TestFunction

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 () хвърля JspException, IOException {String ret = object.testMethod (текст, число, логика); JspWriter out = getJspContext (). GetOut (); out.println (ret); }}

Класът TestMethodTag2

Да предположим, че искате да използвате стойността, върната от метода на bean в JSP. Например може да се наложи да го предадете като стойност на атрибут на друг маркер. Или може да искате да контролирате изхода му в JSP страницата:

 ... $ {ret} ...