1.使用JavaBean:useBean操作
JSP提供了动作标签useBean其作用是在页面上使用JavaBean。
useBean标签的一般格式为:
<jsp:useBean id="bean's name" class="bean's class" scope="bean's scope"/> 或者 <jsp:useBean id="bean's name" class="bean's class" scope="bean's scope"> </jsp:useBean>
下面的一个例子演示通过<jsp:useBean>标签使用一个JavaBean,程序首先定义一个Java类BeanItem.java
1 package samples.javabean; 2 3 public class BeanItem { 4 String name; 5 boolean truth; 6 public BeanItem(){ 7 super(); 8 } 9 public String getName() { 10 return name; 11 } 12 public void setName(String name) { 13 this.name = name; 14 } 15 public boolean isTruth() { 16 return truth; 17 } 18 public void setTruth(boolean truth) { 19 this.truth = truth; 20 } 21 22 }
在创建一个jsp文件Ex7_1.jsp来将JavaBean实例化.
1 <%@ page language="java" contentType="text/html; charset=GB18030" 2 pageEncoding="GB18030"%> 3 <%@ page import="java.io.*" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <font size="2"> 12 <jsp:useBean id="item" class="samples.javabean.BeanItem" scope="page"></jsp:useBean> 13 <%--通过useBean标签初始化一个JavaBean --%> 14 <% 15 item.setName("Item"); 16 item.setTruth(true); 17 %> 18 <%--调用JavaBean的getters方法 --%> 19 JavaBean的类:<%=item.getClass().getName() %><br> 20 JavaBean的Name属性:<%=item.getName() %><br> 21 JavaBean的Truth属性:<%=item.isTruth() %><br> 22 </font> 23 </body> 24 </html>
运行结果为:
2.获取和修改JavaBean属性:get/setProperty操作
使用useBean标签创建JavaBean后,在JSP页面中可以采用<jsp:getProperty>和<jsp:setProperty>来获取和修改JavaBean的属性。
2.1getProperty标签
标签"<jsp:getProperty>"的作用是获得属性值。这个标签能制定将要用到的Bean名称(从useBean的id字段得到)以及用户希望的其值的属性。
<jsp:getProperty name="bean name" property="property name"/>
其中name属性代表了Bean的实力,Bean实力必须在前面用<jsp:useBean>标签定义,property属性代表了希望获得其值的那个property的名字.
2.2.seProperty标签
标签"<jsp:setProperty>"的作用是设置属性值。这个标签将设置useBean标签初始化过的JavaBean的属性。
它有三种格式:
<jsp:setProperty name="Name" property="PropertyName" value="string"/> 或 <jsp:setProperty name="Name" property="PropertyName" param="string"/> 或 <jsp:setProperty name="Name" property="*" />
其中name是初始化过的JavaBean的名字,Property是希望设置的属性的名字。
注意:Value域和Param域不能同时使用,分别表示从一个字符串设置属性和从一个request的参数设置属性。
三种不同的setProperty的使用方法:
(1)使用表达式或字符串设置Bean的属性:
<jsp:setProperty name="Name" property="PropertyName" value="string"/>
它将property域标识的bean属性设置为字符串string的值。
<jsp:setProperty name="Name" property="PropertyName" value="<%=expression%>"/>
或者使用JSP输出一个表达式的值,设置为bean属性。
无论是字符串还是表达式,在jsp引擎中都处理为一个String类型的变量。但是JavaBean的域属性却不一定是String类型,例如一些包装类Integer、Double。将String类型的变量设置为域属性时,jsp引擎会尝试将String类型转换为相应类型,例如处理Integer类的时候,会试图调用Integer.parseInt(String s)方法。但是这些方法可能会发生NumberFormatException意外,例如将“34kk”的字符串转换为Integer类型的整数,会发生错误。
下面的例子使用<jsp:getProperty>和<jsp:setProperty>接口获取和设置JavaBean的属性。这里仍然采用刚刚编写的BeanItem类,并且用字符串的形式设置属性。
1 <%@ page language="java" contentType="text/html; charset=GB18030" 2 pageEncoding="GB18030"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <%--通过useBean标签初始化一个JavaBean。 --%> 11 <jsp:useBean id="item" class="samples.javabean.BeanItem" scope="page"></jsp:useBean> 12 <%--通过setProperty标签设置JavaBean的属性 --%> 13 <jsp:setProperty property="name" name="item" value="Item"/> 14 <jsp:setProperty property="truth" name="item" value="true"/> 15 <%--通过setProperty标签获取JavaBean的属性。 --%> 16 JavaBean的类:<%=item.getClass().getName() %><br> 17 JavaBean的Name属性:<jsp:getProperty property="name" name="item"/><br> 18 JavaBean的Truth属性:<jsp:getProperty property="truth" name="item"/><br> 19 </body> 20 </html>
运行结果为:
(2)使用request的参数设定bean的属性:
<jsp:setProperty name="Name" property="PropertyName" param="string"/>
这种方式可以从request内置变量中取出string名字所标识的参数设置给JavaBean,此时不合法的参数可能导致抛出意外。
1 <%@ page language="java" contentType="text/html; charset=GB18030" 2 pageEncoding="GB18030"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <%--通过useBean标签初始化一个JavaBean。 --%> 11 <jsp:useBean id="item" class="samples.javabean.BeanItem" scope="page"></jsp:useBean> 12 <%--通过setProperty标签设置JavaBean的属性 --%> 13 <jsp:setProperty property="name" name="item" param="_name_"/> 14 <jsp:setProperty property="truth" name="item" param="_truth_"/> 15 <%--通过setProperty标签获取JavaBean的属性。 --%> 16 JavaBean的类:<%=item.getClass().getName() %><br> 17 JavaBean的Name属性:<jsp:getProperty property="name" name="item"/><br> 18 JavaBean的Truth属性:<jsp:getProperty property="truth" name="item"/><br> 19 </body> 20 </html>
访问地址:http://localhost:8080/JSPExample/Ex7_3.jsp?_name_=Item&_truth_=true将参数_name_和_truth_传给setProperty标签,其运行结果为:
(3)从HTTP表单中获取bean的属性:
<jsp:setProperty name="Name" property="*"/>
注意:
这里property域采用了通配符“*”。使用这种方法设置bena属性,要求表单的参数名字与bean的属性的名字一直。执行时jsp引擎会遍历表单所有的域,将符合的域设置为bean的属性,同时,jsp引擎还会自动尝试转换类型。
1 <%@ page language="java" contentType="text/html; charset=GB18030" 2 pageEncoding="GB18030"%> 3 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 4 <html> 5 <head> 6 <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> 7 <title>Insert title here</title> 8 </head> 9 <body> 10 <%--通过useBean标签初始化一个JavaBean。 --%> 11 <jsp:useBean id="item" class="samples.javabean.BeanItem" scope="page"></jsp:useBean> 12 <form action="Ex7_4.jsp" method="post" id="bean"> 13 Name:<input type="text" name="name" value="Item"> 14 Truth:True<input type="radio" name="truth" value="true" checked="true"> 15 False<input type="radio" name="truth" value="false"> 16 <input type="submit" name="提交" value="Submit"> 17 </form> 18 <%--通过setProperty标签设置JavaBean的属性 --%> 19 <jsp:setProperty property="*" name="item" /> 20 <%--通过setProperty标签获取JavaBean的属性。 --%> 21 JavaBean的类:<%=item.getClass().getName() %><br> 22 JavaBean的Name属性:<jsp:getProperty property="name" name="item"/><br> 23 JavaBean的Truth属性:<jsp:getProperty property="truth" name="item"/><br> 24 </body> 25 </html>
3.JavaBean的作用域
3.1页面范围Page Scope
表示JavaBean的有效范围是当前页面。当用户访问包含JavaBean的页面时,会实例化JavaBean。每个用户访问一个页面,都会各自初始化JavaBean,他们占用不用的内存空间,彼此间没有影响。当用户离开这个页面时,jsp引擎将销毁创建的JavaBean对象。页面范围的JavaBean一般用于显示后台结果,完成单个页面表单提交操作。操作都是在一个页面的访问内完成,并且不允许各个用户直接的数据相互干扰。
3.2会话范围Session Sope
表示JavaBean的有效范围是当前用户会话。所谓一个用户会话是指用户在同一个浏览器窗口内在不同页面穿梭。会话范围内的JavaBean在会话开始的时候创建,并且在整个会话过程中有效。这样每个页面的useBean标签得到的是会话开始时构造的JavaBean的引用,而不会重新构造。不同用户之间的数据不会干扰,并且即使是同一个终端上的两个不同浏览器窗口,也会被认定是两个不同的会话。当用户关闭浏览器,会话结束,JavaBean对象即被销毁。会话范围的JavaBean用来保持需要在页面之间传递的数据,可以用来处理类似购物车,权限认证的保持等操作
3.3请求范围Request Scope
表示JavaBean的有效范围是一个客户请求。用户在访问时向服务器发出请求,jsp技术允许Request对象在页面间传递。请求范围内的JavaBean会在请求开始的时候创建,并且在整个请求传递过程中都有效,最终在jsp引擎对请求做出回应后销毁。请求范围的JavaBean可以用于在请求处理过程中保持数据,应用在一些具有请求传递的复杂后台系统中。
3.4全局范围Application Scope
表示JavaBean的有效范围是整个Web引用程序的生存周期,所有的用户共享这个JavaBean。它会在第一次被访问的时候构造这个JavaBean,以后除非关闭Web服务器,否之它将一直存在。jsp页中使用useBean标签获得同一个JavaBean的引用,一个用户改变了JavaBean的属性值,则所有的用户的JavaBean的属性值都发生了变化。全局范围的JavaBean可以用于用户间共享数据,或者统计Web应用程序的运行时状态,例如在线人数。由于它只被初始化一次,所有它也可以用来做一些初始化Web应用程序的作用,例如初始化数据库、连接池等。
1 <%@ page language="java" contentType="text/html; charset=GB18030" 2 pageEncoding="GB18030"%> 3 <%@ page import="java.io.*" %> 4 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 5 <html> 6 <head> 7 <meta http-equiv="Content-Type" content="text/html; charset=GB18030"> 8 <title>Insert title here</title> 9 </head> 10 <body> 11 <font size="2"> 12 <jsp:useBean id="item" class="samples.javabean.BeanItem" scope="page"></jsp:useBean> 13 <%--通过useBean标签初始化一个JavaBean --%> 14 <% 15 item.setName("Item"); 16 item.setTruth(true); 17 %> 18 <%--调用JavaBean的getters方法 --%> 19 JavaBean的类:<%=item.getClass().getName() %><br> 20 JavaBean的Name属性:<%=item.getName() %><br> 21 JavaBean的Truth属性:<%=item.isTruth() %><br> 22 </font> 23 </body> 24 </html>