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

sendRedirect()与forward()实现转向的区别

    博客分类:
  • j2ee
阅读更多

sendRedirect()与forward()

1.前面慢,后者快
2.前面无法读取request.setAttribute()所保存的数值,而后者可以读取
3.前者地址栏显示真正转向后的地址,而后者显示的是转向前的地址
4.前者,转向地址开始的"/",表示的是本机的根目录;而后者,"/"表示的是应用的根目录

 

 

response.sendRedirect("/Test/admin/admin.jsp");
//---------------------------------------------------------------------

request.setAttribute("message", "您输入的两次新密码不相符!");
request.getRequestDispatcher("/admin/Result.jsp").forward(request, response);

 

获取RequestDispatcher

可以通过ServletContext的下列方法获得实现RequestDispatcher接口的对象:

 

• getRequestDispatcher

• getNamedDispatcher

 

getRequestDispatcher方法以String参数描述ServletContext作用域的路径。该路径必须相对于ServletContext的根,并且以“/”开头。该方法使用路径(path)来查找servlet,用RequestDispatcher对象包装,然后返回结果对象。如果没有基于指定路径的servlet,提供一个RequestDispatcher返回路径值。

 

getNamedDispatcher方法以String参数表示ServletContext已知的servlet名称。如果找到servlet,用RequestDispatcher对象将它包装并返回。如果没有和指定名称关联的servlet,该方法必须返回null。

 

为了能够使用当前请求的相对路径(不是ServletContext根的相对路径)来获得RequestDispatcher对象,ServletRequest接口提供以下方法:

 

• getRequestDispatcher

 

该方法的行为和ServletContext的同名方法类似。servlet容器使用request对象中的信息将指定的相对路径转换成完整路径。比如,以“/”为根的上下文,请求/garden/tools.html,通过ServletRequest.getRequestDispatcher("header.html") 获得的requestDispatcher实际上等同于调用ServletContext.getRequestDispatcher("/garden/header.html")。

 

 RequestDispatcher路径的query字符串

ServletContext和ServletRequest使用path参数创建RequestDispatcher对象的方法,允许在path后添加query字符串。比如,开发人员可以通过下列代码获得RequestDispatcher:

 

String path = “/raisons.jsp?orderno=5”;

RequestDispatcher rd = context.getRequestDispatcher(path);

rd.include(request, response);

 

query字符串中指定的参数用来创建RequestDispatcher,优先于传递给包含servlet的同名的其他参数。该参数和RequestDispatcher关联,只在include或forward调用中有效。

 

使用RequestDispatcher

要使用requestDispatcher,servlet可以调用RequestDispatcher接口的include或forward方法。这些方法的参数可以是通过Servlet接口的service方法传递的request和response参数,也可以是规范2.3中引入的request和response包装类的子类的实例。后者,包装实例必须包装容器传递给service方法的request和response对象。

 

容器供应商必须确保向目标servlet转发请求和原请求处于同一个VM,同一个线程。

 

 include方法

RequestDispatcher接口的include可以随时调用。include方法的目标servlet可以完整访问request对象,但是使用response对象上有一些限制:

 

它只能向response对象的ServletOutputStream或者Writer写入信息,提交响应(将内容输出到响应缓冲尾部),或者显式调用ServletResponse接口的flushBuffer方法。它不能设置header,或者调用任何影响响应header的方法。任何那样的尝试必须都被忽略。

 

 包含的请求参数

除了使用getNamedDispatcher方法获得的servlet之外,include的servlet可以访问调用它的路径。设置以下请求属性:

 

javax.servlet.include.request_uri

javax.servlet.include.context_path

javax.servlet.include.servlet_path

javax.servlet.include.path_info

javax.servlet.include.query_string

 

include的servlet的这些属性通过request对象的getAttribute方法访问。

 

如果include的servlet通过getNamedDispatcher方法获得,那么这些属性没有设置。

 

 forward方法

RequestDispatcher接口的forward方法只有在输出还未提交给客户端时,才可以由调用servlet调用。如果输出数据存在于还未提交的响应缓冲中,内容必须在目标servlet的service方法调用之前清空。如果响应已被提交,必须抛出IllegalStateException异常。

 

暴露给目标servlet的request对象的path元素必须映射用来获得RequestDispatcher的路径。

 

唯一例外是如果RequestDispatcher是通过getNamedDispatcher方法获得的,这种情况下,request对象的path元素必须必须映射最初的请求。

 

在RequestDispatcher接口的forward方法返回之前,servlet容器必须发送,提交并关闭响应内容。

分享到:
评论

相关推荐

    forward PK sendredirect

    7. **应用场景**:`jsp:forward`常用于处理业务逻辑后转向其他内部资源,`sendRedirect`常用于安全重定向、跨域跳转或用户交互需求。 总结来说,`jsp:forward`和`response.sendRedirect`各有优势,选择哪种方式取决...

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

    在JavaWeb中,我们通常会借助于像`RequestDispatcher`的`forward()`方法来实现页面间的转发,而不是直接使用`response.sendRedirect()`。`forward()`方法能在服务器端完成请求的转向,使得客户端浏览器的URL保持不变...

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

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

    页面转向与重定向

    页面转向与重定向是 Web 开发中两个非常重要的概念,它们都是用于在不同的 Web 资源之间进行跳转的,但是它们之间有着很大的区别。下面我们将详细介绍转发和重定向的概念、调用方式、工作流程和区别。 一、调用方式...

    JSP跳转方式总结.doc

    与`forward()`不同,`response.sendRedirect()` 是在客户端浏览器端进行操作。它可以携带参数,例如`servlet?name=frank`,并且可以重定向到不同服务器上的资源,包括包含frameset的JSP文件。在浏览器的地址栏中,...

    网站页面自动跳转实现方法

    网站页面自动跳转是网页开发中的常见功能,用于在用户打开一个页面后,经过一段时间或者特定条件触发,自动转向另一个页面。这种技术在各种场景下都有应用,比如页面更新、错误处理、重定向等。本篇文章将深入探讨...

    JSP几种页面间传递参数实现的方法

    还可以实现使用jsp:forward动作做页面跳转时传递参数,如下:<jsp:forward page="Relative URL"> <jsp:param name="paramname" value="paramvalue" /> </jsp:forward> 通过这种方式和一般的表单参数一样的,也可以...

    jsp中几个页面之间跳转

    4. 当处理请求参数时,`forward()`能保留请求数据,而`sendRedirect()`则会导致请求数据丢失。因此,对于需要保留请求数据的情况,应优先考虑`forward()`。 总之,理解和正确使用绝对路径与相对路径对于JSP页面间的...

    mvc留言板程序

    4. **转向范围**:`sendRedirect()`可以转向任意URL,包括其他网站或应用,而`forward()`只能在当前应用内部进行跳转。 二、JSP页面实现 在给出的`addMessage.jsp`代码中,我们看到了一个典型的JSP页面结构,用于...

    redirect--and-forword.rar_redirect

    在Java中,通常通过HttpServletResponse对象的sendRedirect()方法实现。以下是一个简单的示例: ```java response.sendRedirect("http://www.example.com/newLocation"); ``` 在这个例子中,服务器会返回一个HTTP...

    请求转发与重定向

    在Web开发中,**请求转发**与**重定向**是两种非常重要的控制流程技术,它们都用于实现页面跳转的功能,但其工作原理和应用场景有所不同。 #### 二、请求转发 ##### 1. 定义 **请求转发**是在服务器内部进行的,它...

    jsp聊天技术,application实现聊天

    在IT行业中,JSP(Java...随着技术的发展,现代Web应用更多地转向了WebSocket或Server-Sent Events(SSE)等技术来实现更实时的通信,但JSP的`application`作用域依然是学习和理解Web应用程序协作机制的一个重要概念。

    Filter(过滤器)简介和工作原理

    Filter 或者目标 Servlet 程序去处理,也可以直接向客户端返回响应信息,或者利用 RequestDispatcher 的 forward() 和 include() 方法,以及 HttpServletResponse 的 sendRedirect() 方法将请求转向到其他资源。...

    Serclet和jsp实现登陆

    - **重定向**:调用`response.sendRedirect()`方法,浏览器会发起一个新的HTTP请求到指定URL,适合在不同请求之间跳转,例如登录成功后转向主页。 在JSP文件中,我们可以使用EL(Expression Language)和JSTL(Java...

    JSP和HTML跳转.zip_html挑转jsp_jsp和HEML跳转_jsp和HTML跳转

    1. JSP的`response.sendRedirect()`:在JSP中,可以使用`HttpServletResponse`的`sendRedirect()`方法实现服务器端的跳转。例如: ```jsp response.sendRedirect("target.html"); %> ``` 这会向客户端发送一个302...

    在Jsp Servlet中页面重新定向总汇

    与RequestDispatcher.forward()不同,sendRedirect()方法在客户端浏览器端执行。该方法通过向浏览器发送一个特定的响应,使浏览器连接到另一个URL。这个方法可以传递参数,例如通过URL参数(如servlet?name=frank)...

    servlet和JSP面试题答案.pdf

    RequestDispatcher.forward() 方法仅是容器中控制权的转向,在客户端浏览器地址栏中不会显示出转向后的地址,它是不会改变 Request 的值的。 HttpServletResponse.sendRedirect() 方法则是完全的跳转,浏览器将会...

    Jsp面试题目.doc

    本资源摘要信息涵盖了 JSP 面试的常见问题,包括 JSP 内置对象、动作、INCLUDE 机制、请求转发、Servlet 生命周期、JDBC 连接数据库、Statement 和 PreparedStatement 的区别、Connection Pool 的原理及优点缺点、...

    计算机面试jsp

    - 重定向(`response.sendRedirect()`):完全转向新页面,不返回原页面,用于客户端的跳转。 5. JSP与Servlet的区别与联系: - JSP是视图层技术,侧重于页面展示,而Servlet是控制层技术,主要处理业务逻辑。 -...

Global site tag (gtag.js) - Google Analytics