Servlet------RequestDispatcher请求转发

一、RequestDispatcher对象由Servlet容器创建,用于封装一个由路径所标识的服务器资源,利用RequestDispatcher对象可以将请求转发给其他的Servlet或JSP页面,
RequestDispatcher是一个接口,得到RequestDispatcher对象有以下三种方法

  • RequestDispatcher rd = context.getNamedDispatcher("login");
-----利用ServletContext context对象,参数login是Servlet或JSP页面的名字。
  • RequestDispatcher rd = context.getRequestDispatcher("/login");
-----利用ServletContext context对象,参数"/login"是在xml中定义的Servlet路径,此方法的参数必须以"/"开始,被解释为相对于当前上下文根(context root)路径
  • RequestDispatcher rd = req.getRequestDispatcher("/login");

-----利用ServletRequest req对象,返回一个RequestDispatcher对象,此方法的参数不但可以是相对上下文的根路径,如果路径没有以斜杠(/)开始,则被解释为相对于当前Servlet的路径

二、RequestDispatcher接口中定义了两种方法用于将请求转发
  • public void forward(ServletRequest request, ServletResponse response) throws ServletException, java.io.IOException

-----原Servlet调用此方法后将请求转发给服务器上的另一个Servlet、JSP或HTML文件,且原Servlet此方法之前的代码将自动清除,此方法之后的代码也不再执行,将控制权交
由另一个Servlet

  • public void include(ServletRequest request,ServletResponse response) throws ServletException, java.io.IOException

-----原Servlet调用此方法后将请求转发给服务器上的另一个Servlet、JSP或HTML文件,且另一个Servlet执行完之后将控制权将由原Servlet继续执行


三、请求转发的实例
  1. public class PortalServlet extends HttpServlet{
  2. public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
  3. res.setContentType("text/html;charset=gb2312");
  4. PrintWriter out = res.getWriter();

  5. out.println("<html><head>");
  6. out.println("<title>登录页面</title>");
  7. out.println("</head><body>");
  8. String name = req.getParameter("username");
  9. String pwd = req.getParameter("password");
  10. if("ye".equals(name) && "123".equals(pwd)){
  11. ServletContext context = getServletContext();
  12. RequestDispatcher rd = context .getRequestDispatcher("/welcome");
  13. rd.forward(req, res);
    //6-8行输出的HTML代码将被自动清除,23-24行代码也不执行,Servlet容器将控制权交给welcome这个Servlet
  14. }
  15. else{
  16. RequestDispatcher rd = req.getRequestDispatcher("login2");
  17. rd.include(req, res);
    //login2这个Servlet执行完后再从这里接着往下执行
  18. }
  19. out.println("</body></html>");
  20. out.close();
  21. }
  22. public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException{
  23. doGet(req, res);
  24. }

四、sendRedirect()和forward()方法的区别
-----HttpServletResponse接口的sendRedirect()方法和RequestDispatcher接口的forward()方法都可以利用另外的资源(Servlet、JSP页面或HTML文件)来为客户端服务,但两种方法有本质的区别
        
1、sendRedirect()方法

  • ---->浏览器访问Servlet1
  • ---->Servlet1调用sendRedirect()重定向到Servlet2
  • ---->浏览器访问Servlet2
  • ---->Servlet2对客户端的请求做出响应
2、forward()方法
  • ---->浏览器访问Servlet1
  • ---->Servlet1调用forward()方法转发给Servlet2
  • ---->Servlet2对请求做出响应
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值