很多时候,使用一个servlet来收集、处理请求,处理的结果会交由另一个Servlet对浏览器进行响应。如果使用多个servlet处理请求,则会依据请求的内容来决定转发给哪一个servlet作下一步的处理。
执行语句:
ResquestDispatcher rd = request.getRequestDispatcher("URL");
转发请求有两种:forward / include
1、forward转发
html:
<a href="s1">转发请求器</a>
servlet1:
public class servlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
resp.getWriter().write("这是servlet1里面的resp");
req.setAttribute("test", "这是Servlet1里面的test");
RequestDispatcher rd = req.getRequestDispatcher("s2");
rd.forward(req, resp);
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp){
doGet(req,resp);
}
}
sevlet2:
public class servlet2 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("这是servlet2里面的resp");
String test = (String)req.getAttribute("test");
resp.getWriter().write(test+"<br/>");
}
protected void doPost(HttpServletRequest req, HttpServletResponse resp){
doGet(req,resp);
}
}
web.xml文件(此时应该配置2个servlet的xml文件):
<servlet>
<servlet-name>s1</servlet-name>
<servlet-class>com.sy.servlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s1</servlet-name>
<url-pattern>/s1</url-pattern>
</servlet-mapping>
<servlet>
<servlet-name>s2</servlet-name>
<servlet-class>com.sy.servlet2</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>s2</servlet-name>
<url-pattern>/s2</url-pattern>
</servlet-mapping>
结果:
会发现servlet1里面的resp并没有write出来,但是resp里面设置的响应contentType起作用了。
2、include转发
代码与上面都一样,不过将rd.forward(req, resp) 改为 rd.include(req, resp);
结果:
发现servlet1里面的write可以实现了。
总结:
forward:servlet1将请求全部转给servlet2,自己的resp不响应
include:是将servlet2的resp包含在了servlet1,在客户端会感觉只有一个servlet,也就是所有的resp都会被响应。
forward:
include: