一JavaBean作用域
JavaBean就是把程序中的实体对象及业务逻辑单独的封装到Java类当中。然后再JSP页面中调用这个封装好的
类,这样可以降低HTML与Java代码的耦合度,简化界面。
JavaBean有四个作用域范围,我们使用<jsp:useBean>动作元素的scope属性可以用来指定JavaBean的作用范
围。实际上,JSP页面的四大作用域是和JavaBean的四个作用域实质上是相同的,那么我们就来看看JavaBean的四
大作用域。
JavaBean四种作用域范围说明:
1)pagez作用域:仅在当前页面有效。
2)request作用域:可以通过HttpRequest.getAttribute()方法取得JavaBean对象。
3)session作用域:可以通过HttpSession.getAttribute()方法取得JavaBean对象。
4)application作用域:可以通过application.getAttribute()方法取得JavaBean对象。
JSP九大内置对象的作用域:
二application作用域
application可以作用于整个Web应用程序。接下来我们就测试一下:
我们有一个JavaBean类为Users,Users.java源代码:
package com.entity;
/**
* 用户实体类的访问属性是public
* @author Administrator
* @date 2016年7月11日
*/
public class Users {
//私有属性
private String username;
private String password;
//无参构造器
public Users(){
}
//通过重构得到setter和getter方法
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
我们做的登录页面login.jsp源代码:
<span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span><%@ 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>登录页面</title>
</head>
<body>
<h1>登录表单</h1>
<hr>
<form name="loginForm" action="dologin.jsp" method="post">
<table>
<tr>
<td>用户名:</td>
<td><input type="text" name="username" value="" /></td>
</tr>
<tr>
<td>密码:</td>
<td><input type="password" name="password" value="" /></td>
</tr>
<tr>
<td colspan="2" align="center"><input type="submit" value="登录" /></td>
</tr>
</table>
</form>
</body>
</html><span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span>
在先前的dologin.jsp页面稍加改动:
<span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span><%@ 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>登录页面</title>
</head>
<body>
<%
//防止中文乱码
request.setCharacterEncoding("utf-8");
%>
<h1>setProperty动作元素的使用</h1>
<hr>
<jsp:useBean id="myUsers" class="com.entity.Users" scope="application"></jsp:useBean>
<!-- 通过request对象得到属性值 -->
用户名:<%=request.getParameter("username") %><br>
密码:<%=request.getParameter("password") %><br>
<hr>
<!-- 根据表单自动匹配所有属性 -->
<jsp:setProperty property="*" name="myUsers"/>
用户名:<%=myUsers.getUsername() %><br>
密码:<%=myUsers.getPassword() %><br>
<hr>
<!-- 根据表单匹配部分的属性 -->
<jsp:setProperty property="username" name="myUsers"/>
<jsp:setProperty property="password" name="myUsers"/>
用户名:<%=myUsers.getUsername() %><br>
密码:<%=myUsers.getPassword() %><br>
<hr>
<!-- 跟表单无关,通过手动赋值给属性 -->
<jsp:setProperty property="username" name="myUsers" value="Rose" />
<jsp:setProperty property="password" name="myUsers" value="888888" />
用户名:<%=myUsers.getUsername() %><br>
密码:<%=myUsers.getPassword() %><br>
<hr>
<!-- 通过URL传参数给属性赋值 -->
<jsp:setProperty property="username" name="myUsers" param="user" />
<jsp:setProperty property="password" name="myUsers" param="pass" />
用户名:<%=myUsers.getUsername() %><br>
密码:<%=myUsers.getPassword() %><br>
<hr>
<h1>测试JavaBean的四个作用域范围</h1>
<a href="scope.jsp">测试JavaBean的四个作用域范围</a>
</body>
</html><span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span>
我们新建的scope.jsp页面源代码:
<span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span><%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 引入包 -->
<%@ page import="com.entity.Users" %>
<!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>JavaBean作用域范围</title>
</head>
<body>
<h1>JavaBeab的四个作用域范围</h1>
<hr>
<jsp:useBean id="myUsers" class="com.entity.Users" scope="application"></jsp:useBean>
用户名:<jsp:getProperty property="username" name="myUsers"/><br>
密码:<jsp:getProperty property="password" name="myUsers"/><br>
<!-- 使用内置对象application获取用户名和密码 -->
<hr>
用户名:<%=((Users)application.getAttribute("myUsers")).getUsername() %><br>
密码:<%=((Users)application.getAttribute("myUsers")).getPassword() %><br>
</body>
</html><span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span>
还是从login.jsp页面进行测试的结果:
三session作用域
在dologin.jsp页面继续修改:
在scope.jsp页面添加代码:
最终结果:
四request作用域
继续在dologin.jsp页面修改:
scope.jsp页面添加代码:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 引入包 -->
<%@ page import="com.entity.Users" %>
<!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>JavaBean作用域范围</title>
</head>
<body>
<h1>JavaBeab的四个作用域范围</h1>
<hr>
<jsp:useBean id="myUsers" class="com.entity.Users" scope="request"></jsp:useBean>
用户名:<jsp:getProperty property="username" name="myUsers"/><br>
密码:<jsp:getProperty property="password" name="myUsers"/><br>
<!-- 使用内置对象application获取用户名和密码 -->
<hr>
用户名:<%=((Users)application.getAttribute("myUsers")).getUsername() %><br>
密码:<%=((Users)application.getAttribute("myUsers")).getPassword() %><br>
<!-- 使用内置对象session获取用户名和密码 -->
<hr>
用户名:<%=((Users)session.getAttribute("myUsers")).getUsername() %><br>
密码:<%=((Users)session.getAttribute("myUsers")).getPassword() %><br>
<!-- 使用内置对象request获取用户名和密码 -->
<hr>
用户名:<%=((Users)request.getAttribute("myUsers")).getUsername() %><br>
密码:<%=((Users)request.getAttribute("myUsers")).getPassword() %><br>
</body>
</html>
测试结果:
dologin.jsp页面中的超链接输入输入重定向,相当于向服务器发送了一次新的请求,因此获取的都是null。
要想获得用户名和密码。需要在dologin.jsp页面中修改使用服务器转发:
测试结果:
五page作用域
继续在dologin.jsp页面中修改:
scope.jsp页面源代码:
<span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span><%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!-- 引入包 -->
<%@ page import="com.entity.Users" %>
<!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>JavaBean作用域范围</title>
</head>
<body>
<h1>JavaBeab的四个作用域范围</h1>
<hr>
<jsp:useBean id="myUsers" class="com.entity.Users" scope="page"></jsp:useBean>
用户名:<jsp:getProperty property="username" name="myUsers"/><br>
密码:<jsp:getProperty property="password" name="myUsers"/><br>
<%--
<!-- 使用内置对象application获取用户名和密码 -->
<hr>
用户名:<%=((Users)application.getAttribute("myUsers")).getUsername() %><br>
密码:<%=((Users)application.getAttribute("myUsers")).getPassword() %><br>
<!-- 使用内置对象session获取用户名和密码 -->
<hr>
用户名:<%=((Users)session.getAttribute("myUsers")).getUsername() %><br>
密码:<%=((Users)session.getAttribute("myUsers")).getPassword() %><br>
<!-- 使用内置对象request获取用户名和密码 -->
<hr>
用户名:<%=((Users)request.getAttribute("myUsers")).getUsername() %><br>
密码:<%=((Users)request.getAttribute("myUsers")).getPassword() %><br>
--%>
<!-- 使用内置对象pageContext获取用户名和密码 -->
<hr>
<%
String username = "";
String password = "";
if(pageContext.getAttribute("myUsers")!=null){
<span style="white-space:pre"> </span>username = ((Users)pageContext.getAttribute("myUsers")).getUsername();
<span style="white-space:pre"> </span>password = ((Users)pageContext.getAttribute("myUsers")).getPassword();
}
%>
用户名:<%=username %><br>
密码:<%=password %><br>
</body>
</html><span class="tag" style="border: 0px; margin: 0px; padding: 0px; color: rgb(0, 0, 136);"></span>
运行结果:
六总结
scope取值page
有效范围为包含<jsp:useBean>元素的JSP文件以及此文件中的所有静态包含文件,直到页面执行完毕向客户端发
回响应或转到另一个页面为止。JavaBean实例被保存在当前页面的pageContent对象内.用户可以通过隐含对象
pageContext访问JavaBean。
代码如下: pageContext.getAttrib(beanIntanceName)
其中beanInstanceName为useBean标签中声明JavaBean实例的id属性值。
scope取值request
有效范围为任何执行相同请求的JSP页面中,直到页面执行完毕向客户端发回响应或转到另一个页面止。
JavaBean实例被保存在ServletRequest对象内.用户可以通过隐含对象request访问JavaBean。
代码如下:request.getAttribute(beanInstanceName)
其中beanInstanceName为useBean标签中声明JavaBean实例的id属性值.