<jsp:useBean...scope="page">
这是默认的值;完全省略scope属性也会得到相同的行为。page作用域表示:在处理当前请求期间,除了要将bean对象绑定到局部变量外,还应该将它放在PageContext对象中。将对象存储在此处表示,servlet可以通过调用预定义变量pageContext的getAttribute方法访问它。
由于每个页面和每个请求都有不同的PageContext对象,所以scope="page"表示不共享bean,也就是针对每个请求都创建新的bean。
例如:下面有一个表单form.jsp是用来输入用户参数的
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<title>表单</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<form name="form1" method="post" action="test1.jsp">
<table width="100%" border="1">
<tr>
<td width="11%">用户名:</td>
<td width="89%"><input type="text" name="username"></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td>年龄:</td>
<td><input type="text" name="age"></td>
</tr>
<tr>
<td> </td>
<td><input type="submit" name="Submit" value="测试"></td>
</tr>
</table>
</form>
<p> </p>
</body>
</html>
一个JavaBean userBean.java
package struts.bean;
public class userBean {
private String username;
private String password;
private String age;
public String getUsername() {
return username;
}
public String getPassword() {
return password;
}
public String getAge() {
return age;
}
public void setUsername(String username) {
this.username = username;
}
public void setPassword(String password) {
this.password = password;
}
public void setAge(String age) {
this.age = age;
}
}
三个处理表单的test1.jsp test2.jsp test3.jsp,这三个处理的JSP代码都一样,只不过在test2.jsp中多了一个链接(测试3)。其他都一样
<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<%@ page import="mail.util.*"%>
<jsp:useBean id="user" scope="page" class="struts.bean.userBean"/>
<%
String username=request.getParameter("username");
String password=request.getParameter("password");
String age=request.getParameter("age");
user.setUsername(username);
user.setPassword(password);
user.setAge(age);
%>
<html>
<head>
<title>test1</title>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312">
</head>
<body>
<table width="100%" border="1">
<tr>
<td width="10%">用户名:</td>
<td width="90%"><%=user.getUsername()%></td>
</tr>
<tr>
<td>密码:</td>
<td><%=user.getPassword()%></td>
</tr>
<tr>
<td>年龄:</td>
<td><%=user.getAge()%></td>
</tr>
</table>
<p><a href="test2.jsp">测试2</a></p>
<p><a href="test3.jsp">测试3</a></p>
</body>
</html>
注意:因为是在测试scope="page",所以上面这个<jsp:uesBean>为<jsp:useBean id="user" scope="page" class="struts.bean.userBean"/>
测试的结果为:test2.jsp test3.jsp都没有共享上面的三个参数。
同样,我们再来测试一下第二个结果,把scope="page"该为scope="request"时,结果跟上面的一样,test2.jsp test3.jsp也得不到那三个参数的值,这是因为:
<jsp:useBean...scope="request">
这个值表示:在处理当前请求期间,除了要将bean对象绑定到局部变量外,还应该将它放在HttpServletResponse对象中,从而可以通过getAttribute方法访问它。看起来这个作用域好象也产生非共享bean,但是,在使用jsp:include,jsp:forward,或者RequestDispatcher的include或forward方法时,两个JSP页面,或JSP页面和servlet将会共享请求对象。
现在我们把scope="page"该为scope="session",结果就跟上面的不一样了,test2.jsp test3.jsp可以得到那三个参数的值,这是因为:
<jsp:useBean...scope="session">
这个值表示:除了要将bean帮定到局部变量以外,还要将它存储到与当前请求关联的HttpSession对象中,可以使用getAttribute获取存储在HttpSession中的对象。
最后,把scope="page"该为scope="application",结果是,test2.jsp test3.jsp同样可以得到那三个参数的值,这是因为:
<jsp:useBean...scope="application">
这个值表示:除了要将bean帮定到局部变量以外,还要将它存储到与当前请求关联的ServletContext对象中(通过预定义application变量或通过调用getServletContext获得)。ServletContext有Web应该中多个servlet和JSP页面所共享。可以使用getAttribute获取存储在ServletContext中的对象。