EL和JSTL的作用:使用开发视图层更容易,JSP页面中不出现Java代码。
JSP标准动作的局限性:
只能操作JavaBean属性
不能自动类型转换
不能进行逻辑判断
而使用EL+JSTL可以弥补这点。
一、EL表达式
EL:Expression Language,表达式语言
1、语法
1)、以“${”开始,以“}”结束
${sessionScope.user.name}
2)、使用“.”和“[ ]”来取数据
${sessionScope.user.name}与${sessionScope.user[name]}功能相同
.和[]在大多数情况下功能相同,但有两点不同之处:
(1)、当要取的的属性中包含特殊字符时,不能使用“.”,而应该使用“[]”:
如:头对象header中的User-Agent属性,只能使用${header[user-Agent]}
(2)、[]中的内容可以是一个变量,变量中存放要取属性的名字,实现动态存取,但“.”不能实现动态存取:
data的值是“name”时,${sessionScope.user[data]}与${sessionScope.user.name}功能相同,当data的值是“sex”时,${sessionScope.user[data]}与${sessionScope.user.sex}功能相同。
2、EL变量
${user}表示在某一范围中找出名为user的变量,
查找范围为:page,request,sesion,application,从小到大依次查找,直到找到为止,找不到则返回null。
也可指定在某一范围内查找:${sessionScope.user}
范围名称: 四个对象都是EL的隐含对象。
范围 | EL中的名称 |
page | pageScope |
request | requestScope |
session | sessionScope |
application | applicationScope |
3、自动转换类型
EL表达式可实现数据类型的自动转换,只要是可相互转换的类型,如:数值型转换为字符串,字符串转换为数值型,如果结果为null,则什么都不显示,如果转换出错,则报错。
4、EL隐含对象
EL共有11个隐含对象(Implicit Object):
隐含对象 | 类型 | 说明 |
pageContext | javax.servlet.ServletContext | 表示此JSP的PageContext |
pageScope | java.util.Map | page范围 |
requestScope | java.util.Map | request范围 |
sessionScope | java.util.Map | session范围 |
applicationScope | java.util.Map | application范围 |
param | java.util.Map | 同request.getParameter(),返回String |
paramValues | java.util.Map | 同request.getParameterValues(),返回String[] |
header | java.util.Map | 同request.getHeader(),返回String |
headerValues | java.util.Map | 同request.getHeaders(),返回String[] |
cookie | java.util.Map | 同request.getCookies() |
initParam | java.util.Map | 同ServletContext.getInitParameter(),返回String |
范围隐含对象:pageScope,requestScope,sessionScope,applicationScope,在这四个范围隐含对象中,只能取出属性值(Attribute),即:.getAttribute()方法的功能,不能取得其他信息。
如:从sessionScope中取出loginUser的用户名:
${sessionScope.loginUser.username}
如果session中未找到loginUser,则什么都不显示。
如果session中包含loginUser,并且有getUsername()方法,则返回username, username为空,则什么都不显示。
如果loginUser没有getUsername()方法,则发生找不到属性的异常:
javax.el.PropertyNotFoundException: Property 'xx' not found on type org.wyq.entity.User
输入隐含对象:param和paramValues
用于获取URL中的参数和<form>表单提交的参数,即:request.getParameter()方法和request.getParameterValues()
如果使用paramValues获取一组参数值,如一组相同名字的复选框的值,返回一个数组,使用[]取得其中的值:
如:
<form action="">
<input type="checkbox" name="hibit" value="Reading"/>看书<br />
<input type="checkbox" name="hibit" value="Game"/>游戏<br />
<input type="checkbox" name="hibit" value="Travel"/>旅游<br />
<input type="submit" value="提交"/>
</form>
爱好:${paramValues.hibit[0] },${paramValues.hibit[1] }
注意:如果下标越界,则什么都不输出。如果数据中包含中文,需要设置编码格式才能正确取出数据。
initParam:获取web.xml文件中配置的参数。即:application.getInitParameter()如:
<context-param>
<param-name>password</param-name>
<param-value>wyq</param-value>
</context-param>
可使用${initParam.password }获取。
如果想要在页面中输出${initParam.password },只需要在前边加一个“\”,\${initParam.password }
5、EL运算符
算术运算符:+,-,*,/(div),%(mod)
关系运算符:==(eq),!=(ne),>(gt),<(lt),>=(ge),<=(le)
逻辑运算符:&&(and),||(or),!(not)
empty运算符:${empty param.name},如果param.name为空,返回true,否则返回false。
条件运算符:?:,三元运算符。
例:
<c:if test="${empty sessionScope.loginUser}">
请登录
</c:if>
<c:if test="${!(empty sessionScope.loginUser)}">
您好:${sessionScope.loginUser.username}
</c:if>