jsp/servlet中 forward, include, reDirect 之间的区别

来源:互联网 发布:sql语句中系统时间 编辑:程序博客网 时间:2024/06/09 22:53

讨论它们的区别之前,先让我们看下它们是怎样被调用的?  

 Response.sendRedirect(redirect) redirect="AccessGoalCharts.jsp?rcatID=3&rhaID=All_&doSearch=true” 

实际上,container会将这个 redirect的 url字符串重新送到 Browser interface,相当于用户重新在address栏中输入了一个地址,赫赫, 这样解释简单吧?

   request.getRequestDispatcher("welcome.jsp").forward(request, response); 

我们查一下web.xml,如果我们没有找到相应的servlet  mapping,那么这套 Request和response(也就是原来的browse interface)就被转到 welcome.jsp 去处理了,

welcome.jsp产生的html page也就被返回到了 response(也就是原来的browser interface)

如果在web.xml当中我们找到了相应的 servlet mapping, 

如下所示,  

<servlet-mapping>     

<servlet-name>DemoServlet</servlet-name> 

    <url-pattern>/welcome.jsp</url-pattern> 

 </servlet-mapping> 

那么这套request和response就被forward到了DemoServlet的 doGet或者 doPost去处理了,问题是,getRequestDispatcher为什么不改名字叫做 getURLDispatcher,这不是更加符合 由 web.xml控制的实际情况吗?   

Request.getRequestDispatcher(“welcome.jsp”).include(request,response)和 forward(request,response)的情况一模一样,区别在于,这个response,也就是 Browse Interface在接收了welcome.jsp产生的html page以后(假设在 web,xml当中没有相对应于 welcome.jsp的 servlet-mapping),还可以在这个response( browser interface)当中接收其他的html page,

我测试过的代码如下所示:            

   

request.getRequestDispatcher("welcome.jsp").include(request, response);                     PrintWriter out = response.getWriter();          out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">");                out.println("<HTML>");                out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>");                out.println(" <BODY>");               out.print("    This is " + request.getParameter("name"));             out.print(this.getClass());             out.println(", using the POST method");             out.println(" </BODY>");                out.println("</HTML>");               out.flush();               out.close();   

好了,还有一些考试大全中经常描述的 forward对于 用户来讲是透明的,而 reDirect对于用户来讲是 在browser的地址栏中可见的讲法,都是正确的讲法.     

好,我再用通俗的讲法讲解一下 sendRedirct, forward, include的区别 (基于 servlet api 2.2以上)

  (1)response.sendRedirect(String location)    Sends a temporary redirect response to the client using the specified redirect location URL  

 实际上是给client返回一个临时的response,里面也就一个url,告诉client,我现在已经处理完了你的request,   你应该进入这个URL,它会处理你的request了(这个request的内容您这个client可能就不太清楚了)   

(2)requestDispatcher.forward(request, response)   现在的servlet把控制权完全交给另外一个Servlet,这个servlet已经预先处理过的request和response也一并移交过去,   这个forward的过程实际上Client并不知道,是Server端的几个servlet collaboration.  

 (3)include又和 forward有什么区别呢?   赫赫, requestDispatcher.include(request, response)   好像没有什么区别啊,include仅仅是include, 接收request的那个servlet (called servlet),它往printerWriter(或OutputStream,   writer是写文本   而stream是写二进制)中写的内容是 caller servlet往 printerWriter(或 outputStream)中写的内容的一部分.而     requestDispatcher.forward(request, response)就不一样了,calling servlet控制权完全交出去了, calling servlet   的response buffer中的东西都被清空了,所以如果你要 forward,就是转移控制权的话, 你根本就不应该在calling servlet   中的response里面写任何东西,写了的话一旦 forward的话也就白瞎了,因为被清空了嘛. 

  (4)为什么 request.getRequestDispatcher 而 response.sendRedirect(new_url)呢? 

  我举个简单的例子,    request.getRequestDispatcher("/servlets/bookItems?bookId=18871"); 

  赫赫,在 getRequestDispatcher的同时还可以往 request当中塞一个parameter啊.   而response.sendRirect(new_url)呢, 这个new_url可是会返回给client browser看的,所以   当然是response.sendRedirect(new_url)了.

0 0
原创粉丝点击