RequestDispatcher接口实现转发:
jsp1上链接到Servlet,Servlet再转发(关键在这里怎么实现转发??)
演示index.html页面---->Servlet1(转发到)------>Servlet2
实现转发流程
1.用HttpServletRequest的getRequestDispatcher(path)方法,path就是指定转发到的目标地址
RequestDispatcher rd = request.getRequestDispatcher("/servlet2");
2.getRequestDispatcher方法返回的RequestDispatcher对象调用forword方法实现最终的转发动作。
rd.forward(request, response);
演示index.html页面---->Servlet1(重定向到)------>Servlet2
sendRedirect接口实现重定向:
直接HttpServletResponse调用sendRedirect(重定向的目标地址)。
response.sendRedirect("servlet2");
转发和重定向的区别:
1.请求的转发是一种服务器行为,转发时request对象会被保存,也就是说被转发到的另外一个servlet或其他资源中的request对象,跟请求转发的request是同一个对象。又由于这个过程是服务端行为,所以客户端的地址栏不会发生改变。从始到终请求只有一次,一个!
2.请求的重定向是一种客户端行为,实际上期间发生的是两次请求,前一次的请求request对象不会作保存,两个Servlet里的reuqest对象不是同一个,且地址栏地址会发生改变。
jsp页面也是一样的,演示:a.jsp链接到->b.jsp转发到->c.jsp(request保留)
3.转发只能转发到Web应用内部的资源,重定向可以到任何资源。
4.转发中地址用“/”表示WEB应用的根目录,重定向中地址“/”是站点的根目录。
index01.jsp:
<a href="/requestDispatcher/servlet1">跳转到Servlet01</a>
index02.jsp:
<h2>此页面为index02.jsp</h2>
index03.jsp:
<h2>[重定向:]这里是index03.jsp页面</h2>
Servlet1:
public class Servlet01 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//转发:getRequestDispatcher("转发地址").forward(request, response)request.getRequestDispatcher("/servlet2").forward(request, response);//转发到servlet2//重定向:
// response.sendRedirect("/requestDispatcher/index03.jsp");}
}
Servlet2:
public class Servlet02 extends HttpServlet {private static final long serialVersionUID = 1L;protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {//设置浏览器响应字符集response.setHeader("Content-type", "text/html;charset=UTF-8");response.getWriter().print("[转发:]本Servlet是Servlet02");}
}