一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九大内置对象的作用域:

       

JavaBean的作用域 csdn javabean作用域从大到小排序_JavaBean的作用域 csdn

       二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页面进行测试的结果:

       

JavaBean的作用域 csdn javabean作用域从大到小排序_JavaBean的作用域 csdn_02

       三session作用域

       在dologin.jsp页面继续修改:

       

JavaBean的作用域 csdn javabean作用域从大到小排序_作用域_03

       在scope.jsp页面添加代码:

       

JavaBean的作用域 csdn javabean作用域从大到小排序_作用域_04

       最终结果:

       

JavaBean的作用域 csdn javabean作用域从大到小排序_JavaWeb_05

       四request作用域

       继续在dologin.jsp页面修改:

       

JavaBean的作用域 csdn javabean作用域从大到小排序_JavaWeb_06

       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>


       测试结果:

       

JavaBean的作用域 csdn javabean作用域从大到小排序_JavaWeb_07

       dologin.jsp页面中的超链接输入输入重定向,相当于向服务器发送了一次新的请求,因此获取的都是null。

       要想获得用户名和密码。需要在dologin.jsp页面中修改使用服务器转发:

       

JavaBean的作用域 csdn javabean作用域从大到小排序_JavaBean_08


       测试结果:       

JavaBean的作用域 csdn javabean作用域从大到小排序_JSP页面四大作用域_09

       五page作用域

       继续在dologin.jsp页面中修改:

       

JavaBean的作用域 csdn javabean作用域从大到小排序_JSP页面四大作用域_10

       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>


       运行结果:

       

JavaBean的作用域 csdn javabean作用域从大到小排序_JSP页面四大作用域_11

       六总结

       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属性值.