前言
在前面一片文章中笔者实现了一个简单的登录验证的功能,在验证中涉及到了两种页面
跳转的方式 请求转发 和重定向。那么这两种方式到底有什么区别呢?在这篇文章中,笔者
将结合实例进行探讨。
请求转发
在实际的开发中我们有着这样一种需求,即在客户端浏览器的一次请求中我们希望这个请求
(Request)可以转交给多个Servlet进行处理以完成更复杂的逻辑功能,这种把一次HTTP请求移
交给多个Servlet进行处理的方式就是 请求转发。
需要明白的是请求转发是服务器端的行为,当客户端浏览器进行一次请求之后,请求转发这一
过程就不涉及到客户端的行为了。服务器通过RequestDispatcher对象将“请求”的控制权交给
不同的Serlvet完成一些列的逻辑功能。
具体的过程如下:
客户端浏览器发送HTTP请求(LoginSerlvet)-->Tomcat容器初始化LoginSerlet、并调用相关
业务逻辑方法-->LoginServlet通过RequestDispatcher将请求控制权移交给CheckSerlvet-->
checkServlet完成登录验证。
值得注意的是请求转发这一过程只能在同一web应用中进行。
可以看出的是浏览器并未参与到请求转发这一过程中去,而且我们可以从浏览器的地址的
情况来说明。虽然将请求转发给CheckServlet但是浏览器地址仍显示的是LoginSerlet。
根据上图可以知道请求转发的调用方式是通过RequestDispatcher对象来实现的,具体调用
代码如下:
//跳转到首页,请求转发方式
request.getRequestDispatcher("index.jsp").forward(request, response);
或者这种方式实现调用:
request.getRequestDispatcher("index.jsp").include(request, response);
那么这两种方式又有什么区别呢?
forward方法是把请求的内容转发到另外的一个servlet.而include是把另一个servlet处理过后
的内容拿过来.
口说无凭实例验证一下:
//跳转到首页,请求转发方式
response.setCharacterEncoding("UTF-8");
response.getWriter().write("LoginCheck");
request.getRequestDispatcher("index.jsp").forward(request, response);
这种方式的页面的输出结果只显示index.jsp本身的内容。
接下来看看include方式:
//跳转到首页,请求转发方式
response.setCharacterEncoding("UTF-8");
response.getWriter().write("LoginCheck");
request.getRequestDispatcher("index.jsp").include(request, response);
举个实例来说,请求转发类似于这样一种情况:某某要申请XXX称号,申请书提交给A部门,
A部门完成相关流程之后提交给B部门,之后某某得到批准书之后,虽然有B的参与,但是某某
并不知情。
重定向
重定向是指在客户端发送一次请求的过程中,web服务器向客户端浏览器发送一个HTTP响应,
浏览器接受此响应,并按照服务其提供的URL发送一个新的HTTP请求给服务器,这一过程就称之
为重定向过程。需要注意的是重定向可以定位到任意的URL,不仅限于当前的web应用。这点也
造成了其不能共享request、response数据。
重定向是在客户端发挥作用,通过请求新的地址实现页面转向。。
重定向是通过浏览器重新请求地址,在地址栏中可以显示转向后的地址。
对于此,我们通过一个实例说明:同样以上篇的例子
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//Tomcat将表单信息封装到请求正文中
//通过request对象得到表单信息
String name = request.getParameter("username");
String password = request.getParameter("password");
//验证
if(name.equals("kiritor")&&password.equals("kiritor"))
{
//跳转到首页,请求转发方式
response.setCharacterEncoding("UTF-8");
response.getWriter().write("LoginCheck");
request.getRequestDispatcher("index.jsp").include(request, response);
}
else {
//跳转错误信息页面,请求重定向方式
response.sendRedirect("error.jsp");
}
}
这里我们输入错误的用户名密码
可以看见的是,使用重定向的方式地址栏发生了变化!而且重定向的资源可以不限于本web
读者可以自行尝试。
同样以申请xxx称号为例,你将申请书投递到A部门,A部门对你说他们不负责这块的业务让你去
B部门,所以你重新将申请书投递给B部门。重定向就是这个道理。
参考资料:
http://blog.csdn.net/meiyalei/article/details/2129120