`
isiqi
  • 浏览: 16745983 次
  • 性别: Icon_minigender_1
  • 来自: 济南
社区版块
存档分类
最新评论

servlet2.3规范之八——转发请求

阅读更多

8 转发请求

在构建一个web应用时,经常要把请求转发给另一个servlet处理,或者在响应中包含另一个servlet的输出。RequestDispatcher接口提供了一种机制来实现这种需求。

8.1 获取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")

<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><strong><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">8.1.1</span></strong></chsdate> RequestDispatcher路径的query字符串

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

String path = “/raisons.jsp?orderno=<chmetcnv w:st="on" tcsc="0" numbertype="1" negative="False" hasspace="False" sourcevalue="5" unitname="”">5”</chmetcnv>;

RequestDispatcher rd = context.getRequestDispatcher(path);

rd.include(request, response);

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

8.2 使用RequestDispatcher

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

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

8.3 include方法

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

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

<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><strong><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">8.3.1</span></strong></chsdate> 包含的请求参数

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

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

includeservlet的这些属性通过request对象的getAttribute方法访问

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

8.4 forward方法

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

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

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

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

<chsdate w:st="on" isrocdate="False" islunardate="False" day="30" month="12" year="1899"><strong><span lang="EN-US" style="FONT-SIZE: 11pt; mso-font-kerning: 0pt">8.4.1</span></strong></chsdate> query字符串

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

8.5 错误处理

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

分享到:
评论

相关推荐

    servletser

    6. **servlet2.3规范中文版.pdf**:Servlet 2.3版本的中文翻译版,便于中文读者理解和学习。 7. **servlet官方地址.txt**:可能是记录了Servlet官方文档或API的URL,供开发者查阅最新资料。 8. **servlet-2_5-mrel...

    tomcat工作原理深入详解——HowTomcatWorks中文版.pdf

    Tomcat 4与5之间的主要区别在于对Servlet和JSP规范的支持,Tomcat 5支持Servlet 2.4和JSP 2.0,而Tomcat 4支持Servlet 2.3和JSP 1.2。此外,Tomcat 5的默认连接器在性能上有所提升,例如通过共享后台处理线程优化了...

    howtotomcatworks

    Tomcat 4和5之间存在一些差异,主要体现在对Servlet和JSP规范的支持上,Tomcat 5支持Servlet 2.4和JSP 2.0,而Tomcat 4则支持Servlet 2.3和JSP 1.2。此外,Tomcat 5在性能和功能上也有所提升,比如增强了安全性和可...

    How_Tomcat_Works 中文版

    - **Tomcat 4**:支持Servlet 2.3和JSP 1.2规范,组件间各自拥有独立的后台处理线程。 - **Tomcat 5**:支持Servlet 2.4和JSP 2.0规范,采用了更为高效的默认连接器,并且共享一个后台处理线程,从而提高了整体性能...

    kaptcha-2.3.zip

    这个库尤其适用于Java开发者,因为它提供了两个版本的jar包——kaptcha-2.3-jdk14.jar和kaptcha-2.3.jar,分别兼容JDK 1.4和更高版本。 验证码(CAPTCHA)是一种人机交互验证技术,它要求用户在输入框中输入由图片...

    JSP源码——866ccv3.0jtb.zip

    5. **Servlet-JSP关系**:JSP本质是Servlet的一种简化表示,当JSP页面被请求时,服务器会将其转换为Servlet,然后执行。 6. **MVC模式**:JSP常与Model-View-Controller(MVC)设计模式一起使用,其中JSP作为视图,...

    JAVA WEB 开发详解:XML+XSLT+SERVLET+JSP 深入剖析与实例应用.part3

    6.6.3 请求转发的实例 233 6.6.4 sendredirect()和forward()方法的区别 238 6.7 小结 239 第7章 web应用程序的部署 240 7.1 配置任意目录下的web应用程序 240 7.2 war文件 242 7.3 tomcat中servlet的另一种...

    How Tomcat Works中文

    - **规范支持**:Tomcat 5支持Servlet 2.4和JSP 2.0规范,而Tomcat 4仅支持Servlet 2.3和JSP 1.2。 - **连接器性能**:相比于Tomcat 4,Tomcat 5提供了更为高效的默认连接器。 - **线程模型**:Tomcat 5采用共享的...

    tomcat(中文书签版)

    Tomcat5支持Servlet 2.4和JSP 2.0规范,而Tomcat4支持的是Servlet 2.3和JSP 1.2。Tomcat5的默认连接器比Tomcat4更高效,它们共享后台处理线程,减少了资源消耗。Tomcat5还简化了代码,不需要映射组件来查找子组件。 ...

    Java超全笔试题面试库及答案.doc

    J2EE1.3:JSP1.2 Servlet2.3 EJB2.0 J2EE1.4:JSP2.0 Servlet2.4 EJB3.0 部署结构: * \myWeb + \WEB-INF - web.xml - \classes - 包*.class - \lib - *.jar 归档:*.war 开发结构: * \myWeb + ...

    HowTomcatWorks

    - **规范支持**:Tomcat 5 支持 Servlet 2.4 和 JSP 2.0 规范,而 Tomcat 4 只支持 Servlet 2.3 和 JSP 1.2。 - **性能优化**:相较于 Tomcat 4,Tomcat 5 在某些方面进行了优化,提高了处理效率。 #### 六、深入...

    jspservlet取参数乱码问题分析

    - **根本原因**:在Servlet规范中,当请求被发送至服务器端时,如果`request.getCharacterEncoding()`返回`null`,则默认使用ISO-8859-1编码解析参数。然而,大多数浏览器在发送POST或GET请求时,并不会明确指定编码...

    AJAX入门学习——ajax4jsf

    ### AJAX入门学习——ajax4jsf #### 一、引言 AJAX(Asynchronous JavaScript and XML)技术自诞生以来,极大地改善了Web应用程序的用户体验。`ajax4jsf`作为一个专门为JSF(JavaServer Faces)框架设计的AJAX组件...

    JSP论文格式化系统_——后台模块的设计与实现(源代码+论文).zip

    Servlet在服务器端处理请求,与数据库交互,控制业务流程。 3.2 文件操作:使用Java的IO流进行文件的读写操作,处理上传和下载功能。 3.3 PDF解析:可能使用Apache PDFBox、iText等库来解析PDF文档,获取格式信息...

    Struts开发指南之工作流程.doc

    RequestProcessor负责处理ActionServlet转发来的请求,其主要工作流程如下: 1. **解析请求**:根据请求的URL(例如*.do)确定具体的Action。 2. **查找ActionMapping**:从配置文件struts-config.xml中找到对应的...

    JavaWeb培训讲义6

    Servlet过滤器的概念首次出现在Java Servlet规范2.3版中,它为开发者提供了一种灵活的方式来处理各种请求前后的任务。 #### 过滤器的功能 Servlet过滤器的主要功能包括但不限于: - 在Servlet被调用之前检查`...

    支持全文检索的邮件代理服务平台 ——用户注册管理及JavaMail的应用与实现.doc

    J2EE规范包括Web层、业务逻辑层和数据访问层,其中Web层由Servlet和JSP负责处理用户请求;业务逻辑层则由JavaBean和EJB组件实现,处理业务逻辑和数据操作;数据访问层则通过JDBC与数据库进行交互。 2.3 Lucene的...

Global site tag (gtag.js) - Google Analytics