`

Servlet跳转方式sendReDirect()和forward()

    博客分类:
  • J2EE
阅读更多

在web应用服务中,经常会面对不同SERVLET之间的跳转,目前我们可以通过以下两种方式实现:

1.RequestDispatcher.forward()

2.ServletResponse.sendReDirect()

 

两者的区别:

1.redirect 方式可以跨应用访问,forward 只能在同一个应用中跳转。

2.forward 客户端访问服务器,服务器找到要跳转的相应URL并执行返回给客户端。客户端的地址栏显示的是原始URL

   redirect 客户端访问服务器,服务器找到要跳转的URL并将URL发给客户端,再由客户端对新的URL重新发送请求。客

   户端的地址栏显示的是第二次请求的URL

3.数据的传输:在request中的数据,forward可以访问,redirect不行,因为redirect已经是一个新的请求。

 

forward跳转的理解:

1.获得跳转

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")。

 

request.getRequestDispatcher("/uu").forward(request,response)

this.getServletContext().getRequestDispatcher("/uu").forward(request,response)

this.getServletContext().getNamedDispatche("ServletName").forward(request, response)

 

1.1 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调用中有效。

 

2 使用RequestDispatcher

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

 

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

 

3 include方法

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

 

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

 

3.1 包含的请求参数

除了使用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方法获得,那么这些属性没有设置。

 

4 forward方法

RequestDispatcher接口的forward方法只有在输出还未提交给客户端时,才可以由调用servlet调用。如果输出数据存在于还未提交的响应缓冲中,内容必须在目标servlet的service方法调用之前清空 (否则out.println()输出的都在缓存中,无效)。如果响应已被提交,必须抛出IllegalStateException异常。暴露给目标servlet的request对象的path元素必须映射用来获得RequestDispatcher的路径。

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

 

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

 

public void doPost(HttpServletRequest request,HttpServletResponse response ) throws IOException,ServletException{
String page =  request.getParameter("page");//在forward时被URL中的page=1覆盖了
		response.setCharacterEncoding("UTF-8");
		//clear cache.
		response.setHeader("Pragma","No-cache");          
		response.setHeader("Cache-Control","no-cache");   
		response.setHeader("Cache-Control", "no-store");   
		response.setDateHeader("Expires",0);
		
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head><title>china</title></hea>");
		out.println("<body>");
		out.print("==");
		out.println("<br/>");//jsp页面换行
		out.println("</body>");
		out.println("</html>");
		
		//如果out.flush或者out.close().表示响应已经提交,抛出异常IllegalStateException异常。requestDispather.forward():不会执行.
		//out.flush();
		//out.close();		
		//跳转方式3种.
	//	request.getRequestDispatcher("/productInfo.do?page=1").forward(request,response);
}

 

 4.1 query字符串

请求转发机制负责在转发(forward)或包含(include)请求时传递query字符串。

 

5 错误处理

如果requesDispatcher的目标的servlet抛出ServletException或IOException类型运行时异常或checked异常,应当将它传递给调用servlet。所有其它异常应当包装成ServletException异常,并且异常的根在传递之前设置为原始异常。

 

 

相对路径的理解:

forward中"/"相对于web应用.
http://localhost:8080/Test/gw/page.jsp中转发
  <jsp:forward page="OtherPage.jsp"/>在JSP页面被解析后转换成pageContext.forward("OtherPage.jsp");
  "/OtherPage.jsp"提交到http://localhost:8080/Test/OtherPage.jsp
  "OtherPage.jsp"提交到http://localhost:8080/Test/gw/OtherPage.jsp
  
  <form action="/ddd"> 和 response.sendRedirect("/ddd"); 相对于服务器根路径.
  假设转发代码包含于注册的servlet-url为/ggg/tt;jsp为/ggg/tt.jsp:
  绝对路径:response.sendRedirect("http://www.brainysoftware.com")发送http://www.brainysoftware.com
  根路径:response.sendRedirect("/ooo")发送至http://localhost:8080/ooo
  相对路径:response.sendRedirect("ooo")发送至http://localhost:8080/Test/ggg/ooo,

 

 

参考文献:http://blog.csdn.net/wocongdongfanglai/archive/2007/02/05/1502615.aspx

分享到:
评论

相关推荐

    Servlet跳转方式sendReDirect

    在Servlet中,有两种主要的跳转方式:`RequestDispatcher.forward()`和`ServletResponse.sendRedirect()`。这两种方法在处理客户端请求时有不同的行为和应用场景。 1. `RequestDispatcher.forward()` - `forward()...

    servlet跳转的几种情况

    Servlet 跳转可以分为 Redirect 跳转和 Forward 跳转两种,JSP 跳转也可以使用这两种方式,但是需要注意 JSP 的特殊性。了解 Servlet 跳转的几种情况,可以帮助开发者更好地控制程序的流程和数据传递。

    sendRedirect()和forward()

    sendRedirect()方法和forward()方法都是Servlet编程中常用的方法,它们可以将客户端的请求重定向或转发到其他的资源中。但是,它们之间存在着本质上的区别,我们需要根据不同的需求选择适合的方法。

    forward PK sendredirect

    在Web开发中,"forward"和"sendRedirect"是两种常用的HTTP请求处理方式,它们都是用来实现页面跳转,但工作原理和应用场景有所不同。这里我们将深入探讨这两种方法的区别。 首先,`jsp:forward page="转的页面"`是...

    jsp和servlet中实现页面跳转的方式实例总结.docx

    JSP 和 Servlet 中实现页面跳转的方式实例总结 在 web 开发中,页面跳转是一个非常常见的需求,JSP 和 Servlet 是 Java Web 开发中两个最基本的组件,了解它们如何实现页面跳转是非常必要的。本文将根据 JSP 和 ...

    servlet跳转页面的几种方法

    本篇文章将详细讲解Servlet中跳转页面的两种主要方法:redirect(重定向)和forward(转发),以及在JSP中如何实现类似操作。 1. **Servlet中的跳转** - **Redirect(重定向)** 重定向是通过`response....

    servlet实现的页面跳转

    页面跳转主要有两种方式:请求转发(Request Forwarding)和重定向(Redirecting)。 1. 请求转发(Request Forwarding): 请求转发发生在服务器端,使用`RequestDispatcher`的`forward()`方法。在这种情况下,...

    java-web学习demo--最简单的servlet jsp跳转传值

    - 在Servlet中根据需求选择使用`sendRedirect`或`forward`方法进行跳转或转发。 通过这个简单的Java Web学习demo,开发者可以了解Servlet和JSP协同工作的方式,以及如何在它们之间传递数据。这有助于理解Web应用的...

    jsp中页面之间的跳转forward与sendRedirect的区别

    页面之间的跳转可以通过两种方式实现:forward和sendRedirect。 forward:可以在JSP页面中使用,可以在Servlet中实现。 在JSP页面中使用”目标文件”/&gt;,例如要跳转到userlist.jsp,可以写: 代码如下: ”userlist...

    servlet实现简单登录页面跳转.zip

    总结来说,"servlet实现简单登录页面跳转.zip"项目展示了如何使用Servlet和HTML配合实现基本的用户登录验证,并通过Servlet控制页面跳转。这涵盖了Java Web开发的基础知识,包括Servlet的使用、HTTP请求处理、用户...

    forward-sendRedirect

    在Java Web开发中,"forward-sendRedirect"是一个关键的概念,主要涉及到Servlet和JSP之间的页面跳转技术。这里我们将深入探讨这两个方法的工作原理及其在实际应用中的差异。 首先,我们来了解一下`forward()`方法...

    servlet/jsp跳转

    2. **Servlet的跳转方式**: - **请求转发(Request Forward)**:使用`RequestDispatcher`的`forward()`方法在同一应用内部进行跳转,请求只发送一次,浏览器地址栏不会改变。 - **重定向(Redirect)**:使用`...

    Web_2_Servlet的基本使用和跳转1

    Web 2 Servlet 的基本使用和跳转 在本节中,我们将讨论 Web 2 Servlet 的基本...我们讨论了 Servlet 的生命周期、创建方式、配置方式、实现页面跳转和获取请求参数等方面的内容,并讨论了 Servlet 的线程安全问题。

    关于servlet的页面跳转经典例子

    在这个“关于servlet的页面跳转经典例子”中,我们将探讨如何在Servlet中实现页面重定向和请求转发,同时也会涉及到数据库连接的相关知识。 1. **Servlet中的页面跳转** - **请求转发(Request Forward)**:在...

    jsp和servlet中实现页面跳转的方式实例总结

    本文实例总结了jsp和servlet中实现页面跳转的方式。分享给大家供大家参考,具体如下: 假设要求从test1.jsp 跳转到test2.jsp 一. jsp中跳转: 1. 使用RequestDispatcher.forward方法转发 &lt;&#37; ...

    servlet的跳转

    在Servlet中,跳转分为两种主要类型:请求转发(Request Forward)和重定向(Redirect)。这两种方法都是在服务器端完成的,但它们的工作机制和效果有所不同。 1. 请求转发(Request Forward) - **概念**:请求...

    java 中sendredirect()和forward()方法的区别

    Java 中的 sendRedirect() 和 forward() 方法都是用于页面跳转的,但是它们之间存在着一些关键的区别。 1. 跳转方式 sendRedirect() 方法可以将请求重定向到任何 URL,而 forward() 方法只能将请求重定向到同一个 ...

    jsp页面的五种跳转方式

    **概念**:`RequestDispatcher.forward()` 是一种服务器端内部转发机制,用于将当前请求转发到同一个 Web 应用程序中的另一个资源(如 JSP 页面或 Servlet)。这种方式不会改变浏览器地址栏中的 URL 地址,并且可以...

    jsp的跳转方式总结

    JSP 跳转方式总结 JSP(Java Server Pages)是一种基于...JSP 中的三种跳转方式各有其特点和应用场景,开发者可以根据具体情况选择合适的跳转方式。同时,开发者也需要注意跳转方式的使用规则,以避免出现异常和错误。

Global site tag (gtag.js) - Google Analytics