1.Web应用在处理客户端的请求的时候,一般的时候都需要多个资源协同处理,比如先经过一个Servlet的处理,然后再经过另外一个Servlet的处理。但是在一个Servlet中又不能直接调用另外一个Servlet的service方法,所以Servlet就提供了请求转发解决方案。
2.这里省略掉创建Java Web项目以及创建包的步骤,直接在原来创建好的项目中直接创建Servlet。
3.创建一个ServletA实现HttpServlet规范,并重写service方法
此时从ServletA中请求转发到ServletB,此时假定ServletB访问路径是req02。
@WebServlet("/req01")
public class ServletA extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("request a");
request.getRequestDispatcher("req02").forward(request,response);
}
}
4.创建一个ServletB实现HttpServlet规范,并重写service方法。
@WebServlet("/req02")
public class ServletB extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("request B");
}
}
5.在浏览器地址栏中输入:http://localhost:8686/s01/req01 ,可以看到控制台中会输入如下信息
可以看到调用完了ServletA后,接着调用ServletB
改写ServletA的代码
@WebServlet("/req01")
public class ServletA extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置HTTP响应的编码以及浏览器显示的编码
response.setContentType("text/html;charset=UTF-8");
System.out.println("request a");
request.setAttribute("servletName","第一个Servlet");
request.setAttribute("url","地址");
request.getRequestDispatcher("req02").forward(request,response);
}
}
7.改写ServletB的代码
@WebServlet("/req02")
public class ServletB extends HttpServlet {
@Override
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html;charset=UTF-8");
System.out.println("request B");
String servletName = (String) request.getAttribute("servletName");
String url = (String) request.getAttribute("url");
System.out.println("servletName:" + servletName + " url:" + url);
}
}
8.刷新之前浏览ServletA的网页,Idea控制台中输入内容如下
9.可以看到在ServletA中设置的请求属性可以在ServletB中接收
10.下面总结一下请求转发具有以下特点:
① 请求转发不支持跨域访问,只能跳转到当前应用中的资源。
② 请求转发之后,浏览器地址栏中的 URL 不会发生变化,因此浏览器不知道在服务器内部发生了转发行为,更无法得知转发的次数。
③ 参与请求转发的 Web 资源之间共享同一 request 对象和 response 对象。
④ 由于 forward() 方法会先清空 response 缓冲区,因此只有转发到最后一个 Web 资源时,生成的响应才会被发送到客户端。