在使用el时,其实el是先看标识符是否是其隐式对象之一,如果不是,才从四个域(page、request、session、application)中顺序搜索(使用pagecontext.findattribute方法)。
el总共有如下隐式对象:
而这里,el和jsp一样拥有pagecontext对象,通过在el中使用pagecontext对象,能获取jsp中其它几个隐式对象,然后再获得这些对象中的属性。例如获取当前web工程的名称的经典el表达式:${ pagecontext.request.contextpath },就是由pagecontext先获取request对象(因为在jsp的api中,我们可以看到pagecontext有getrequest方法),获取到request对象后,因为request中含有getcontextpath方法,因此我们还可以获得request对象中contextpath属性的值。
pagescope、requestscope、sessionscope、applicationscope这四个el隐式对象分别代表了各自域中的map对象(每个域以关键字来保存数据或对象,肯定是使用map集合),这map对象保存了存在这些域中的键值对。通过el表达式和这些隐式对象,我们可以直接从指定的域中获取存储的数据。
例1:
1
2
3
4
5
6
|
<%
user u = new user();
u.setusername( "fjdingsd" );
session.setattribute( "user" , u);
%>
欢迎您:${sessionscope.user.username}
|
在浏览器中观察:
对于用户登录这样的案例来说,我们检查用户是否登录肯定只需要从session域中查询,这样使用el表达式的sessionscope隐式对象就足够了。
param隐式对象:表示所有请求参数的map集合对象。例如表单提交,那么在请求参数中的数据就以键值对存储在param对象所代表的map集合中,下面的例子我以get方式来替代post方式来模拟表单请求参数:
例2:
1
|
${param.username}
|
在地址栏上添加url参数,可以看到:
使用param隐式对象同样也能作为数据回显功能,在以前jsp页面提交的表单如果想做出数据回显功能,必须创建一个form的bean对象,当表单校验失败时,重新将这个bean对象通过转发(forward)传回jsp页面再取出。而使用param对象,不需要新建form的bean对象,只需要在表单校验失败时转发回表单所在的jsp页面,通过param对象就可以从请求中取出之前的表单数据。
例3:表单验证失败的数据回显demo
在jsp页面beantag.jsp中:
1
2
3
4
|
<form action= "${pagecontext.request.contextpath}/servlet/formhandler" method= "post" >
用户名 <input type= "text" name= "username" value= "${param.username}" />
<input type= "submit" value= "提交" >
</form>
|
在处理表单的servlet中:
1
2
|
//省略表单验证过程,验证失败重新转发到表单页面
request.getrequestdispatcher( "/beantag.jsp" ).forward(request, response);
|
刚进入表单注册页面:
假设表单验证失败,则转发请求到表单注册页面,并回显数据:
paramvalues隐式对象:也是表示一个保存所有的请求参数的map集合对象,但是paramvalues对象和param对象的区别是,对任何一个参数,paramvalues都是以字符串数组(string[])作为保存数据的类型,因此paramvalues对象适合在有同名参数的情况下使用。
例4:
1
|
${paramvalues.name[ 0 ]}
|
浏览器中观察:
例5:
1
|
${paramvalues.name[ 1 ]}
|
浏览器中观察:
header隐式对象:表示一个保存了该jsp页面发出请求的请求头字段的map集合对象。
注意:这个对象只能获取请求头字段的信息,不能获取响应头字段的信息。另外如果头字段中含有小横线的”-”,例如”accept-encoding”,则要使用中括号加引号的el取数据形式,例如 ${ header[‘accept-encoding'] }。
例6:
1
|
${header.connection}
|
在浏览器中观察:
例7:
1
|
${header[ 'accept-encoding' ]}
|
在浏览器中观察:
headervalues隐式对象功能类似于header隐式对象,但以字符串数组封装每个保存的请求头字段信息,这点跟paramvalues隐式对象是一样的。
cookie隐式对象:表示一个保存了该请求中所有的cookie的map集合对象。
假设在请求中有一个cookie,cookie的键值对为:
1
|
jsessionid=e9546ae9c86fb722bdbd7af947157379
|
例8:
1
|
${cookie.jsessionid}
|
在浏览器中观察:
可以看到,cookie隐式对象的名称(cookie)是map集合的名称,而在这个map集合中,有一个键值对的key命名为jsessionid,而通过${cookie.jsessionid}获取到的是一个cookie对象,那么我们如何获取该cookie的值呢?
之前说过el表达式都是通过对象的具有的属性来获取属性值,能被称为属性的都有getxxx方法,而cookie正是具有getname()方法和getvalue()方法,因此在el表达式中获取了cookie对象后可以再获取这两个属性:
例9:
1
2
|
${cookie.jsessionid.name} <br>
${cookie.jsessionid.value} <br>
|
在浏览器中观察:
initparam隐式对象:表示一个保存了所有web应用初始化参数(context-param)的map集合对象。
<context-param>标签用于配置全局性的web参数,在servlet中可以使用 servletcontext.getinitparameter方法获取指定参数的值。
而在jsp页面中,我们可以同el表达式的initparam方法来获取为web应用配置的全局性参数。
例10:
在web.xml文件中配置:
1
2
3
4
5
6
7
|
<context-param>
<param-name>username</param-name>
<param-value>fjdingsd</param-value>
</context-param>
|
在jsp页面中:
1
|
${initparam.username }
|
在浏览器中观察: