setProperty>与getPropery>。
不过getProperty>在使用上,语法仍是较为冗长。
如果只是要“取得”属性,使用EL则可以更为简洁。
例如:
getPropertyname="user"property="name"/>登录成功
如果使用EL来编写,则可以修改如下:
${user.name}登录成功
在EL中,可以使用EL隐含对象指定范围来取属性,EL隐含对象将在稍后介绍。
EL存取变量数据的方法很简单,例如:
${user.name},它的意思是取出某一范围中名称为user.name的变量。
若不指定属性的存在范围,则默认是以page、request、session、application的顺序来寻找EL中所指定的属性,假如全部的范围都没有找到时,就回传null。
以上例而言,就是在page范围中找到了user属性,点运算符后跟随着name,表示利用对象的getNarne()方法取得值,而后显示在网页上。
如果EL访问的对象是个数组对象,则可以使用[]运算符来指定索引以存取数组中的元素。
例如,若网页的某处在请求范围中设置了数组作为属性:
<%
String[]names={"caterpillar","momor","hamimi"};
request.setAttribute("array",names);
%>
如果现在打算取出属性,并访问数组中的每个元素,则可以如下使用EL:
名称一:
${array[O]}
名称二:
${array["1"]}
名称三:
${array['2']}
不仅数组对象可以在[]中指定索引来访问元素,如果属性是个List类型的对象,也可以使用[]运算符指定索引来进行访问元素。
点运算符(.)与[]运算符需要特别说明。
在某些情况下,可以使用点运算符(.)的场合,也可以使用[]运算符。
以下先进行归纳:
·如果使用点(.)运算符,则左边可以是JavaBean或Map对象。
·如果使用[]运算符,则左边可以是JavaBean、Map、数组或List对象。
所以不只可以使用点(.)运算符来取得JavaBean属性,也可以使用[]运算符。
例如,可以用点(.)运算符取得User的name属性:
${user.name}
也可以使用[]运算符采取得User的name属性:
${user["name"]}
如果想取得Map对象中的值,点(.)运算符或[]运算符都可以使用。
例如,网页中若有某个地方有以下代码:
<%
Mapmap=newHashMap)();
map.put("user","caterpillar");
map.put("role","admin");
request.setAttribute("login",map);
%>
则可以在网页某处使用点运算符取得Map中的值:
User:
${login.user}
User:
${login.role}
也可以在网页某处使用[]运算符取得Map中的值:
User:
${login["user"]}
User:
${login["role"]}
基本上,当左值是Map对象时,建议使用[]运算符,因为如果设置Map时的键名称有空白或点字符时,这是可以正确取得值的方式。
例如:
<%
Mapmap=newHashMap();
map.put("username","caterpillar");
map.put("local.role","admin");
request.setAttribute("login",map);
%>
...
User:
${login["username"]}
User:
${login["local.role"]}
[]运算符的右边,除了可以是JavaBean、Map外,也可以是数组或List类型的对象。
之前示范过数组的例子,以下则是一个List的例子:
<%
Listnames=newArrayList();
names.add("caterpillar");
names.add("momor");
request.setAttribute("names",names);
%>
...
User1:
${names[0]}
User2:
${names[1]}
虽然可以在指定索引时使用双引号,如${names["0"]},不过一般指定索引不会这么特别写。
事实上,当[]运算符是使用双引号(")指定时,就是作为键名或索引来使用。
如果[]运算符中不是使用双引号,则会尝试做运算,结果再给[]来使用。
例如:
<%
Listnames=newArrayList();
names.add("caterpillar");
names.add("momor");
request.setAttribute("names",names);
%>
User:
${names[param.index]}
在这个范例的EL中,使用了param.index,param是EL隐含对象,表示请求参数,这个范例会先寻找参数中index的值,让后再作为索引值给[]使用。
所以如果请求时使用了index=0,则显示"caterpillar",若index=1,则显示"momor"。
所以,[]中也可以进行嵌套。
例如:
<%
Listnames=newArrayList();
names.add("caterpillar");
names.add("momor");
request.setAttribute("names",names);
Mapdatas=newHashMap();
datas.put("caterpillar","caterpillar'sdata");
datas.put("momor","momor'sdata");
request.setAttribute("datas",datas);
%>
...
User:
${datas[names[param.index]]}
根据EL,如果请求时使用了index=0,则会取得names中索引0的值"caterpillar",然后用取得的值作为键,再从datas中取得对应的"caterpillar'sdata"。
3、EL隐含(内置)对象
在EL中提供有11个隐含对象(ImplicitObject),其中除了pageContext隐含对象对应javax.servlet.jsp.PageContext之外,其他隐含对象都是对应java.util.Map类型。
类别
对象
描述
JSP页面上下文
pageContext
引用当前JSP页面的pageContext内置对象
作用域
pageScope
获得页面作用范围中的属性值,相当于pageContext.getAttribute()
requestScope
获得请求作用范围中的属性值,相当于request.getAttribute()
sessionScope
获得会话作用范围中的属性值,相当于session.getAttribute()
applicationScope
获得应用程序作用范围中的属性值,相当于application.getAttribute()
请求参数
param
获得请求参数的单个值,相当于request.getParameter()
paramValues
获得请求参数的一组值,相当于request.getParameterValues()
HTTP请求头
header
获得HTTP请求头中的单个值,相当于request.getHeader()
headerValues
获得HTTP请求头中的一组值,相当于request.getHeadersValues()
Cookie
cookie
获得请求中的Cookie值
初始化参数
initParam
获得上下文的初始参数值
(1)、pageContext隐含对象:
对应于javax.servlet.jsp.PageContext类型,PageContext本身就是个JavaBean,只要是getXxx()方法(参考API),就可以用${pageContext.xxx}来取得。
可以使用${pageContext}来取得其他有关用户要求或页面的详细信息。
Expression
说明
${pageContext.request.queryString}
取得请求的参数字符串
${pageContext.request.requestURL}
取得请求的URL,但不包括请求之参数字符串
${pageContext.request.contextPath}
服务的webapplication的名称
${pageContext.request.method}
${pageContext.request.method}取得HTTP的方法(GET、POST)
${pageContext.request.protocol}
取得使用的协议(HTTP/1.1、HTTP/1.0)
${pageContext.request.remoteUser}
取得用户名称
${pageContext.request.remoteAddr}
取得用户的IP地址
${pageContext.session.new}
判断session是否为新的,所谓新的session,表示刚由server产生而client尚未使用
${pageContext.session.id}
取得session的ID
${pageContext.servletContext.serverInfo}
取得主机端的服务信息
${pageContext.exception.message}
取得页面异常信息
(2)、属性范围相关隐含对象:
与属性范围相关的EL隐含对象有pageScope、requestscope、sessionScope与applicationScope,分别可以取得使用JSP隐含对象pageContext、request、session与application的setAttribute()方法所设置的属性对象。
如果不使用EL隐含对象指定作用范围,则默认从pageScope的属性开始寻找。
${sessionScope.username}相当于Stringusername=(String)session.getAttribute("username");
注意:
EL隐含对象pageScope、requestScope、sessionScope与applicationScope不等同于JSP隐含对象pageContext、request、session与application。
EL隐含对象pageScope、requestScope、sessionScope与applicationScope仅仅代表作用范围。
(3)、请求参数相关隐含对象:
与请求参数相关的EL隐含对象有param与paramValues。
举例来说,${pararm.user}其作用相当于<%=request.getParameter("user")%>。
paramValues则相当于request.getParameterValues(),可以取得窗体复选项的值,由于返回的是多个值,可以使用[]运算符来指定取得哪个元素,例如${paramValues.favorites[0]}就相当于<%=request.getParameterValues("favorites")[0]%>。
(4)、报头(Header)相关隐含对象:
如果要取得用户请求的报头数据,则可以使用header或headerValues隐含对象。
例如,${header["User-Agent"]}相当于<%=request.getHeader("User-Agent")%>,headerValues则相当于request.getHeaders()方法。
(5)、cookie隐含对象:
cookie隐含对象可用来取得用户的Cookie对象。
${cookie.key}取的是cookie对象,如访问cookie的名称和值,须${cookie.key.name}或${cookie.key.value}。
如在Cookie中设置了username属性,则可使用${cookie.username.value}取得Cookie值。
(6)、初始参数隐含对象:
initParam可以用来取得web.xml中设置的ServletContent初始参数,也就是在中设置的初始参数。
例如,${initParam.initCount}的作用相当于<%=servletContext.getInitParamer("initCount")%>。
4、EL运算符
使用EL可以直接进行一些算术运算、逻辑运算与关系运算,就如同在一般常见的程序语言中的运算。
①empty运算符:
${emptyexpression},判断expression的值是否是null、空字符串、空数组、空Map或空集合(作用于一个集合,若该集合不存在或集合中没有元素,其结果都为true)。
②?
:
是个三元运算符:
?
前为true就返回:
前的值,若为false就返回:
后的值。
例如:
${user!
=null?
user.name:
“”}
③算术运算符:
有加法(+)、减法(-)、乘法(*)、除法(/或div)与求模(%或mod)。
④逻辑运算符:
有and、or、not。
⑤关系运算符:
有表示“小于”的<及lt(Less-than),表示“大于”的>及gt(Greater-than),表示“小于或等于”的<=及le(Less-than-or-equal),表示“大于或等于”的>=及ge(Greater-than-or-equal),表示“等于”的==及eq(Equal),表示“不等于”的!
=及ne(Not-equal)。
关系运算符也可以用来比较字符或字符串,而==、eq与!
=、ne也可以用来判断取得的值是否为null。
例子:
表达式
结果
表达式
结果
${1}
1
${1<2}或${1lt2}
true
${1+2}
3
${1>(4/2)}或${1gt(4/2)}
false
${1.2