jsp/servlet中 forward, include, reDirect 之间的区别
来源:互联网 发布:java编写简易计算器 编辑:程序博客网 时间:2024/06/11 09:42
讨论它们的区别之前,先让我们看下它们是怎样被调用的?
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可能就不太清楚了)
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.
现在的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的话也就白瞎了,因为被清空了嘛.
赫赫, 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)了.
我举个简单的例子, request.getRequestDispatcher("/servlets/bookItems?bookId=18871");
赫赫,在 getRequestDispatcher的同时还可以往 request当中塞一个parameter啊.
而response.sendRirect(new_url)呢, 这个new_url可是会返回给client browser看的,所以
当然是response.sendRedirect(new_url)了.
- jsp/servlet中 forward, include, reDirect 之间的区别
- jsp/servlet中 forward, include, reDirect 之间的区别
- Servlet/JSP服务器端的重定向(forward,include,redirect区别)
- Servlet中forward和include的区别&forward与redirect区别
- JSP中Forward和Redirect之间的区别
- JSP中Forward和Redirect之间的区别
- jsp/servlet 中sendRedirect,include,forward区别
- Servlet中 forward 和 redirect的区别
- Servlet中forward和redirect的区别
- Servlet中forward和redirect的区别
- Servlet中forward和redirect的区别
- Servlet中forward和redirect的区别
- Servlet中forward和redirect的区别
- Servlet中forward和redirect的区别
- Servlet中forward和redirect的区别
- Servlet中FORWARD和redirect的区别
- Servlet中forward和redirect的区别
- servlet中forward与redirect的区别
- ajax无刷新投票~~
- C++ notes 1
- C/C++字符串处理(4):std::vector与std::StringBuilder
- VC++与Matlab混合编程之引擎操作详解
- 脱离matlab环境,在VC种运行
- jsp/servlet中 forward, include, reDirect 之间的区别
- 隔世
- vb6提速技巧之一 等长的和非等长的大数组的复制
- 网上代码研究后修改的PHP登录程序,关闭浏览器session清空,可以设置cookies时间
- 最近的二三事
- 微软《SOA in the Real World》笔记03——第一章
- 比尔盖茨:十条“金口玉言”
- VS2005编译问题LINK : E:/aaa/Debug/aaa.exe not found or not built by the last incremental link; performing full link
- [delphi]动态创建MEMO历遍目录TXT文件到listbox中,並將內容加載到memo中.