Java EE 7 Servlet3.0学习笔记

17.Servlet技术

17.7Servlet调用其他资源

Web组件(此处指Servlet)可以直接或者间接调用其他Web资源:

  • 间接调用(Invoke)就是我们常说的请求重定向,通过将重定向(Redirect)的URL嵌入在响应中并返回到客户端,由客户端(一般指浏览器)发起一个指向新地址的请求。
  • 直接调用主要通过将其他资源的内容包含进来或者将请求转发(Forward)给需要调用的资源。

调用服务器中其他Servlet资源,需要获得一个 RequestDispatcher 对象,可以通过两种方式获得:

方法1:

request.getRequestDispatcher("URL");
方法2:
request.getServletContext().getRequestDispatcher("URL");
这两种方法的区别在于:前者的URL可以是一个相对地址也可以是一个绝对地址,当URL带有"/"时则认为是绝对地址(ContextPath);否则当做相对地址处理,相对于当前请求路径。后者则必须是绝对地址,也就是说通过ServletContext来获得RequestDispatcher的话作为参数的URL必须以"/"开头,否则会抛出异常(JavaEE7)。


注意:当转发的目标的资源不可访问或者服务器没有为目标资源实现一个RequestDispatcher那么调用这个方法会返回一个null。

17.7.1 Response中包含其他资源

可以调用RequestDispacher的include(request,response)方法来包含其他组件,这个方法实现了这样的效果:将request传递给被包含的的Servlet;执行被包含的Servlet并将执行结果包含进response。被包含的组件可以对request对象执行任何的操作,但是对于response对象的操作却是有限制的:

  1. 可以向响应体中添加内容并提交响应;
  2. 不能修改响应头,不能调用任何可以修改响应头的函数,诸如setCookie()之类。

17.7.2 请求定向到其他组件

       使用RequestDispatcher的forward(request,response)方法将请求转发URL指定的资源,原始(Original)的URI以及它的组成成分会被做为resquest的属性传递下去,属性名为:javax.servlet.forward.[request-uri|context-path|servlet-path|path-info|query-string]

      一旦你调用了forwad方法,那么你就放弃了答复client的权利,要是你在servlet中访问了ServletOutStream或者PrintWriter对象,你将不能使用forward方法,否则将会引发IllegalStateException

你可能感兴趣的:(Java EE 7 Servlet3.0学习笔记)