有时候为了实现代码重用, 需要将某些公用的代码 和 数据放到一个或几个Servlet 中, 以供其他的 Servlet 使用,为这实现上述功能, Java Web 专门提供了RequestDispather.include 方法, 在具体使用该方法时,可以首先通过 getServletContext 方法获取 ServletContext 对象, 然后通过 ServletContext.getRequestDispatcher 方法获取RequestDispatcher 对象.
IncludingServlet 类演示了如何使用include 方法包含Web 资源, 代码如下:
//包含了一个 Servlet: IncludedServlet 和一个html 页面
public class IncludingServlet extends HttpServlet {
@Override
protected 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");
//包含 IncludedServlet
rd.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{
@Override
protected 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 方法并没有生效。