一.什么是数据作用域
数据作用域,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")%>