作者:自由的猪 制作整理:左岸网络http://www.leftworld.net

第12章 JSP页面中的JavaBean组件

JavaBean组件是可以轻松重用并集成到应用程序中的java类。任何继承了特定习惯的java类都可以为JavaBean组件。

JSP技术直接支持JavaBean组件,你可以轻松的创建并初始化bean并set/get属性值。本章提供了JavaBean组件的基本信息及在JSP页面下访问JavaBean组件。

JavaBean组件设计约定

JavaBean组件设计约定管理类属性及管理访问属性的公共方法。

一个JavaBean组件属性可以:

☆ read/write,read-only,或write-only

☆ 简单的只含一个值,带索引的代表一个数组值。

没有必要通过实例变量实现属性;属性可以通过使用公共方法来访问:

☆ 对于每一个可读的属性,该bean必须有一个方法的形式如PropertyClass getProperty(){…}

☆ 对于可写的属性,bean唏嘘由一个方法形如:setProperty(PropertyClass pc){…}

除了属性方法,JavaBean组件必须定义一个不带参数的构造器。

在书店应用程序中的JSP页面enter.jsp,bookdetails.jsp,catalog.jsp,showcart.jsp使用database.BookDB,database.BookDetails JavaBean组件.BookDB提供了一个Bean组件,和一个企业Bean,这两个Bean都扩展使用了面向bean的自定义标签。JSP页面showcart.jsp,cashier.jsp使用了cart.ShoppingCart莱显示顾客的购物车。

JSP页面catalog.jsp,showcart.jsp及cashier.jsp使用了util.Currency JavaBean组件通过本地敏感的方式格式化货币。该bean由两个可写的属性——locale和amount,及一个只读属性——format。该属性不与任何实例对象对应,但返回变量locale及amount属性的功能。

Public class Currency

{

private Locale locale;

private double amount;

public Currency()

{

locale=null;

amount=0.0;

}

public void setLocale(Locale l)

{

locale=l;

}

public void setAmount(double a)

{

amount=a;

}

public Stirng getFormat()

{

NumberFormat nf=NumberFormat.getCurrencyInstance(locale);

Return nf.format(amount);

}

}

为什么要使用JavaBean组件

JSP页面可以在声明或脚本中创建使用任何类型的Java编程语言对象。下面的脚本创建了书店购物及保存的一个会话属性:

<%

ShoppingCart cart={ShoppingCart}session.getAttribute(“cart”);

If(cart==null)

{

Cart=new ShoppingCart();

Session.setAttribute(“cart”,cart);

}

%>

如果购物车对象符合JavaBean约定,JSP页面可以使用JSP元素来创建并访问对象。例如,在Duke’s Bookstore页面中有bookdetails.jsp,catalog.jsp及showcart.jsp替代脚本:

       <jsp:useBean id=”cart” class=”cart.ShoppingCart” scope=”session”/>

创建并使用JavaBean组件

通过下面的格式可以在JSP中声明使用JavaBean组件:

<jsp:useBean id=”beanName” class=”fully_qualified_classname” scope=”scope”/>

或者

       <jsp:useBean id=”beanName” class=”fully_qualified_classname” scope=”scope”>

       <jsp:setProperty …/>

       </jsp:useBean>

第二种形式是当你想初始化bean的属性时使用的。

Jsp:usebean元素标明在该页面中将使用一个存储在特定域内的可以访问的bean,它的域可以是application,session,request,page。如果没有这样的bean存在,该语句创建该bean,并把它作为域对象属性保存。属性id的值决定了bean在域中的的名字,identifier用来在其它JSP元素及脚本中引用bean。

下面的元素创建了一个Currency的实例,如果不存在则把它作为session对象属性存储起来,使得bean在整个会话期间可用。

<jsp:useBean id=”currency” class=”util.Currency” scope=”session”/>

设置JavaBean组件属性

在JSP页面中有两种方法设置JavaBean组件属性:使用jsp:setProperty元素或脚本。

<% beanName.setPropName(value);%>

jsp:setProperty元素的语法取决于属性值。下表总结了各种方法来设置JavaBean的属性:

Value Source

Element Syntax

String

<jsp:setProperty name=”beanName” property=”propName’” value=”string constant”/>

Request parameter

<jsp:setProperty name=”beanName” property=”propName”

paramName”/>

Request parameter name matches bean property

<jsp:setProperty name=”beanName” property=”propName”/>

<jsp:setProperty name=”beanName” property=”*”/>

Expression

<jsp:setProperty name=”beanName” property=”propName”

value=”<%=expression%>”/>

1、  beanName must be the same as that specified for the id attribute in a useBean element.

2、  There must be a setPropName method in the JavaBean component

3、  ParamName must be a request parameter name.

你可以使用运行时表达式来设置属性类型为复合型的值。重新调用表达式——该表达式用来插入脚本语言表达式的值,转换成String,在到输出流返回到客户端。在setProperty元素中使用时,表达式仅仅返回其值;不会自动的转换。其结果,返回的类型必须转换成属性匹配的类型。

在Duke’s Bookstore应用中展示了如何使用setProperty元素及脚本来为数据库帮助类设置当前的书,如下例:

<jsp:setProperty name=”bookDB” property=”bookId”/>

然而,bookstore2/bookdetails.jsp使用下面的形式:

<% bookDB.setBookId(bookId);%>

下面的代码片断来自bookstore3.jsp一显示如何初始化currency bean由于第一次初始化是嵌套在jsp:useBean元素中,只有当bean创建后才执行。

<jsp:useBean id=”currency” class=”util..Currency” scope=”session”>

<jsp:setProperty name=”currency” property=”locale” value=”<%=request.getLocale()%>”/>

</jsp:useBean>

<jsp:setProperty name=”currency” property=”amount” value=”<%=cart.getTotal()%>”/>

返回JavaBean组件属性

有一些方法可以返回JavaBean组件属性,两种方法(jsp:setProperty元素及表达式)转换属性的值为String并插入到当前的隐含对象out:

☆ <jsp:getProperty name=”beanName” property=”propName”/>

☆ <%=beanName.getPropName() %>

对于这两个方法,beanName必须与在useBean元素中的属性id指定的一样,而且必须有方法getPropName在JavaBean组件中。

如果返回属性只是不必转换类型则必须使用脚本:

<% Object o =beanName.getPropName();%>

下图总结了各类对象的存储,以及那些对象如何通过JSP页面访问: