JSP中的数据作用域

一.什么是数据作用域

数据作用域,Scope,也就是指代数据共享的范围,数据存储在合适的范围,在需要的地方取到

二.JSP四大数据作用域

作用域分为四种,分别为:

page
在当前页面有效(仅用于JSP中)
request
在当前请求中有效
session
在当前会话中有效
application
在所有应用程序中有效

关于request,seesion,application形象解释:

  参考来源:https://blog.csdn.net/phoxe_bai/article/details/2812417

首先设定一个情景,一个客人(浏览器)饭馆(服务器),客人要求点菜(发出HTTP请求),接受点菜信息(数据)服务员(Servlet或JSP),再将点菜单送给厨师(另一个Servlet或者JSP),菜做好后,服务员上菜(服务器的响应)客人从进店到离开饭店(一个HTTP会话)

Web交互的最基本单位是HTTP请求(客人点菜),一个服务器的运行过程中会有多个用户访问,也就是多个HTTP会话

page
在当前页面有效(仅用于JSP中)
request
HTTP请求开始到结束这段时间
session
HTTP会话开始到结束这段时间
application
服务器启动到停止这段时间

作用范围从大到小:

1.application

  作用域是服务器启动到停止这段时间(饭馆从开张到打烊),这个作用域内设置信息,比如饭馆设置一下特色菜,那么这个数据会被所有用户给拿到,所有客人一进来都能看到特色菜是什么,再有,饭馆的一张张菜单都保存了点菜的数据,不会随着客人的流动而丢失,在计算收入的时候,可以拿出来用。

  实现方式:通过ServetContext接口实现

    方法:Object getAttribute(String name)  //从application中获取信息;

       void setAttribute(String name, Object value)  //向application作用域中设置信息。

@WebServlet(value = "/init",loadOnStartup = 1)
public class InitServlet extends HttpServlet {
    @Override
    public void init() {
        String path=getServletContext().getContextPath();
        //application作用域
        getServletContext().setAttribute("contextPath",path);
        getServletContext().setAttribute("sitename","图书商城");
    }
}

2.session

  与会话有关,同一个浏览器访问多次,多次访问之间传递信息,比喻为一个客人可能会多次呼叫服务员,加菜,加酒,服务员则将信息都记录下来,这些数据在客人离开饭店(结束会话)之前都有效,这就是session的作用域

    实现方式:通过HttpSession接口实现

      方法:Object HttpSession.getAttribute(String name)  //从session中获取信息。

         void HttpSession.setAttribute(String name, Object value)//向session中保存信息。

         HttpSession HttpServletRequest.getSession()  //获取当前请求所在的session的对象。

          //得到需要保存的数据
         User user = userService.login(account, password);
        //得到HttpSession对象
        HttpSession session = req.getSession();
        //将数据存在session作用域中
        session.setAttribute("user", user);            

3.request

  一个HTTP请求的处理可能需要多个Servlet,Jsp合作,客人点菜(请求)到上菜(响应),需要有服务员把点菜信息告诉给厨师,在上完菜之后,这件事就算完成了,信息也就没用了。

  实现方式:通过HttpServletRequest接口实现

    方法:void setAttribute(String name, Object value)  //将对象value以name为名称保存到request作用域中。

       Object getAttribute(String name) //从request作用域中取得指定名字的信息。

   转发数据: RequestDispatcher ServletContext.getRequestDispatcher(String path) //取得Dispatcher以便转发,path为转发的目的Servlet或JSP。

         void RequestDispatcher.forward(ServletRequest request, ServletResponse response)//将request和response转发

         //Servlet中
        //请求中保存数据
        req.setAttribute("goods", goods);
        req.setAttribute("pagebean", goodsService.getByPage(page, goods));
        // 使用RequestDispatcher 接口的 forward 方法,将请求转发给其他Servlet或JSP
        req.getRequestDispatcher("goods_list.jsp").forward(req, resp);       

4.page

  把变量放到pageContext里,就说明它的作用域是page,它的有效范围只在当前jsp页面里,也就是说page里的变量只要页面跳转了,它们就不见了。

三.使用表达式语言 Expression Language从作用域获取数据

  语法:${expression}

  特点:从作用域范围由小到大取值,可以使用pageScope,requestScope,sessionScope、applicationScope限定从哪个作用域中获取数据

      不指定范围:${user},这个时候如果不同作用域中有同名的数据名name,则数据值value在最小的那个范围内取

      指定范围:${sessionScope.user},在指定了范围后,数据只能在指定的地方找,有同名数据的不影响

  另:使用EL内置对象param取值,${param.user}相当于<%=request.getParameter("user")%>

 

posted @ 2020-07-04 19:33  木子李和三点水  阅读(607)  评论(0编辑  收藏  举报