关于request和session的生命周期

我们都知道jsp中传值 会涉及到 request,session,application这三个容器。
当我们想做一些缓存或者存储一些全局变量时,就要考虑到它们的生命周期。

我们也有会疑惑一台计算机上打开同一WEB应用是否只产生一个session?

我们可以做对比了解:

application

全局作用范围,整个应用程序共享,就是在部署文件中的同一个webApp共享,生命周期为:应用程序启动到停止。

session

会话作用域,当用户首次访问时,产生一个新的会话,以后服务器就可以记住这个会话状态。生命周期:会话超时,或者服务器端强制使会话失效。

打开一个浏览器请求一个网站的页面后,Session开始,当session超过时间限制(一般是20分种)后,session注销而失效或是人为使用session.invalidate();使用session失效。

用浏览器打开一个web程序,一个浏览器窗口就会有一个session,且是唯一的,过了session的生存周期就没了,或者是你关了窗口也就没了。

不同浏览器的session在计算机中并不是同一个。

request

请求作用域,就是客户端的一次请求。比如访问某个页面,就是一次请求。页面访问结束,该页面的request就结束了

ps

由上可知,如果我们有一份比较大的数据想做缓存。可以使用application 或者 session。 但是 application 占用的是服务器的资源,需要自己写数据清除。session当用户缓存就比较简便,占用的是客户端资源,会自动失效。

最近在重温jsp,之前呢已经看过一遍,有些东西忘了。而在做java web开发时,request,session又是用的比较多的。尤其是页面的跳转传值问题,或多或少地会用到request和session,由于有些东西现在知道,过一段时间会忘,现将request和session的生命周期总结如下:

首先是session,比如我们在实现一个购物车功能时,在某一页面(这里称为页面A)选择了一些购物的商品,添加到购物车。那么当我们选择完成后点击我的购物车时会跳转到一个购物车页面(这里称为页面B),这和页面A是两个不同的页面,那么怎么讲页面A选取的商品添加到页面B呢。这里一种解决方案就是session。直接上一个demo了:

A.jsp页面:

<body>
    <h1>A界面</h1>
    <%
        session.setAttribute("name","苹果");//这是jsp文件,如果是Servlet的话,先得获得Session,HttpSession hs=request.getSession(true);
     %>

  </body>

B.jsp页面:

<body>
    <h1>B界面</h1>
    <%
    String name1=(String)session.getAttribute("name");
     %>
     <p>Session的值为:<%=name1 %></p>
 </body>

上面就达到了一个传值得目的,当然,我们谈的是session的生命周期,Tomcat里,默认的session生命周期是30min,也就是你不操作界面的时间,你一刷新界面的话,session会重新计时的,那么session的默认时间可以改么,答案是肯定的。可以在Tomcat目录下的conf文件下的web.xml进行修改,如下图所示,默认是30min,修改的话改个数值就行了:

恩 默认的可以设置,那么我们每个应用程序的session可以自己设置生命周期呢,答案是可以的。比如在A.jsp界面加句话就行了。

A.jsp页面:
<body>
    <h1>A界面</h1>
    <%
        session.setAttribute("name","苹果");//这是jsp文件,如果是Servlet的话,先得获得Session,HttpSession hs=request.getSession(true);

        session.setMaxInactiveInterval(5);
     %>
  </body>

这里session.setMaxInactiveInterval(5);设置的是有效时间5秒,这里是以秒为单位的。

那么比如我从A界面跳转到B界面,B界面会显示Asession传过来的session内容,但是如果我5秒内没有动过B界面,那么再次刷新A界面时, 将不会再获得session内的值了,因为这个session失效了。好了session生命周期相关先介绍到这里。

下面介绍request,request有两个方法:getParameter()和getAttribute(),详情请见博客:http://blog.csdn.net/jcy1009015337/article/details/53768512

现在有两个界面test1.jsp,test2.jsp,当我们在浏览器中输入http://127.0.0.1:8080/UserManageSys/test2.jsp时,一个request就产生了,也就是生命周期的开始。test1.jsp的request中,我们可以设置一些值,比如我在test1.jsp是这样设置的:

<body>
    <h1>test1界面</h1>
    <%
        request.setAttribute("name", "jingchenyong");
     %>
     <a href="test2.jsp"></a>
  </body>

上面setAttribue是在request中设置值的。那么问题来了,就像购物一样,我们需要从test1.jsp界面跳转访问test2.jsp界面,是否test2.jsp界面中的request也保存test1.jsp中的request值呢,那么下面我们接着讨论。一般来说有两种处理方式实现跳转,一种是response.sendRedirect,另一种是request.getRequestDispatcher("xxx.jsp").forward(request,response);

用第一种方法,那么test1.jsp中的request不会传递到test2.jsp。

用第二种方法,request的生命周期将延续下去,当采用forward如果到达JSP页面,那么之前从第一个JSP页面中发送出来的request的消息将仍然存在,新的页面同样能够取得该request里所包含的一些信息,比如之前的JSP发送request中所包含的参数信息.事实上,它们是同一个request。

这里注意一下:第二种方法中,如果在页面中通过setAttribute()设置一个Object值到request中,那么再另一个页面中可以通过getAttribute()来获得值,这里值是Object类型的。

下面是test1.jsp和test2.jsp页面的代码:

test1.jsp

<body>
    <h1>test1界面</h1>
    <%
        request.setAttribute("name", "jingchenyong");
        request.getRequestDispatcher("test2.jsp").forward(request,response);
     %>
     <a href="test2.jsp"></a>
</body>

test2.jsp

<body>
    <hr>test2界面</hr>
    <%
    String name=(String)request.getAttribute("name");
     %>
     <p>值为:<%=name %></p>
</body>

转载博客1

转载博客2

猜你喜欢

转载自blog.csdn.net/acDream_/article/details/82557122