Servlet之请求转发与重定向区别

         前言

                       在前面一片文章中笔者实现了一个简单的登陆验证的功能,在验证中涉及到了两种页面java

                 跳转的方式  请求转发重定向。那么这两种方式到底有什么区别呢?在这篇文章中,笔者web

                 将结合实例进行探讨。浏览器

        请求转发

                    在实际的开发中咱们有着这样一种需求,即在客户端浏览器的一次请求中咱们但愿这个请求服务器

               (Request)能够转交给多个Servlet进行处理以完成更复杂的逻辑功能,这种把一次HTTP请求移jsp

                交给多个Servlet进行处理的方式就是 请求转发。ide

                    须要明白的是请求转发是服务器端的行为,当客户端浏览器进行一次请求以后,请求转发这一spa

                过程就不涉及到客户端的行为了。服务器经过RequestDispatcher对象将“请求”的控制权交给.net

                不一样的Serlvet完成一些列的逻辑功能。code

                    具体的过程以下:对象

                       客户端浏览器发送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      

相关文章
相关标签/搜索