请求转发:
问题:
服务器在接收到浏览器的请求后,仅仅使用一个 Servlet进行请求处理,会造成不同的Servlet逻辑代码 冗余,Servlet的职责不明确。
解决:
使用请求转发。
特点:
一次请求
地址栏信息不改变。
Request 对象作用域
问题:
使用请求转发后,不同的 Servlet 之间怎么进行数据的共享呢?或者说数据怎么从一个 servlet 流转给另外一个 Servlet 呢?
解决:
使用 request 对象的作用域
使用:
request.setAttribute(objectname,Objectvalue);
request.getAttribute(Objectobj)
作用:
解决了一次请求内的不同 Servlet 的数据(请求数据+其他数据)共享问题。
作用域:基于请求转发,一次请求中的所有 Servlet 共享。
注意:
使用 Request 对象进行数据流转,数据只在一次请求内有效。
特点:
服务器创建
每次请求都会创建
生命周期一次请求
重定向
问题:
如果当前的请求,Servlet 无法进行处理怎么办?
如果使用请求转发,造成表单数据重复提交怎么办?
解决:
使用重定向
使用:
response.sendRedirect(“路径”).
本地路径为:uri
网络路径为:定向资源的 URL 信息
特点:
两次请求
浏览器地址栏信息改变
避免表单重复提交
Servlet流程总结: * 浏览器发起请求到服务器(请求) * 服务器接受浏览器的请求,进行解析,创建request对象存储请求数据 * 服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法 * servlet的方法执行进行请求处理 * //设置请求编码格式 * //设置响应编码格式 * //获取请求信息 * //处理请求信息 * //创建业务层对象 * //调用业务层对象的方法 * //响应处理结果 *请求转发学习: * 作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。 * 使用: * req.getRequestDispatcher("要转发的地址").forward(req, resp); * 地址:相对路径,直接书写servlet的别名即可。 * 特点: * 一次请求,浏览器地址栏信息不改变。 * 注意: * 请求转发后直接return结束即可。 *reuqet作用域: * 解决了一次请求内的servlet的数据共享问题 *重定向: * 解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题。 * 使用: * resp.sendRedirect(String uri); * 示例: * resp.sendRedirect("/login/main"); * 特点: * 两次请求,两个request对象。 * 浏览器地址栏信息改变 * 时机: * 如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。 * 如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。 *