一。JavaBean是一种可重复使用的且跨平台的软件组织。
JavaBean可分为两种:一种是有用户界面的JavaBean,还有一种是没有用户界面,主要负责表示业务数据或者处理事务的JavaBean。
JSP通常访问的是后一种JavaBean。
二。JSP和JavaBean搭配使用,有三个好处。
1.使得HTML和Java程序分离,便于维护。
2.可以降低开发JSP网页人员的Java编程能力。
3.JSP侧重于生成动态网页,事务处理由JavaBean来完成,这样可以利用JavaBean组件的可重用性特点,提高开发网站的效率。
三。一个标准的JavaBean有以下几个特性。
1.JavaBean是一个公共的类。
2.JavaBean有一个不带参数的构方法。
3.JavaBean通过set方法设置属性,通过get方法获取属性。
4.属性名和get方法名之间存在固定的对应关系:如果属性名为“count”,那么get方法名为“getCount”,属性名中的第一个字母在方法名中改为大写。
5.属性名和set方法名之间存在固定的对应关系:如果属性名为“count”,那么get方法名为“setCount”,属性名中的第一个字母在方法名中改为大写。
6.如果希望JavaBean能被持久化,那么可以使它实现java.io.Serializable接口。
以下是一个JavaBean,类的名字为CounterBean。
package mypackage;
public class CounterBean {
private int count = 0;
public CounterBean() {}
public int getCount() {
return count;
}
public void setCount(int count) {
this.count = count;
}
}
其中定义了一个count属性,用来统计数字。有一个不带参数的构造方法,一个getCount和setCount方法。
四。JSP访问JavaBean。
1.首先导入JavaBena这个类。
<%@ page import="mypackage.CounterBean" %>
导入这个JavaBean类。
2.声明JavaBean对象。
<jsp:useBean id="counterBean" class="mypackage.CounterBean" scope="session" />
id:代表JavaBean对象的ID,实际上表示引用JavaBean对象的局部变量名,以及存放在特定范围内的属性名。JSP规范要求存放在所有范围内的每个JavaBean对象都有唯一的ID。
class:用来指定JavaBean的雷鸣。
scope:指定JavaBean对象的存放范围,可选值为page、request、session、application。
执行这段代码时,
1》定义一个名为counterBean的局部变量。
2》尝试从scope指定的会话范围内读取名为“counterBean”的属性,并且使得counterBean局部变量的引用具体属性值,即CounterBean对象。
3》如果在scope指定的会话范围内,名为“counterBean”属性不存在,会通过CounterBean类的默认构造方法创建一个CounterBean对象,并把它存放在会话范围内,令其属性名为“counterBean”,并且counter局部变量也引用这个CounterBean对象。
所以以上的<jsp:useBean>和以下Java代码作用等价:
mypackage.CounterBean counterBean = null;
counterBean = (mypackage.CounterBean) session.getAttribute("counterBean");
if(counterBean == null) {
counterBean = new mypackage.CounterBean();
session.setAttribute("counterBean",counterBean);
}
3.访问JavaBean属性。
1》get。
<jsp:getProperty name="counterBean" property="count" />
格式固定,name是上边声明的id,也就是此时需要使用的对象名字,property是你想要得到类中的属性名(这里类中就只有count,但是类中可以存放多个属性名,只要设置get和set方法就好),这里的代码相当于JSP中的:
<%=counterBean.getCount()%>
2》set。
<jsp:setProperty name="counterBean" property="count" value="2" />
相当于JSP中的:
<%counterBean.setCounter(2)%>
注意:必须先声明才能访问,否则抛出异常。
五。JavaBean的范围。
scope属性决定了JavaBean对象存在的范围,可选值包括以下几种。
page:表示页面范围,它是scope属性的默认值。
request:表示请求范围,从客户端想服务器发出请求到服务器返回响应这一阶段。
session:表示会话范围,从浏览器第一次访问一个Web应用中的支持会话的任意一个网页开始,Servlet容器创建HttpSession对象,到会话结束。会话结束指的是:会话过期、浏览器终止、服务器调用HttpSession对象的invalidate()方法等。
application:表示Web应用范围,该范围就是Web应用开启到终止的范围。
例子:
index.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="mypackage.CounterBean" %>
<!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>
<jsp:useBean id="counterBean" class="mypackage.CounterBean" scope="page" />
<jsp:setProperty name="counterBean" property="count" value="<%=counterBean.getCount() + 1%>" />
<jsp:forward page="forward.jsp" />
</body>
</html>
forward.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="mypackage.CounterBean" %>
<!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>
<jsp:useBean id="counterBean" class="mypackage.CounterBean" scope="page" />
<jsp:getProperty name="counterBean" property="count" />
</body>
</html>
如果scope设置为page:
打开index界面,虽然在index中通过value设置为count+1,然是,然后请求转发给forward界面,发现无论打开刷新多少次都是输出0,这是因为在index对象创建的counterBean对象只在index界面内有效。
如果scope设置为request:
打开index界面,发现每次刷新数值都是1,因为request请求index,然后index将请求转发到forward界面,此时执行完forward界面返回响应,请求结束。
如果scope设置为session:
打开index,发现每次刷新数值都会加1,但是打开另一个浏览器却会从1重新开始。
如果scope设置为application:
打开index,刷新每次数值都会加1,,然后再打开另一个浏览器数值会接着上一个浏览器的数值增加。
注意:每次forward.jsp都会从对应的scope范围中获取属性,如果是request、session、application,那么对应的Java代码应该如下:
CounterBean obj = (CounterBean) request.getAttribute("counterBean");
CounterBean obj = (CounterBean) session.getAttribute("counterBean");
CounterBean obj = (CounterBean) application.getAttribute("counterBean");
总的来说,JavaBean对象的生存范围从大到小排列为:application>session>request>page。