#Servlet——Web之间跳转和信息共享、三大作用域对象

为什么需要Servlet之间的交互?

1.Web组件(Servlet/JSP)的交互:
    Web组件之间的跳转,数据共享.
        1.ListServlet:
            1.接收请求参数
            2.调用业务逻辑处理请求    List<Student> list=dao.list()
            3.直接通过输出流对象输出到list.jsp页面,负责输出所有的学生信息 req.getRequestDispatcher("/list.jsp").forward(req,resp)
                把student传递jsp页面,跳转到jsp,负责输出student信息
        2.list.jsp
            1.获取到student对象
            2.将student信息展示
            3.把参数传递给DeleteServlet
        3.DeleteServlet
            1.获取请求参数
            2.调用业务逻辑处理请求
            3.跳转到ListServlet页面 resp.sendRedirect("/listServlet")(重新查询所有的学生信息,重新把信息转发到list.jsp)
        ![](https://img2020.cnblogs.com/blog/1668748/202004/1668748-20200426192229808-309800312.jpg)

Web之间的跳转和信息共享

1.Web组件之间的跳转方式
    *请求转发(forward) req.getRequestDispatcher("str").forward(res,resp)
    *重定向(redirect) resp.sendRedirect("str")
    *请求包含(include)

2.请求转发
    *从Servlet1,请求转发到Servlet2. Servlet1完成一部分功能,再跳转到Servlet2继续完成剩下的功能.
        1.语法:
            req.getRequestDispatcher("str").forward(req,resp);
            参数: path,表示跳转的目标的路径(资源的名称)
            注意: 不要忘了forward
        2.特点:
            1.请求转发只发出一次请求
            2.地址栏不会发生变化
            3.响应效果由Servlet2决定
            4.请求转发不可以跨域共享资源,只能跳转到当前应用的资源
            5.共享同一个请求的资源
            6.请求转发可以访问WEB-INF下的资源
    ![](https://img2020.cnblogs.com/blog/1668748/202004/1668748-20200426194815175-1144608610.png)

URL重定向

1.语法:
    respond.sendRedirect(String url)
2.特点:
    1.浏览器的地址栏发生改变
    2.重定可以跨区域访问,向发出两次请求
    3.重定向可以访问外部资源
    4.重定向不可以访问WEB-INF下的资源
    5.因为重定向是两次请求,所以不可以共享请求资源
    6.最终响应给浏览器的效果由Servlet2决定
    ![](https://img2020.cnblogs.com/blog/1668748/202004/1668748-20200426202708161-109977267.png)

Servlet三大作用域对象

1.目的: 共享数据
    1.request
    类型:HttpServletRequest
    每一个请求都是一个新的request,如果想共享同一请求的资源,只能使用请求转发
    2.session
    类型:HttpSession
    每一次会话都是一个新的Session对象,如果想在一次对话多次请求中共享数据,只能使用Session
    3.application
    类型: ServletContext
    应用对象,Tomcat启动到Tomcat结束表示一个应用,在一个应用中有且只有一个application对象,作用整个Web应用,可以实现多次会话之间的数据共享

作用域对象如何共享数据:

1.设置作用域中的共享数据.
    作用域对象.setAttribute(String name,Object value)
2.获取作用域的共享数据
    作用域对象.getAttribute(String name)
3.删除作用域的共享数据
    作用域.removeAttribute(String name)

注意:在哪个作用域中设置值,就只能从该作用域中获取值
原文地址:https://www.cnblogs.com/linjing111/p/12783021.html