在JSP文檔中共享bean
<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" "<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" "<%@ 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中的對象。