Java EE入门教程系列第三章JavaBean(二)——JavaBean在JSP中的应用

3.2 JavaBean在JSP中的应用

3.2.1 JSP的标签

这里讨论的只是在动态页面中调用JavaBean的方法,静态的可以自己去了解哦~~

JSP技术提供了3个关于JavaBean组件的动作元素:<jsp:useBean>标签、<jsp:setProperty>标签、<jsp:getProperty>标签。

(1)<jsp:useBean>标签

<jsp:useBean>标签用于在JSP页面中查找或实例化一个JavaBean组件

<!--实例化一个bean -->
<jsp:useBean id="person" class="cy.Person" scope="page"></jsp:useBean>
<% System.out.println(person.getName()); %>

scope默认是page,而JavaBean一般通过request域传递JSP文件,常用语法为:

<jsp:useBean id="neanName" class="package.class" scope="request"/>

id用于指定JavaBean对象的引用名称和其存储在域范围中的名称,class必须带包名!!!最终会被翻译到servlet中去。

(2)<jsp:setProperty>标签

<jsp:setProperty>标签用于在JSP页面中设置一个JavaBean组件的属性,语法格式为:

<jsp:setProperty name="beanName"
{
property="propertyName" value="{String|<%=expression %>}"或
property="propertyName"[pram="parameterName"]或
property="*"
}/>

name用于指定JavaBean的名称,property用于指定JavaBean实例对象的属性名,value用于指定属性的值,value可以是字符串,也可以是表达式。如果是字符串,该值会自动转换成JavaBean属性相应的类型,如果是表达式,那么该表达式的计算结果必须与所有要设置的JavaBean属性类型一致。param属性用于将JavaBean实例对象的某个属性值设置为一个请求参数值,该属性值的类型也会自动转化成要设置的JavaBean属性的类型。可以将8中基本数据类型和字符串相互转化但是对于复杂类型如日期等则不能自动转化。但是可以通过下面的方式完成日期型数据的转换:

<jsp:setProperty name="person" property="birthday" value="<%= new Date() %>

(3)<jsp:getProperty>标签

<jsp:getProperty>标签用于在JSP页面中获取一个JavaBean组件的属性。

3.2.2 调用的基本形式

在上一篇博客中已经创建好了一个JavaBean文件,下面创建useJavaBean.jsp来对它进行调用。

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<!-- 实例化一个JavaBean的类 -->
<jsp:useBean id="staff" scope="page" class="cy.StaffInfo"/>
<h2>通过标记获取JavaBean中的属性:</br></h2>
姓名:<jsp:getProperty property="name" name="staff"/></br>
年龄:<jsp:getProperty property="age" name="staff"/></br>
<h2>通过标记修改JavaBean中的属性:</br></h2>
<jsp:setProperty property="name" name="staff" value="Ating"/>
<jsp:setProperty property="age" name="staff" value="20"/>
<h2>修改后的信息:</h2></br>
姓名:<jsp:getProperty property="name" name="staff"/></br>
年龄:<jsp:getProperty property="age" name="staff"/></br>
</body>
</html>











截图:

在上面的文件中实例化了一个staff对象,其实也可以使用表达式或者java的输出语句完成对页面的输出,但是我们还是最好选择标签的形式。这主要是基于MVC编程模式的思想,也就是让表示层与业务层和数据持久层分离,维持他们的独立性。

3.2.3 JavaBean与JSP的参数传递

通过一个例子说明,把一个简单计算圆半径和周长的计算定义成一个JavaBean文件,然后通过一个JSP文件由用户输入半径值,再由另一个JSP文件负责把参数传递给JavaBean文件,然后计算结果并显示出来。

Circle.java

package cy;
public class Circle{  
 private float r;
 private float s;
 private float c;//私有成员属性,半径、面积、周长
 public float getC() {
	 c=(float)Math.PI*2*r;
	 return c;
 }
 public float getS() {
	 s=(float)Math.PI*r*r;
	 return s;
 }
 public float getR() {
	 return r;
 }
 public void setR(float r) {
	 this.r=r;
 }
}  

setR.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>根据半径计算面积及周长</h2>
<form method="post" action="circle.jsp">
输入半径:<input type="text" name="r">
<input type="submit" value="提交">
<input type="reset" value="重置">
</form>
</body>
</html>

circle.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<% String r=(String)request.getParameter("r"); %>
<!-- 实例化JavaBean的类 -->
<jsp:useBean id="cc" scope="page" class="cy.Circle"/>
<jsp:setProperty property="r" name="cc" param="r"/>
<body>
<h2>
得到的半径值:<jsp:getProperty name="cc" property="r"/></br>
它的面积:<jsp:getProperty name="cc" property="s"/></br>
它的周长:<jsp:getProperty name="cc" property="c"/></br>
</h2>
</body>
</html>











在这里要注意设置半径时使用的语句是:

<jsp:setProperty property=”r” name=”cc” param=”r”/>

使用的是param,而不是value!!!param需要用“”括起来

截图:

输入2,点击提交,得:

3.2.4 JavaBean的生命周期

JavaBean的调用过程实际上是JSP技术的一部分,所以JavaBean的生命周期与调用它的JSP页面是相关的。

第二章介绍过JSP的4个生命周期,JavaBean的生命周期也在这4个范围内,分别是page范围、request范围、session范围和application范围,它们通过<jsp:useBean>标签中的Scope属性进行设置。

1)page范围:与当前JSP页面相对应,JavaBean的生命周期存在于一个页面之中,页面关闭时实例对象也被销毁。page范围的JavaBean常用于一次性操作的应用,比如大部分的表单提交、JavaBean的一些计算处理等,是使用频率相对最高的。

2)request范围:JavaBean的生命周期存在于request对象中,也就是说,它存在于任何相同的请求之内。只有当request对象销毁时或页面执行完毕向客户端发回响应时JavaBean才会被销毁。可以理解为request范围可以跨越多个页面。比如,判断用户登录时,如果用户名和密码正确就跳转到一个成功页面,否则转到一个失败页面,而转发前后的页面仍然能得到用户输入的信息。

3)session范围:JavaBean的生命周期存在于session会话中,任何使用相同session的文件都可以调用这个JavaBean。在这个session内,所有page和request都可以使用JavaBean的信息,只有当session超时或会话结束时JavaBean才被销毁。比如,购物车一般就是放在session中。

4)application范围:只有当服务器关闭,JavaBean才被销毁。常用于程序中一些需要经常使用、配置的东西,比如数据库连接URL、全局计数器或者聊天室人员信息。

当某个文件调用JavaBean并通过标签访问属性时,系统会按照由上到下的顺序在4个范围中查找这个JavaBean实例,如果都找不到,就抛出异常。

下面通过一个例子体会一下这几个范围的区别。设计一个页面文件scope.jsp调用前面的JavaBean文件StaffInfo.java。

scope.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<!-- 实例化JavaBean的类 -->
<jsp:useBean id="staff2" scope="page" class="cy.StaffInfo"/>
<body>
<h2>当前文件读到的姓名:
<jsp:getProperty property="name" name="staff2"/>
<jsp:setProperty property="name" name="staff2" value="Ating"/>
<!-- 通过动作组件,加入另一个文件读取姓名属性的值 -->
<jsp:include page="scope2.jsp"></jsp:include>
</body>
</html>











scope2.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h2>scope2读到的姓名:</h2>
<jsp:getProperty property="name" name="staff2"/>
</body>
</html>

这时会出现服务器错误,为什么会出错呢,因为scope属性值被设置为page,所以加入的文件不在page范围内,所以出错,把页面引入代码注释掉,再次运行,得:

刷新页面结果仍然不变,是因为刷新时JavaBean对象的生命周期已经结束,刷新后显示的是重新初始化的值。再次修改程序,将第一次的程序scope属性改为request,再次运行,得:

刷新得到的结果也和上图一样,但是此时已经是新一轮的request,结果是再次实例化的结果。再次修改范围为session,第一次运行和上图结果相同,但是刷新后显示的结果为:

关闭浏览器,打开一个新的浏览器,在地址栏输入访问地址又会发现结果和第一次一样,这是因为关闭浏览器意味着一次session的结束,所以它的对象也结束了,重新打开浏览器显示的就是第一次结果。

再次修改范围为application,会发现除了第一次名字是不同的,之后不论是刷新页面还是关闭浏览器打开新的浏览器,显示的两个名字都是一样的。如果要清理这个对象,重新运行只有重启服务器。

上一篇:
下一篇:

发表评论

邮箱地址不会被公开。 必填项已用*标注

昵称 *