012、请求转发和共享数据

一、. 请求转发:一种在服务器内部的资源跳转方式。比如说一个项目为了维护和分工,不会将所有功能放到一个servlet内,比如有A、B、C,浏览器访问A时,A可以在内部跳转到B、C,这就是内部资源跳转。
    (1). 步骤:
        1. 通过request对象获取请求转发器对象:RequestDispatcher getRequestDispatcher(String path)
        2. 使用RequestDispatcher对象来进行转发:forward(ServletRequest request, ServletResponse response) 

    (2). 特点:
        1. 浏览器地址栏路径不发生变化
        2. 只能转发到当前服务器内部资源中。
        3. 转发是一次请求,通过浏览器中抓包可以看到,浏览器只发送了一次请求。


二. 共享数据:
    * 域对象:一个有作用范围的对象,可以在范围内共享数据
    * request域:代表一次请求的范围,一般用于请求转发的多个资源中共享数据。个人理解就是一次请求,如果涉及多个servlet,这些servlet就是一个域对象,可以共享数据。
    * 方法:
        1. void setAttribute(String name,Object obj):存储数据
        2. Object getAttitude(String name):通过键获取值
        3. void removeAttribute(String name):通过键移除键值对

        4. 获取ServletContext:
            * ServletContext getServletContext()
注意:设置共享数据要放到请求转发前面进行

举例:

ServletDemo08.java

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;

@WebServlet("/ServletDemo08")

public class ServletDemo08 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //这个可以解决中文的字符乱码问题
        request.setCharacterEncoding("utf-8");

        System.out.println("demo08...");

        //设置共享数据---注意这个要放到转发数据前面
        request.setAttribute("msg","hello world!");

        //转发数据
        RequestDispatcher requestDispatcher = request.getRequestDispatcher("/ServletDemo09");
        requestDispatcher.forward(request,response);



    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

 ServletDemo09.java

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.Enumeration;
import java.util.Map;
import java.util.Set;

@WebServlet("/ServletDemo09")

public class ServletDemo09 extends HttpServlet {
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //这个可以解决中文的字符乱码问题
        request.setCharacterEncoding("utf-8");

        System.out.println("demo09....");

        //获取共享数据
        Object msg = request.getAttribute("msg");
        System.out.println(msg);
    }

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        this.doPost(request,response);
    }
}

控制台输出:

demo08...
demo09....
hello world!

发布了285 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/l0510402015/article/details/104703322