作者:自由的猪 制作整理:左岸网络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的属性:
你可以使用运行时表达式来设置属性类型为复合型的值。重新调用表达式——该表达式用来插入脚本语言表达式的值,转换成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页面访问:
| ||||||||||||