关于request和session的生命周期
阅读原文时间:2021年04月20日阅读:1

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

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

A.jsp页面:


   

A界面


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

 

B.jsp页面:

   

B界面

    <%     String name1=(String)session.getAttribute("name");      %>      

Session的值为:<%=name1 %>

 

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

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

A.jsp页面:

   

A界面


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

        session.setMaxInactiveInterval(5);
     %>
 

这里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是这样设置的:

   

test1界面

    <%         request.setAttribute("name", "jingchenyong");      %>        

上面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

   

test1界面

    <%         request.setAttribute("name", "jingchenyong");         request.getRequestDispatcher("test2.jsp").forward(request,response);      %>      

test2.jsp

   


test2界面     <%     String name=(String)request.getAttribute("name");      %>      

值为:<%=name %>