Java Web开发6___包含 Web 资源----RequestDispatcher.include 方法

来源:互联网 发布:法院速录员听打软件 编辑:程序博客网 时间:2024/05/22 14:49

有时候为了实现代码重用,  需要将某些公用的代码 和 数据放到一个或几个Servlet 中, 以供其他的 Servlet 使用,为这实现上述功能, Java Web 专门提供了RequestDispather.include 方法,  在具体使用该方法时,可以首先通过 getServletContext  方法获取 ServletContext 对象, 然后通过 ServletContext.getRequestDispatcher 方法获取RequestDispatcher 对象.


IncludingServlet 类演示了如何使用include  方法包含Web 资源,   代码如下:

//包含了一个 Servlet: IncludedServlet 和一个html 页面public class IncludingServlet extends HttpServlet {@Overrideprotected void service(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException{response.setContentType("text/html; charset=gb2312");PrintWriter out = response.getWriter();out.println("中国<br/>");//向客户端输出请求out.println("IncludingServlet URI:" + request.getRequestURI() + "<p/>");// RequestDispatcher对象封装的资源路径前必须加“/”, RequestDispatcher rd = getServletContext().getRequestDispatcher("/servlet/IncludedServlet");//包含 IncludedServletrd.include(request, response);rd = getServletContext().getRequestDispatcher("/chp4/IncludedHtml.html");//包含includedHtml.html页面rd.include(request, response);}}

在 上述代码中, 包含了两个Web资源,映射路径为 "/servlet/IncludedServlet"  的Servlet 类 和 名为IncludedHtml.html 的静态页面

getRequsetDispatcher 方法的参数必须以  "/" 开头

IncludedServlet 类的代码如下:

public class IncludedServlet extends HttpServlet{@Overrideprotected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{response.setContentType("text/plain; charset=utf-8");PrintWriter out = response.getWriter();out.println("<b>超人</b><br/>");out.println("IncludedServlet URI:" + request.getRequestURI() + "<p/>");}}

 在WebRoot\chp4 目录下创建一个IncludedHtml.html 文件,代码如下:

<meta content="text/html; charset=utf-8"><table border="1"><tr><td>Book Name</td><td>Publish Date</td></tr><tr><td>Java 编程思想</td><td>2006年12月</td></tr></table>

在浏览器输入 URL:  http://localhost:8080/webdemo/servlet/IncludingServlet

运行效果如下


              包含了 Web 资源



使用include 方法时,Servlet 引擎并不会 调整HttpServletRequest 中的消息, 因此,IncludingServlet 和 IncludedServlet都输出了访问IncludingServlet 时的URI. 从这一点可以看出,调用 include 方法就相当于 Servlet 引擎在IncludingServlet 的service 方法中又调用了IncludedServlet 的 service 方法, 并将IncludingServlet 的service 方法的两个参数传入了IncludedServlet 的service 方法, 因此才会得出同样的URI 值。


在被调用都 中(在本例中为 IncludedServlet) 设置的响应消息头将被忽略。 读者从IncludedServlet 类中可以看到, 已经将响应正文的编码格式设置成了utf-8, 

但是, 注意Servlet 引擎发送的并不是utf-8编码格式, 而是gb2312.  另外在IncludedServlet  类中设置了MIME 类型是"text/plain" 而在输出“超人” 时变成了粗体, 而不是直接输出"<b>超人</b><br/>".  因此可以断定, 在IncludedServlet 中调用的setContentType  方法并没有生效。



0 0