第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字符串
ServletContext和ServletRequest使用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关联,只在include或forward调用中有效。
8.2 使用RequestDispatcher
要使用requestDispatcher,servlet可以调用RequestDispatcher接口的include或forward方法。这些方法的参数可以是通过Servlet接口的service方法传递的request和response参数,也可以是规范2.3中引入的request和response包装类的子类的实例。后者,包装实例必须包装容器传递给service方法的request和response对象。
容器供应商必须确保向目标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之外,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方法获得,那么这些属性没有设置。
8.4 forward方法
RequestDispatcher接口的forward方法只有在输出还未提交给客户端时,才可以由调用servlet调用。如果输出数据存在于还未提交的响应缓冲中,内容必须在目标servlet的service方法调用之前清空。如果响应已被提交,必须抛出IllegalStateException异常。
暴露给目标servlet的request对象的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抛出ServletException或IOException类型运行时异常或checked异常,应当将它传递给调用servlet。所有其它异常应当包装成ServletException异常,并且异常的根在传递之前设置为原始异常。
分享到:
相关推荐
6. **servlet2.3规范中文版.pdf**:Servlet 2.3版本的中文翻译版,便于中文读者理解和学习。 7. **servlet官方地址.txt**:可能是记录了Servlet官方文档或API的URL,供开发者查阅最新资料。 8. **servlet-2_5-mrel...
Tomcat 4与5之间的主要区别在于对Servlet和JSP规范的支持,Tomcat 5支持Servlet 2.4和JSP 2.0,而Tomcat 4支持Servlet 2.3和JSP 1.2。此外,Tomcat 5的默认连接器在性能上有所提升,例如通过共享后台处理线程优化了...
Tomcat 4和5之间存在一些差异,主要体现在对Servlet和JSP规范的支持上,Tomcat 5支持Servlet 2.4和JSP 2.0,而Tomcat 4则支持Servlet 2.3和JSP 1.2。此外,Tomcat 5在性能和功能上也有所提升,比如增强了安全性和可...
- **Tomcat 4**:支持Servlet 2.3和JSP 1.2规范,组件间各自拥有独立的后台处理线程。 - **Tomcat 5**:支持Servlet 2.4和JSP 2.0规范,采用了更为高效的默认连接器,并且共享一个后台处理线程,从而提高了整体性能...
这个库尤其适用于Java开发者,因为它提供了两个版本的jar包——kaptcha-2.3-jdk14.jar和kaptcha-2.3.jar,分别兼容JDK 1.4和更高版本。 验证码(CAPTCHA)是一种人机交互验证技术,它要求用户在输入框中输入由图片...
5. **Servlet-JSP关系**:JSP本质是Servlet的一种简化表示,当JSP页面被请求时,服务器会将其转换为Servlet,然后执行。 6. **MVC模式**:JSP常与Model-View-Controller(MVC)设计模式一起使用,其中JSP作为视图,...
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的另一种...
- **规范支持**:Tomcat 5支持Servlet 2.4和JSP 2.0规范,而Tomcat 4仅支持Servlet 2.3和JSP 1.2。 - **连接器性能**:相比于Tomcat 4,Tomcat 5提供了更为高效的默认连接器。 - **线程模型**:Tomcat 5采用共享的...
Tomcat5支持Servlet 2.4和JSP 2.0规范,而Tomcat4支持的是Servlet 2.3和JSP 1.2。Tomcat5的默认连接器比Tomcat4更高效,它们共享后台处理线程,减少了资源消耗。Tomcat5还简化了代码,不需要映射组件来查找子组件。 ...
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 + ...
- **规范支持**:Tomcat 5 支持 Servlet 2.4 和 JSP 2.0 规范,而 Tomcat 4 只支持 Servlet 2.3 和 JSP 1.2。 - **性能优化**:相较于 Tomcat 4,Tomcat 5 在某些方面进行了优化,提高了处理效率。 #### 六、深入...
- **根本原因**:在Servlet规范中,当请求被发送至服务器端时,如果`request.getCharacterEncoding()`返回`null`,则默认使用ISO-8859-1编码解析参数。然而,大多数浏览器在发送POST或GET请求时,并不会明确指定编码...
### AJAX入门学习——ajax4jsf #### 一、引言 AJAX(Asynchronous JavaScript and XML)技术自诞生以来,极大地改善了Web应用程序的用户体验。`ajax4jsf`作为一个专门为JSF(JavaServer Faces)框架设计的AJAX组件...
Servlet在服务器端处理请求,与数据库交互,控制业务流程。 3.2 文件操作:使用Java的IO流进行文件的读写操作,处理上传和下载功能。 3.3 PDF解析:可能使用Apache PDFBox、iText等库来解析PDF文档,获取格式信息...
RequestProcessor负责处理ActionServlet转发来的请求,其主要工作流程如下: 1. **解析请求**:根据请求的URL(例如*.do)确定具体的Action。 2. **查找ActionMapping**:从配置文件struts-config.xml中找到对应的...
Servlet过滤器的概念首次出现在Java Servlet规范2.3版中,它为开发者提供了一种灵活的方式来处理各种请求前后的任务。 #### 过滤器的功能 Servlet过滤器的主要功能包括但不限于: - 在Servlet被调用之前检查`...
J2EE规范包括Web层、业务逻辑层和数据访问层,其中Web层由Servlet和JSP负责处理用户请求;业务逻辑层则由JavaBean和EJB组件实现,处理业务逻辑和数据操作;数据访问层则通过JDBC与数据库进行交互。 2.3 Lucene的...