学科分类
目录

请求包含

请求包含指的是使用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地址是不会发生变化的。

点击此处
隐藏目录