`
zybing
  • 浏览: 458930 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

JAVA基础 :request与response转向的区别

阅读更多

http://www.rsky.com.cn/Article/java/201006/11903.html

 

简要说明:

reponse.sendRedirect() 与 request...forward() 实现转向的异同

  1.前面慢,后者快

  2.前面无法读取request.setAttribute()所保存的数值,而后者可以读取

  3.前者地址栏显示真正转向后的地址,而后者显示的是转向前的地址

  4.前者,转向地址开始的"/",表示的是本机的根目录;而后者,"/"表示的是应用的根目录

 

定义:
不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

调用方式如下:
request.getRequestDispatcher("apage.jsp").forward(request, response);//转发到apage.jsp ,地址栏地址不变。
response.sendRedirect("apage.jsp");//重定向到apage.jsp ,地址栏地址相应变化。
在jsp页面中你也会看到通过下面的方式实现转发:



总结:
用重定向和转发不是一个习惯问题。而是什么情况下必须用什么的问题。
不要仅仅为了把变量传到下一个页面而使用session作用域,那会无故增大变量的作用域,转发也许可以帮助你解决这个问题。
重定向:以前的request中存放的变量全部失效,并进入一个新的request作用域。
转发:以前的request中存放的变量不会失效,就像把两个页面拼到了一起。

1、dispatch还是原来的request,但是redirect则是重新建立一个request。
2、dispatch基本上都是转发到context内部的资源,而redirect可以重定向到外部的资源,如: req.sendRedriect("http://www.mocuai.com");
有关JSP/Servlet的重定向技术综述如下[补充]

1.RequestDispatcher.forward()
  是在服务器端起作用,当使用forward()时,Servlet engine传递HTTP请求从当前的Servlet or JSP到另外一个Servlet,JSP 或普通HTML文件,也即你的form提交至a.jsp,在a.jsp用到了forward()重定向至b.jsp,此时form提交的所有信息在 b.jsp都可以获得,参数自动传递.
  但forward()无法重定向至有frame的jsp文件,可以重定向至有frame的html文件,同时forward()无法在后面带参数传递,比 如servlet?name=frank,这样不行,可以程序内通过response.setAttribute("name",name)来传至下一个 页面.

   重定向后浏览器地址栏URL不变.

例:在servlet中进行重定向
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException
{

        response.setContentType("text/html; charset=gb2312");

        ServletContext sc = getServletContext();

        RequestDispatcher rd = null;

        rd = sc.getRequestDispatcher("/index.jsp");     //定向的页面

        rd.forward(request, response);

}
通常在servlet中使用,不在jsp中使用。

2.response.sendRedirect()
    是在用户的浏览器端工作,sendRedirect()可以带参数传递,比如servlet?name=frank传至下个页面,同时它可以重定向至不同的主机上,sendRedirect()可以重定向有frame.的jsp文件.
   重定向后在浏览器地址栏上会出现重定向页面的URL
例:在servlet中重定向
public void doPost(HttpServletRequest request,HttpServletResponse response)

        throws ServletException,IOException

{

        response.setContentType("text/html; charset=gb2312");

        response.sendRedirect("/index.jsp");

}
由于response是jsp页面中的隐含对象,故在jsp页面中可以用response.sendRedirect()直接实现重定位。
注意:
(1).使用response.sendRedirect时,前面不能有HTML输出。
这 并不是绝对的,不能有HTML输出其实是指不能有HTML被送到了浏览器。事实上现在的server都有cache机制,一般在8K(我是说JSP  SERVER),这就意味着,除非你关闭了cache,或者你使用了out.flush()强制刷新,那么在使用sendRedirect之前,有少量的 HTML输出也是允许的。
(2).response.sendRedirect之后,应该紧跟一句return;
我们已经知道response.sendRedirect是通过浏览器来做转向的,所以只有在页面处理完成后,才会有实际的动作。既然你已经要做转向了,那么后的输出还有什么意义呢?而且有可能会因为后面的输出导致转向失败。
比较:
(1).Request Dispatcher.forward()是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;
(2).response.sendRedirect()则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。这样,从浏览器的地址栏中可以看到跳转后的链接地址。
前者更加高效,在前者可以满足需要时,尽量使用RequestDispatcher.forward()方法.

注:在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用HttpServletResponse.sendRequest()方法。

3.<jsp:forward page="" />

它的底层部分是由RequestDispatcher来实现的,因此它带有RequestDispatcher.forward()方法的印记。


如果在<jsp:forward>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么该语句将不起作用,这一点应该特别注意。
另外要注意:它不能改变浏览器地址,刷新的话会导致重复提交

4.修改HTTP header的Location属性来重定向
   通过设置直接修改地址栏来实现页面的重定向。
jsp文件代码如下:

<%
response.setStatus(HttpServletResponse.SC_MOVED_PERMANENTLY);
String newLocn = "/newpath/jsa.jsp";
response.setHeader("Location",newLocn);
%>

5.JSP中实现在某页面停留若干秒后,自动重定向到另一页面
  在html文件中,下面的代码:
    <meta http-equiv="refresh" content="300; url=target.jsp">
    它的含义:在5分钟之后正在浏览的页面将会自动变为target.html这一页。代码中300为刷新的延迟时间,以秒为单位。targer.html为你想转向的目标页,若为本页则为自动刷新本页。
    由上可知,可以通过setHeader来实现某页面停留若干秒后,自动重定向到另一页面。
    关键代码:
          String content=stayTime+";URL="+URL;
          response.setHeader("REFRESH",content);
 

如何选择:

RequestDispatcher.forward()方法和HttpServletResponse.sendRedirect()方法的区别 是:前者仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址;后者则是完全的跳转,浏览器将会得到跳转的地址,并重新发送请求链接。 这样,从浏览器的地址栏中可以看到跳转后的链接地址。所以,前者更加高效,在前者可以满足需要时,尽量使用Request Dispatcher.forward()方法,并且,这样也有助于隐藏实际的链接。在有些情况下,比如,需要跳转到一个其它服务器上的资源,则必须使用 HttpServletResponse.sendRequest()方法。

 

原理:
1、 Forward
这种方式是在服务器端作 的重定向。服务器往client 发送数据的过程是这样的:服务器在向客户端发送数据之前,是先将数据输出到缓冲区,然后将缓冲区中数据发送给client端。什么时候将缓冲区里的数据发 送给client端呢?(1)当对来自client的request处理完,并把所有数据输出到缓冲区,(2)当缓冲区满,(3)在程序中调用缓冲区的输 出方法out.flush()或response.flushbuffer(),web container才将缓冲区中的数据发送给client。
这种重定向方式是利用服务器端的缓冲区机制,在把缓冲区的数据发送到客户端之前,原来的数据不发送,将执行转向重定向页面,发送重定向页面的数据,重定向调用页的数据将被清除。特别提示: 在<JSP:FORWORD>之前有很多输出,前面的输出已使缓冲区满,将自动输出到客户端,那么这种重定向方式将不起作用。
public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
response.setContentType(”text/html; charset=UTF-8″);
ServletContext sc = getServletContext();
RequestDispatcher rd = null;
rd = sc.getRequestDispatcher(”/index.jsp”);
rd.forward(request, response);
}
2、 sendRedirect
这 种方式是在客户端作的重定向处理。该方法通过修改HTTP协议的HEADER部分(设置状态代码302,命令浏览器发重新发送请求),对浏览器下达重定向 指令的,让浏览器对在location中指定的URL提出请求,使浏览器显示重定向网页的内容。该方法可以接受绝对的或相对的URLs。如果传递到该方法 的参数是一个相对的URL,那么Web container在将它发送到客户端前会把它转换成一个绝对的URL。public void doPost(HttpServletRequest request,HttpServletResponse response) throws ServletException,IOException
{
response.setContentType(”text/html; charset=UTF-8″);
//response.sendRedirect(”/index.jsp”); 效果和前面forward一样
response.sendRedirect(”http://www.sohu.com”); //跳转到sohu
}

 

 

区别:

1、forward重定向是在容器内部实现的同一个Web应用程序的重定向,所以forward方法只能重定向到同一个Web应用程序中的一个资 源,重定向后浏览器地址栏URL不变,而sendRedirect方法可以重定向到任何URL, 因为这种方法是修改http头来实现的,URL没什么限制,重定向后浏览器地址栏URL改变。
2、forward重定向将原始的HTTP请求对象(request)从一个servlet实例传递到另一个实例,而采用sendRedirect方式两者不是同一个application。
3、基于第二点,参数的传递方式不一样。forward的form参数跟着传递,所以在第二个实例中可以取得HTTP请求的参数。sendRedirect只能通过链接传递参数,response.sendRedirect(“login.jsp?param1=a”)。
4、 sendRedirect能够处理相对URL,自动把它们转换成绝对URL,如果地址是相对的,没有一个‘/’,那么Web container就认为它是相对于当前的请求URI的。比如,如果为response.sendRedirect(”login.jsp”),则会从当 前servlet 的URL路径下找login.jsp: http://127.0.0.1:8080/test/servlet/Servlet 重定向的URL: http://127.0.0.1:8080/test/servlet/login.jsp,如果为response.sendRedirect(” /login.jsp”)则会从当前应用径下查找url:http://127.0.0.1:8080/login.jsp。而forward不能这样处 理相对路径。
java
他们的区别是:
response.sendRedirect是向客户浏览器发送页面重定向指令,浏览器接收后将向web服务器重新发送页面请求,所以执行完后浏览器的url显示的是跳转后的页面。跳转页面可以是一个任意的url(本服务器的和其他服务器的均可)。
RequestDispatcher.forward 则是直接在服务器中进行处理,将处理完后的信息发送给浏览器进行显示,所以完成后在url中显示的是跳转前的页面。在forward的时候将上一页面中传 送的request和response信息一同发送给下一页面(而response.sendRedirect不能将上一页面的request和 response信息发送到下一页面)。由于forward是直接在服务器中进行处理,所以forward的页面只能是本服务器的。

分享到:
评论

相关推荐

    IP工具类,通过传入的request获取ip地址(JAVA)

    在IT行业中,尤其是在Web开发领域,获取客户端的IP地址是一项常见的任务。...理解这些基础知识对于任何Java Web开发者来说都是至关重要的,它有助于确保我们的应用能够正确地识别和服务每一个客户端。

    java基础面试题目大全, 合适JAVA面试的程序员

    Java基础面试题目主要涵盖了许多核心概念,包括语言特性、数据结构、并发处理、异常处理、类与对象的关系、以及Web开发相关的技术。以下是对这些知识点的详细解释: 1. **公共(public)、受保护(protected)、...

    Java基础知识面试题目

    ### Java基础知识面试题目详解 #### 一、Java基础知识 **1. Java基本数据类型与String** Java中的基本数据类型包括整数类型(`byte`, `short`, `int`, `long`),浮点类型(`float`, `double`),字符类型(`char...

    JSP页面转向和页面转发的区别

    在Java Web开发中,页面转向(重定向)与页面转发是两个非常重要的概念,它们主要用于实现不同页面之间的跳转。这两种方式虽然都能达到跳转的效果,但在实际应用中有着不同的应用场景和特点。下面将详细介绍页面转向...

    weChatpay完整版java

    request.getRequestDispatcher("/jsp/login.jsp").forward(request,response); }else{ WeixinUtil util = new WeixinUtil(); UserAccessToken token = (UserAccessToken) request.getSession()....

    JAVA SERVLET 高级编程

    - **Request转发**:通过调用`request.getRequestDispatcher().forward(request, response)`,一个Servlet可以将请求转发给另一个Servlet处理。 - **URL重定向**:使用`response.sendRedirect()`,Servlet可以引导...

    Java+Extjs实现单文件上传

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { for (Part part : request.getParts()) { String fileName = part....

    java面试题

    【Java面试题】涵盖的内容广泛,涉及到Java的基础、框架、前端技术以及服务器和容器等多个方面。以下是这些知识点的详细解析: 1. 数据库关系模型: - 一对一关系:两个表之间存在一对一关联,通常通过主键外键...

    Java-Web简答题.docx

    JSP 中动态 INCLUDE 与静态 INCLUDE 的区别 JSP 中有两种 INCLUDE 方式:静态 INCLUDE 和动态 INCLUDE。 * 静态 INCLUDE:,指令元素;编译时包含;对所包含的文件进行语法分析。 * 动态 INCLUDE:&lt;jsp:include&gt;,...

    Java最全的面试整理

    Java作为一门广泛使用的编程语言,其面试题涵盖了众多的知识点,包括基础语法、类与对象、集合框架、多线程、网络编程、JSP、Servlet等。以下是对这些知识点的详细解析: **69、forward 和 redirect 的区别** 在...

    java初学者必看

    最近正在学习Java,也买了很多的有关Java方面的书籍,其中发现《跟我学Java》这本书,都的很不错啊,所以顺便拿电脑把这本书的目录敲了下来,与大家分享。尤其是那些和我一样初学Java的朋友们,看看哪一节对你有用,...

    java EE比较常用的代码总结

    虽然现代Java EE应用更多地转向轻量级框架,如Spring,但了解EJB的基本概念仍然重要,如会话Bean和实体Bean。 5. **JPA(Java Persistence API)**:JPA是Java EE中用于对象关系映射的规范,简化了数据库操作。它...

    JAVA Web课件

    第五章“JSP主要内置对象”涉及了JSP的九个内置对象,如request、response、session、application等。这些对象提供了处理HTTP请求、发送响应、管理用户会话和共享应用程序级数据的能力。理解它们的功能和用法是开发...

    Java web课堂练习

    ### Java Web课堂练习知识点解析 #### 一、JSP页面指令元素详解 ##### 1. `page` 指令属性详解 - **`import`**:用于导入类和包,使得这些类和包能够在JSP页面中直接使用。例如 `&lt;%@ page import="java.util.Date...

    java 实现大文件上传

    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { ActionForward forward = null; try { System.out.println("start"); ...

    java EE jsp试卷

    JSP提供了九个内置对象,如`request`、`response`、`session`、`application`等,可以直接在JSP页面中使用,无需显式创建。 5. **Servlet和JSP的关系**: JSP最终会被编译成Servlet,JSP的每个动态元素都会对应...

    JavaServer 页面技术 (白皮书)

    JSP技术通过提供预定义的内置对象(如`request`, `response`, `session`, 和`application`),使开发者能够轻松访问HTTP请求和响应数据,管理会话状态,以及与其他服务器资源交互。此外,JSP页面可以与Servlets协同...

    Java语言案例开发实验指导书.doc

    实验三探讨了JSP内置对象,如request、response、session、application等,这些对象在处理用户请求、响应数据、管理会话和共享信息等方面扮演着重要角色。 实验四引入了JavaBean组件技术,这是Java中用于封装数据和...

    JavaWeb中URL重写用Forward方式并使其后filter可以拦截内部转发

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; String url = ...

    html5实现摄像头拍照并使用java进行照片保存

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String imageData = request.getParameter("imageData"); byte[] imageBytes = Base...

Global site tag (gtag.js) - Google Analytics