请求转发
转发的概述
一个Web组件(Servlet/JSP)将未完成的处理通过容器转交给另外一个Web组件继续处理,服务器内部跳转, 转发的各个组件会共享Request和Response对象
转发的特点
· 转发之后浏览器地址栏的URL不会发生改变
· 转发过程中共享Request对象(一次请求有效)
· 转发的URL不可以是其它项目工程
案例
前台传参到a,a再转发到b,b在传给前台
案例2
1.在queryServlet中查询所有的用户(模拟数据库查询)2.将所有用户的集合存储到request对象中3.跳转到showServlet4.showServlet将用户集合进行遍历, 把每一个用户信息通过响应输出流, 输出到浏览器(输出html页面)·思路分析1.访问queryServlet2.queryServlet中查询所有用户(模拟查询数据库), 将用户集合设置到request对象中 req.setAttribute(key,value)3.需要传递数据, 使用请求转发将请求转发到showServelt req.getRequestDispather.forward(req,resp)4.showServlet中获取用户集合并遍历用户集合, 将每一条用户信息通过响应输出流输出到浏览器(输出html)
重定向
转发,就是客户端发送数据请求到客户端,发送完毕之后,由其中一个servlet转发到另外一个servlet,然后传到前台
重定向,就是请求到达一个servlet之后,会传递一个302到客户端,随后客户端在拿着我们之前设置好的信息,去请求另外一个servlet,路径也会变成另外一个servlet路径,
首先客户端浏览器发送http请求,当web服务器接受后发送302状态码响应及对应新的location给客 户浏览器,客户浏览器发现是302响应,则自动再发送一个新的http请求,请求url是新的location 地址,服务器根据此请求寻找资源并发送给客户
重定向的特点
·重定向之后,浏览器地址栏的URL会发生改变。
·重定向过程中会将前面Request对象销毁,然后创建一个新的Request对象。
·重定向的URL可以是其它项目工程
重定向的实现
实现重定向需要借助javax.servlet.http.HttpServletResponse接口中的以下方法:
注意事项:
重定向的路径必须为 /项目名+/资源名
案例:
注意
如果是多次请求,前台的状态码是302,是无法进行传参的
案例:
用户访问登录页面
用户名或密码错误, 响应输出一句话 登录失败
用户名和密码正确, 跳转到queryServlet查询所有用户, 跳转到showServlet向浏览器输出每一条用户信息(输出 html)
·思路分析:
用户名密码正确, 重定向到queryServlet(不需要传递任何数据)queryServlet和showServlet处理过程和上个案例相同
(回顾)queryServlet将用户集合设置到request对象, 请求转发到showServlet(需要传递数据), 响应输出用户的每一条信息
登出
转发和重定向的总结
请求转发(需要传递数据 如: 查询):
请求转发一次请求,Tomcat服务器内部的行为,共享同一个Request对象
一次请求就将用户的需求完整的处理完毕。 一般用户发起的查询功能会使用请求转发来完成请求的处理以及结果的响应。而增,删,改的请求,因为请求转发的地址栏信息是不改变的,容易造成用户刷新一次页面就重新增,删,改了一次(造成表单重复提交)
重定向(不需要传递数据 如: 增,删,改):
多次次请求,地址栏改变,经常处理增,删,改的请求, 增删改请求处理完, 一般不需要响应任何的数据
可以保护第一次的请求,避免用户因为刷新页面造成数据的重复提交
Servlet线程安全
线程不安全, 只会实例化一次, 默认第一次被调用, load-on-startup配置tomcat启动时servlet创建
服务器在收到请求之后,会启动一个线程来进行相应的请求处理服务器为每个Servlet只创建一个实例。 当多个请求访问同一个Servlet时,有多个线程访问同一个Servlet对象,使用成员变量会出现线程安全问题, 所以尽量使用局部变量
状态管理
·Web程序基于HTTP协议通信,而HTTP协议是”无状态”的协议,一旦服务器响应完用户的请求之后,就断开连接,而同一个用户的下一次请求又会重新建立网络连接
·服务器程序有时是需要判断是否为同一个用户发出的请求,比如用户的多次选购商品, 因此,有必要跟踪同一个用户发出的一系列请求
·把浏览器与服务器之间多次交互作为一个整体,将多次交互所涉及的数据保存下来,即状态管理
·多次交互的数据状态可以在客户端保存,也可以在服务器端保存
·状态管理主要分为以下两类:
客户端管理:将状态保存在客户端。基于Cookie技术实现
服务器管理:将状态保存在服务器端。基于Session技术实现