接着来看JSP内置对象。
response对象
response对象是javax.servlet.http.HttpServletResponse类的实例。当服务器创建request对象时会同时创建用
于响应这个客户端的response对象。
response对象也定义了处理HTTP头模块的接口。通过这个对象,开发者们可以添加新的cookies,时间戳,
HTTP状态码等等。
response对象包含了响应客户请求的有关信息,但在JSP中很少直接用到它。response对象具有页面作用域,即
访问一个页面时,该页面的response对象只能对这次访问有效,其它页面的response对象对当前页面无效。
response对象代表的是对客户端的响应,主要是将JSP容器处理过的对象传回到客户端。response对象也具有作
用域,它只在JSP页面内有效。
response对象常用方法如下:
实例:
我们创建一个名字叫做response.jsp页面:
运行结果:
我们看到输出的顺序和我们编写代码的顺序有出入,PrintWriter对象的输出提前于内置对象out对象的输出,那
么我们怎么做到正常顺序输出呢?
在输出之前我们强制清空缓冲区,就可以做到:
运行结果:
我们学习了reuqest对象和reposnse对象,那么再来看一个重要的知识点就是请求重定向与请求转发。
生活实例:
假设你去办理某个护照:
重定向:你先去了A局,A局的人说:“这个事情不归我们管,去B局”,然后,你就从A退了出来,自己乘车去
了B局。
转发:你去了A局,A局看了以后,知道这个事情其实应该B局来管,但是他没有把你退回来,而是让你坐一会
儿,自己到后面办公室联系B的人,让他们办好以后,送了过来。
使用代码验证
请求重定向:客户端行为,response.sendRedirect()。从本质上讲等同于两次请求,前一次请求对象不会保存,
地址栏的URL地址会改变。
例子:
我们继续使用reg.jsp用户注册页面,只不过需要提交的页面改为:
在response.jsp页面我们使用response对象重定向到request.jsp页面:
在注册页面输入用户名和选择爱好:
最后的结果:
请求转发:服务器端行为,request.getRequestDispatcher().forward(requset,response); 是一次请求,转发
后请求对象会保存,地址栏的URL地址不会改变。
还是上面那个例子:
这一次我们在response.jsp页面中把请求重定向注释掉,输入下面的一行转发代码:
还是输入用户名和选择爱好, 最后的结果:
session对象
什么是session?
session表示客户端与服务器的一次会话。Web中的session指的是用户在浏览某个网站时,从进入网站到浏览器
关闭所经过的这段时间,也就是用户浏览这个网站所花费的时间。从上述的定义中可以看到,session实际上是一个特
定的时间概念。在服务器的内存中保存着不同用户的session。
从一个客户打开浏览器并连接到服务器开始,到客户关闭浏览器离开这个服务器结束,被称为一个会话。当一个
客户访问一个服务器时,可能会在这个服务器的几个页面之间反复连接,反复刷新一个页面,服务器应当通过某种办
法知道这是同一个客户,这就需要session对象。
session对象
session对象是javax.servlet.http.HttpSession类的实例。session对象是由服务器自动创建的与用户请求相关的
对象。服务器为每个用户都生成一个session对象,用于保存该用户的信息,跟踪用户的操作状态。session对象内部
使用Map类来保存数据,因此保存数据的格式为"Key/value"。 session对象的value可以使复杂的对象类型,而不仅
仅局限于字符串类型。
session对象的ID指的是当一个客户首次访问服务器上的一个JSP页面时,JSP引擎产生一个session对象,同时分
配一个String类型的ID号,JSP引擎同时将这个ID号发送到客户端,存放在Cookie中,这样session对象和客户之间就
建立了一一对应的关系。当客户再访问连接该服务器的其他页面时,不再分配给客户新的session对象,直到客户关闭
浏览器后,服务器端该客户的session对象才取消,并且和客户的会话对应关系消失。当客户重新打开浏览器再连接到
该服务器时,服务器为该客户再创建一个新的session对象。会话结束指的是和session相关的页面全部关闭。
session对象存在一定时间过期问题,所以存在session中的名值对会在一定时间后失去,可以通过更改session有
效时间来避免这种情况。同时编程时尽量避免将大量有效信息存储在session中,request是一个不错的替代对象。
session是JSP的四大域之一,但我们常用session来做会话管理/会话跟踪,就是在用户登录的时候,把用户的登
陆信息放进session里面,并在一些内部页面校验是否是当前的session ,以确保当前用户不是游客,并且拥有更多的权
限,如添加到购物车,支付购买等。并且通常情况下我们只设置一个session所以,用户登录时就会被自动把用户信息
保存到session域里面。
当你浏览商品,点击购买会提示你还没有登陆,直到登陆后,你的session才开始跟踪你的浏览记录,你才拥有购
买的权限。session是保存在服务器的,底层依赖于cookie,你在浏览器的整个浏览记录都会被保存到cookie(缓存)当
你登录的时候,服务器端的session才会创建(记住,session只保存与用户相关的信息)。
我们生活中的购物流程:
session对象常用的方法:
实例:
我们来创建两个JSP页面,一个是session_page1.jsp页面:
另一个是session_page2.jsp页面:
运行结果:
我们在session_page1.jsp页面中可以设置session保存的多个属性与属性值:
那么在session_page2.jsp也可能需要接受这么多:
最后运行结果:
session生命周期
1)创建:
当客户端第一次访问某个JSP或者Servlet时候,服务器会为当前会话创建一个sessionId,每次客户端向服务器端
发送请求时,都会将此sessionId携带过去,服务器会对此sessionId进行校验。
2)活动:
某次会话当中通过超链接打开的新页面属于同一次会话。
只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。
除非本次会话的所有页面都关闭后再重新访问某个JSP或者Servlet将会创建新的会话。
注意事项:注意原有会话还存在,只是这个旧的sessionId仍然存在于服务端,只不过再也没有客户端会携带它然
后交予服务端校验。
3)销毁:
session的销毁有三种方式:
1调用了session.invalidate()方法
2session过期(超时)
3服务器重新启动
实例:
我们在session_page1.jsp页面中设置最大的生命周期时间,过了期限那么跳转到session_page.jsp页面接受到的
信息就不会保存。
在session_page1.jsp页面增加一行代码:
运行结果:
在session_page1.jsp页面中设置了setMaxInactiveInterval()的时间,比如setMaxInactiveInterval(10),无论你
是否跳转到session_page2.jsp页面,10s后,session_page1的session的ID就无效了,所以session_page2后面的
sessionId也无效。
我们可以通过代码验证上面session生命周期活动这一阶段的结论。
1)测试某次会话中通过超链接打开新的页面属于同一次会话
这个我们已经在上面遇到过,这一次还是使用同样的代码进行演示:
sessionLifeDemo.jsp页面代码:
session_page2.jsp页面代码还是不变。
运行结果:
2)只要当前会话页面没有全部关闭,重新打开新的浏览器窗口访问同一项目资源时属于同一次会话。
我们在不关闭sessionLifeDemo.jsp页面和session_page2的情况下,再次重新打开新的浏览器窗口,这一次我们
单独访问session_page2.jsp页面,ID编码还是和上面相同的,说明,这种情况还是属于同一次会话。
请看结果:
3)本次会话的所有页面都关闭后再重新访问某个JSP或者Servlet将会创建新的会话。
我们这一次全部关闭本次会话的所有页面,重新启动浏览器,重新打开sessionLifeDemo.jsp页面。
重新打开的结果:
4)使用sessio对象的invalidate()方法是销毁当前会话
每次刷新页面,都会进行新的一次会话,也就是sessionId每次刷新后都不同。session是服务器端保存用户信
息,创建时服务器端生成相应的sessionId,接下来的客服端与服务器端的联系标识就是该sessionId。销毁是将服务
器端的session信息释放,资源回收。
这个比较简单,就不再验证。