Java Web中请求转发和请求包含

1、都是在一个请求中跨越多个Servlet

2、多个Servlet在一个请求中,他们共享request对象。就是在AServle中setAttribute()保存数据在BServlet中由getAttribute()取出数据

3、在AServlet转发到BServlet,那么整个请求都是由BServlet来完成,AServlet不再插手

4、AServlet 包含BServlet,那么两个Servlet共同完成请求

5、请求转发和请求包含都需要使用一个对象RequestDispatcher。

 

 

AServlet.java

package cn.edu.aynu.rjxy.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class AServlet extends HttpServlet {
    /*
     * 请求转发
     * */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //设置响应头
         response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("AServlet...");
        request.setAttribute("name", "张三");
        
        //获得RequestDispatcher对象
        RequestDispatcher rd = request.getRequestDispatcher("/BServlet");
        //将request对象和response对象传递给BServlet
        rd.forward(request, response);
        
    }

}

BServlet.java

package cn.edu.aynu.rjxy.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        String name = (String) request.getAttribute("name");
        response.getWriter().print("BServlet为您服务...");
        response.getWriter().print("name="+name);
    }

}

CServlet.java

package cn.edu.aynu.rjxy.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CServlet extends HttpServlet {

    /*
     * 请求包含
     * */
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        //设置响应头
         response.setContentType("text/html;charset=utf-8");
        response.getWriter().print("AServlet为您服务...");
        RequestDispatcher rd = request.getRequestDispatcher("/DServlet");
        rd.include(request, response);
    }

}

DSevler.java

package cn.edu.aynu.rjxy.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DServlet extends HttpServlet {

    
    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        response.getWriter().print("DServlet为您服务...");
    }

}

1、请求转发是一个请求,而重定向是两个请求

2、请求转发后浏览器地址栏不会发生变化重定向会发生变化

3、请求转发的目标只能在本项目中的资源,重定向的目标可以是其他应用

4、请求转发对Aservlet和Bservlet的请求方法是相同的,就是要么都是get,要么都是post。因为他们是同一个请求

5、请求转发可以在多个Servlet中共享request的数据,而重定向不行。

posted on 2016-09-28 07:58  kang_ya_ping  阅读(3900)  评论(0编辑  收藏  举报

导航