最近在重温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>