请求包含
请求包含指的是使用include()方法将Servlet请求转发给其它Web资源进行处理,与请求转发不同的是,在请求包含返回的响应消息中,既包含了当前Servlet的响应消息,也包含了其他Web资源所作出的响应消息。为了使大家更好地了解如何使用include()方法实现请求包含,接下来,通过一个图例来描述include()方法的工作原理,如图1所示。
图1 include()方法的工作原理
从图1中可以看出,当客户端访问Servlet1时,通过调用include()方法将其它Web资源包含了进来,这样,当请求处理完毕后,回送给客户端的响应结果既包含当前Servlet的响应结果,也包含其它Web资源的响应结果。
了解了include()方法的工作原理,接下来,通过一个案例来讲解include()方法的使用。首先编写两个Servlet,分别是IncludingServlet和IncludedServlet,其中,在IncludingServlet中调用include()方法请求包含IncludedServlet。这两个Servlet的具体实现代码如例1、2所示。
例1 IncludingServlet.java
1 package cn.itcast.chapter05.request;
2 import java.io.*;
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5 public class IncludingServlet extends HttpServlet {
6 public void doGet(HttpServletRequest request, HttpServletResponse response)
7 throws ServletException, IOException {
8 PrintWriter out = response.getWriter();
9 RequestDispatcher rd = request
10 .getRequestDispatcher("/IncludedServlet?p1=abc");
11 out.println("before including" + "<br>");
12 rd.include(request, response);
13 out.println("after including" + "<br>");
14 }
15 public void doPost(HttpServletRequest request, HttpServletResponse response)
16 throws ServletException, IOException {
17 doGet(request, response);
18 }
19 }
例2 IncludedServlet.java
1 package cn.itcast.chapter05.request;
2 import java.io.*;
3 import javax.servlet.*;
4 import javax.servlet.http.*;
5 public class IncludedServlet extends HttpServlet {
6 public void doGet(HttpServletRequest request, HttpServletResponse response)
7 throws ServletException, IOException {
8 // 设置响应时使用的字符编码
9 response.setContentType("text/html;charset=utf-8");
10 response.setCharacterEncoding("utf-8");
11 PrintWriter out = response.getWriter();
12 out.println("中国" + "<br>");
13 out.println("URI:" + request.getRequestURI() + "<br>");
14 out.println("QueryString:" + request.getQueryString() + "<br>");
15 out.println("parameter p1:" + request.getParameter("p1") + "<br>");
16 }
17 public void doPost(HttpServletRequest request, HttpServletResponse response)
18 throws ServletException, IOException {
19 doGet(request, response);
20 }
21 }
启动Tomcat服务器,在浏览器的地址栏中输入URL地址http://localhost:8080/chapter05/IncludingServlet
访问IncludingServlet,浏览器显示的结果如图2所示。
图2 运行结果
从图2中可以看到,IncludedServlet中输出的中文字符出现了乱码,说明在例2中,用于设置响应字符编码的第9行代码不起作用。这是因为在请求IncludingServlet时,用于封装响应消息的HttpServletResponse对象已经创建,该对象在编码时采用的是默认的iso8859-1,所以,当客户端对接受到的数据进行解码时,Web服务器会继续保持调用HttpServletResponse对象中的信息,从而使IncludedServlet中的输出内容发生乱码。
为了解决图3所示的乱码问题,接下来,对例1进行修改,在第7行和第8行代码之间增加一行代码,具体如下:
response.setContentType("text/html;charset=utf-8");
重新启动服务器,通过浏览器重新访问IncludingServlet,此时,浏览器显示的结果如图3所示。
图3 运行结果
从图3可以看出,IncludedServlet中输出的中文字符正常显示了。需要注意的是,使用include()方法实现请求包含后,浏览器显示的URL地址是不会发生变化的。