">
javaBean的四种保存范围是围绕四种内置对象而展开的,在前面的jsp内置对象详解中我们已经学习过了page、request、session和application。
在标签指令<jsp:useBean id="" scope="范围"/>中的scope就是属性范围,有page、request、session和application这四种语法
关于JavaBean的保存范围
在<jsp:useBean>的指令上存在了另一个scope属性,表示的是一个javaBean的保存范围,保存的范围一共有四种:
1. page: 保存在一页的范围之中,跳转之后此javaBean无效了;
2. request:一个javaBean对象可以保存在一次服务器跳转范围中;
3.session:在一个用户的操作范围中保存,重新打开浏览器的时候才会声明新的javaBean;
4.application:在整个服务器上保存,服务器关闭时才会消失
实例验证四种javaBean属性范围
下面做一个程序实例,是用于网页计数的。
先写一个javaBean,叫做count.java
- count.java
- package javaBean01; //放在包中
- public class count {
- private int count=0;
- public count(){ // 无参构造 我们用来观察服务器用
- System.out.println("======一个新的count对象产生=====");
- }
- public int getCount(){ //实现累加计数功能
- return ++ this.count;
- }
- }
有了javaBean了,我们来做接受页面,叫做javaBean.jsp,这个页面的属性我们分别定义为page、request、session、application;
一。当属性是page的时候
- javaBean.jsp
- <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
- <html>
- <head>
- <title>WEB开发项目</title>
- </head>
- <jsp:useBean id="cou" scope="page" class="javaBean01.count"/>
- <body>
- <h3>第<jsp:getProperty name="cou" property="count"/>次访问!</h3>
- </body>
- </html>
运行一下javaBean.jsp页面,显示结果为第1次访问,然后刷新,不论怎么刷新都是第1次。因为我们定义的页面属性为page,只能在当前页面有效,服务器是不会累加的。 我们在来看一下服务器,此时的tomcat服务器如下图所示:
也就是说,随着页面的刷新,javaBean会自动生成一个count对象。刷新一次生成一个。如果我们让javaBean.jsp页面跳转到javaBean_01.jsp页面上又会是怎样的结果?
将javaBean.jsp改成如下,然后做javaBean_01.jsp页面,让javaBean.jsp跳转到javaBean_01.jsp上
- javaBean.jsp
- <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
- <html>
- <head>
- <title>WEB开发项目</title>
- </head>
- <jsp:useBean id="cou" scope="page" class="javaBean01.count"/>
- <body>
- <h3>第<jsp:getProperty name="cou" property="count"/>次访问!</h3>
- <jsp:forward page="javaBean_01.jsp"/>
- </body>
- </html>
- javaBean_01.jsp
- <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
- <html>
- <head>
- <title>WEB开发项目</title>
- </head>
- <jsp:useBean id="cou" scope="page" class="javaBean01.count"/>
- <body>
- <h3>第<jsp:getProperty name="cou" property="count"/>次访问!</h3>
- </body>
- </html>
这个时候运行一下javaBean.jsp页面,显示依然是第1次访问,但是看服务器,刷新一次页面就会有两个count对象产生,为什么是两个呢? 在javaBean.jsp页面上生成一个,但是遇到page跳转后,它会再生成一个对象,所以就会产生两个页面。
二、当属性是request的时候
当属性是page的时候,对象只在一个jsp文件中保存,那么要想在一次跳转中保存,肯定就是request属性了。
- javaBean.jsp
- <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
- <html>
- <head>
- <title>WEB开发项目</title>
- </head>
- <jsp:useBean id="cou" scope="request" class="javaBean01.count"/>
- <body>
- <h3>第<jsp:getProperty name="cou" property="count"/>次访问!</h3>
- <jsp:forward page="javaBean_01.jsp"/>
- </body>
- </html>
- javaBean_01.jsp
- <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
- <html>
- <head>
- <title>WEB开发项目</title>
- </head>
- <jsp:useBean id="cou" scope="request" class="javaBean01.count"/>
- <body>
- <h3>第<jsp:getProperty name="cou" property="count"/>次访问!</h3>
- </body>
- </html>
将属性改成request后,运行一下javaBean.jsp,此时浏览器上的显示由原来的第1次变成了第2次,之后将不再累加了,此时的服务器上只有一个对象产生,不论你怎么刷新,始终都是一个对象,也就是说它会在服务器上保存着。
<jsp:useBean id="cou" scope="request" class="javaBean01.count"/>的好处是这条语句实际上节约了判断的步骤,节约了以下步骤:
request。setAttribute("cou",new count());
第二个页面
count c=request.getAttribute("cou");
if(c==null){ c=new count(); }
c.getCount();
三、当属性是session的时候
因为是session,所以就不需要跳转页面了 ,因为不管是客户端还是服务器端都一样。那么此时只需要有一个javaBean.jsp即可。
- javaBean.jsp
- <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
- <html>
- <head>
- <title>WEB开发项目</title>
- </head>
- <jsp:useBean id="cou" scope="session" class="javaBean01.count"/>
- <body>
- <h3>第<jsp:getProperty name="cou" property="count"/>次访问!</h3>
- </body>
- </html>
运行一下,浏览器上随着页面的刷新,可以发现访问次数逐渐累加,刷新几次,级访问几次,而服务器上依然只有一个对象产生。但是重启一下浏览器就会发现,服务器上产生了一个对象,重启一次浏览器就产生一个对象。因为关闭浏览器后session就不存在了,重启后就会重新创建,也会重新产生一个新的count对象。
四、当属性是application的时候
当属性是application的时候那就更简单了,因为application是服务器的联系,只要服务器器不关闭,就会一直保持着。
- javaBean.jsp
- <%@ page language="java" contentType="text/html" pageEncoding="utf-8"%>
- <html>
- <head>
- <title>WEB开发项目</title>
- </head>
- <jsp:useBean id="cou" scope="application" class="javaBean01.count"/>
- <body>
- <h3>第<jsp:getProperty name="cou" property="count"/>次访问!</h3>
- </body>
- </html>
运行一下,浏览器中随着页面的刷新,访问次数会不断增加,而服务器上始终都是一个对象。假设浏览器中刷新到了第6次访问,然后关闭浏览器,重新启动浏览器,此时会发现上来就是从第7次开始访问的。而重新启动浏览器后服务器依然是一个对象,不会再产生新的对象了。
至此,关于javaBean的属性范围我们就学习完了,注意的是一定要亲自运行代码,亲自观察服务器的对象产生,如果还是很乱的话,我们来一起做一个总结吧。
总结:
访问次数 服务器对象产生个数 原因
1.page 始终1次 页面刷新一次产生一个 page只在当前页面生效
2.request 始终2次 刷新一次产生两个 跳转会再生成一个对象
3.session 随着刷新累加 不随刷新增加,始终是一 session一次性会话机制
,重启浏览器后 个,只有重启浏览器才会
从1次开始 增加一个
4.application 随着刷新累加 不随刷新增加,始终是 application是直接作用
重启浏览器后依然 一个,重启浏览器也 于服务器的
从 上次访问次数开始 不会增加了
一定要注意:四种内置对象一定要弄明白是怎么回事,要理解它们的原理,把握好它们的核心,因为在之后的学习中四种内置对象依然是开发的重点。