JSP内置(隐示)对象
JSP隐式对象是JSP容器为每个页面提供的Java对象,已经封装内置好了,开发者可以直接使用它们而不用显式声明。一共九大内置对象
对象 | 描述 |
---|---|
request | HttpServletRequest 接口的实例 |
response | HttpServletResponse 接口的实例 |
session | HttpSession类的实例 |
pageContext | PageContext类的实例,提供对JSP页面所有对象以及命名空间的访问 |
application | ServletContext类的实例,与应用上下文有关 |
config | ServletConfig类的实例 |
page | 类似于Java类中的this关键字 |
out | JspWriter类的实例,用于把结果输出至网页上 |
Exception | Exception类的对象,代表发生错误的JSP页面中对应的异常对象 |
详情参考here(写的很全)
JSP中的作用域对象
- pageContext:面对页面 只在一个页面保留数据
- request:面对请求 只在一个请求中保存数据
- session:面对当前浏览器 在一次会话中保存数据,仅供单个用户使用
- application:面对服务器 在整个服务器中保存数据,全部用户共享
1、新建一个demo01.jsp文件
<%--设置作用域的值--%>
<% pageContext.setAttribute("pagecontext" , "pagecontext的值");%>
<% request.setAttribute("request" , "request的值");%>
<% session.setAttribute("session" , "session的值");%>
<% application.setAttribute("application" , "application的值");%>
<%--取值--%>
pagecontext:${pagecontext}<br> <%--页面显示pagecontext的值--%>
request:${request}<br> <%--页面显示request的值--%>
session:${session}<br> <%--页面显示session的值--%>
application:${application}<br> <%--页面显示application的值--%>
结果:
2、再新建一个demo02.jsp文件,再次直接取这四个值
pagecontext:${pagecontext}<br>
request:${request}<br>
session:${session}<br>
application:${application}<br>
结果:
- 这里没有取到pageContext对象的值是因为pageContext对象只作用于自己一个页面,切换页面取不到值
- 没有request的值是因为这里不是请求过来的,我是直接访问demo02.jsp页面
- session的值还在是因为默认30分钟的存活期,只有浏览器不关闭,session就还在
- application的值还在是因为服务器不关闭,值就在
3、关闭浏览器,重新访问demo02.jsp(或者换个浏览器)
结果:
- session值不见了是因为session对象是面向浏览器会话的,一旦浏览器关闭,这个会话对象无法找到,暂时当消失处理,再也取不到值
- application的值还在是因为服务器没有关闭,值就在
关于pageContext对象
1、findAttribute()方法只有pageContext有
- 可以获取所有其他域对象中的值
<%=pageContext.findAttribute("request") %> <%--取demo01.jsp中的request的值 结果是:request的值--%>
- 当不同域对象中有相同key值时,优先取作用域范围小的
将名称都设成一样的
<% pageContext.setAttribute("a" , "pagecontext的值");%>
<% request.setAttribute("a" , "request的值");%>
<% session.setAttribute("a" , "session的值");%>
<% application.setAttribute("a" , "application的值");%>
<%--取值--%>
<%=pageContext.findAttribute("a")%> <br> <%--结果:pagecontext的值 如果名称一样,会优先取作用范围最小的作用域的值。等同于下面使用el表达式的方式--%>
${a}<br><%--结果:pagecontext的值--%>
2、名称相同,取特定作用域对象的值
<%--取特定作用域的值 session--%>
<%=pageContext.getAttribute("a", pageContext.SESSION_SCOPE)%><br>
${sessionScope.a}<br><%--session的值 和上面取值一样--%>
3、通过pageContext设置其他作用域的值
<%
pageContext.setAttribute("a1" , "page的值" , pageContext.PAGE_SCOPE);
pageContext.setAttribute("a1", "request的值", pageContext.REQUEST_SCOPE);
pageContext.setAttribute("a1", "session的值",pageContext.SESSION_SCOPE);
pageContext.setAttribute("a1", "application的值", pageContext.APPLICATION_SCOPE);
%>
<%--取值--%>
<%=request.getAttribute("a1")%><br><%--request的值--%>
<%=pageContext.findAttribute("a1")%><br><%--page的值--%>
${applicationScope.a1}<%--application的值--%>
Servlet中的作用域对象
Web组件在跳转的时候可以共享数据(信息共享),Web组件信息共享必须依赖作用域对象. 我们是把共享的信息先存放在共享对象中再做传递,在目标里面从共享对象中获取数据. Servlet1 ------------>作用域对象(数据)-----------> Servlet2
- ServletContext:上下文共享;从存储开始,到tomcat关闭都有;
- request:请求共享;同一次请求中,共享数据可以获取,但请求结束,请求共享清除;请求转发能共享,重定向不能;
- session:session共享/回话共享;同一次回话,共享数据可以获取;(回话:从共享数据开始,到浏览器关闭或主动清发和重定向影响,只要存到session中,浏览器不关闭,session不主动清除,就可以获取)
把数据存放到作用域,从作用域取出数据,修改/删除数据
所有作用域对象的操作方法都是相同的
-
设置共享数据: 作用域对象.setAttribute(String name,Object value)
-
获取共享数据: Object val = 作用域对象.getAttribute(String name);
-
删除共享数据: 作用域对象.removeAttribute(String name);
注意:从哪一个作用域中设置共享数据,就只能从该作用域中取出共享数据.
如果需要共享请求中的数据,只能使用请求转发(forward).
EL表达式中的对象
原文链接https://blog.csdn.net/qq_17045385/article/details/54799998
EL可以输出的东西都在11个内置对象中,11个内置对象,其中10个是Map,只有pageContext不是Map,它就是PageContext类型,EL所有内置对象如下:
-
pageScope:获取pageContext域属性,相当于pageContext.getAttribute(“xxx”)
-
requestScope:获取request域属性,相当于request.getAttribute(“xxx”)
-
sessionScope:获取session域属性,相当于session.getAttribute(“xxx”)
-
applicationScope:获取application域属性,相当于application.getAttribute(“xxx”)
-
param:对应参数,它是一个Map,其中key是参数,value是参数值,适用于单值的参数,相当于request.getParameter(“xxx”)
-
paramValues:对应参数,她是一个Map,其中key是参数,value是多个参数值,适用于多值的参数,相当于request.getParameterValues(“xxx”)
-
header:对应请求头,它是一个Map,其中key表示头名称,value是单个头值,适用于单值的请求头,相当于request.getHeader(“xxx”)
-
headerValues:对应请求头,它是一个Map,其中key表示头名称,value是多个头值,适用于多值的请求头,相当于request.getHeaders(“xxx”)
-
initParam:获取web.xml中内的参数,${ initParam.xxx},xxx就是标签内的值,进而得到中的值
-
cookie:用于获取cookie,Map<String,Cookie>,其中key是cookie的name,value是cookie对象,例如${cookie.JSESSIONID.value }就是获取sessionId
-
pageContext:可以获取JSP九大内置对象,相当于使用该对象调用getxxx()方法,例如pageContext.getRequest()可以写为${pageContext.request)
EL表达式在获取Map的值或Bean的属性值是,可以使用“点”的方法,也可以使用“下标”的方法。
i n i t P a r a m . a 与 {initParam.a}与 initParam.a与{initParam[‘a’]},它们是完成的东西相同的。但是,如果Map的键或Bean的属性名中包含下划线或横岗时,那么就必须使用“下标”方法,例如:${initParam[‘a_a’]}