如何处理四大作用域取值?
四大作用域:
一、application(ServletContext)
1、生命周期:当Web应用被加载进容器时创建代表整个web应用的application对象,当服务器关闭或Web应用被移除时,application对象跟着销毁。
2、作用范围:整个Web应用。
3、作用:
a)application.setAttribute(“key”,Object value):存储整个web应用公用的数据
b)在不同Servlet 之间转发(不常用)
this.getServletContext().getRequestDispatcher("/servlet/Demo10Servlet").forward(request,response);
方法执行结束,service就会返回到服务器,再有服务器去调用目标servlet,其中request会重新创建,并将之前的request的数据拷贝进去。
注意:由于request对象也有getRequestDispatcher("**")方法,所有我们开发是通常使用request调用该方法实现重定向。
二、session 域 (HttpSession)
HttpSession 在服务器中,为浏览器创建独一无二的内存空间,在其中保存会话相关的信息。
1、生命周期:在第一次调用 request.getSession() 方法时,服务器会检查是否已经有对应的session,如果没有就在内存中创建一个session并返回。
当一段时间内session没有被使用(默认为30分钟),则服务器会销毁该session。 如果服务器非正常关闭(强行关闭),没有到期的session也会跟着销毁。 如果调用session提供的invalidate() ,可以立即销毁session。
注意:服务器正常关闭,再启动,Session对象会进行钝化和活化操作。同时如果服务器钝化的时间在session 默认销毁时间之内,则活化后session还是存在的。否则Session不存在。如果JavaBean 数据在session钝化时,没有实现Serializable 则当Session活化时,会消失。
2、作用范围:一次会话。
3、作用:保存登录的用户信息、购物车信息等
三、request域 --(HttpServletRequest)
1、生命周期:在service 方法调用前由服务器创建,传入service方法。整个请求结束,request生命结束。
2、作用范围:整个请求链(请求转发也存在)。
3、作用: 在整个请求链中共享数据。最常用到:在Servlet 中处理好的数据交给Jsp显示,此时参数就可以放置在Request域中带过去。
四、pageContext域—(PageContext)
1、生命周期:当对JSP的请求时开始,当响应结束时销毁。
2、作用范围:整个JSP页面,是四大作用域中最小的一个。
作用:
(1)获取其它八大隐式对象,可以认为是一个入口对象。
(2)获取其所有域中的数据
使用EL取作用域中的值和用法:
使用el的时候,默认会以一定顺序搜索四个作用域,将最先找到的变量值显示出来。
例: 依次调用pageContext.getAttribute("username") -> request.getAttribute("username") -> session.getAttribute("username") -> application.getAttribute("username"),只要找到某一个不为空的值就立刻返回。
如果pageContext和request中有同名变量,但是想取得request中的变量,则需要为el表达式引入作用域
注意:如果你要用EL输出一个常量的话,字符串要加双引号,不然的话EL会默认把你认为的常量当做一个变量来处理,这时如果这个变量在4个声明范围不存在的话会输出空,如果存在则输出该变量的值。
pageContext 当前页的pageContext对象 :
${pageContext.request.contextPath}返回的是request.getContextPath()的值,我们经常使用这个来拼接jsp中的绝对路径。
这里的${pageContext.request.contextPath}是一种特殊用法,不能使用${request.contextPath}的形式替代。
requestScope 把request作用域中的数据映射为一个map对象
pageScope, requestScope, sessionScope, appliationScope都可以看作是Map型变量,调用其中的数据可以使用${pageScope.name}或${pageScope["name"]}的形式,这两种写法是等价的。
在有特殊符号时情况下只能使用${pageScope["content-type"]},jsp无法解析连字符(-)会出现错误。
paramValues request.getParameterValues()
需要注意的是${paramValues.name}得到的是一个字符串数组
,如果需要获得其中某个值,还需要使用${paramValues.name[0]}指定数组中的索引。
这与${headerValues.name}是相似的。
header 对应request.getHeader()
${header.name}会取得http请求中的header参数,现实工作中很少用到这里的数据。
cookie 对应request.getCookies()
所谓的cookie是一个小小的文本文件,它是以key、value的方式将Session Tracking的内容记录在这个文本文件内,这个文本文件通常存在于浏览器的暂存区内。
JSTL并没有提供设定cookie的动作,因为这个动作通常都是后端开发者必须去做的事情,而不是交给前端的开发者。
例:
Cookie cookie = new Cookie("username", "Username in cookie"); response.addCookie(cookie);
创建一个名称为username,值为"Username in cookie"的Cookie对象,然后发送给客户端然后我们就可以使用${cookie.username}获得这个cookie了,${cookie.username.name}获得cookie名称,${cookie.username.value}获得cookie值。
initParam 对应ServletContext.getInitParamter()
ServletContext.getInitParamter()指的应用的初始变量,这些变量都是定义在web.xml中的。
<context-param> <param-name>username</param-name> <param-value>username with context param</param-value> </context-param>
${initParam.username}就会得到这里的变量值。