EL表达式
EL表达式基本语法
${expression}
expression:用于指定要输出的内容,可以是字符串也可以是由EL运算符组成的表达式。
EL表达式以{开头,所以网页中要显示{的时候需要转义,在前面加上”\”
EL表达式输出字符串 ′数数1234′或 {“数数1234”}
EL表达式的特点
- EL表达式可以与JSTL结合使用,也可以与JavaScript语句结合使用。
- EL表达式会自动进行类型转换,如果想通过EL输入两个字符串型数值(如number1和number2)的和,可以直接通过+号进行连接(如${number1+number2})
- EL不仅可以访问一般变量,还可以访问javabean中的属性以及嵌套属性和集合对象。
- 在EL表达式中可以执行算数运算,逻辑运算,关系运算和逻辑运算等操作。
- 在EL中可以获得命名空间(PageContext对象,它是页面中所有其他内置对象的最大范围的集成对象,通过他可以访问其他对象)
- 在使用EL进行除法运算的时,如果0作为除数,则返回无穷大Infinity,而不返回错误。
- 在EL中可以访问JSP的作用域(request、session、application以及page)
- 扩展函数可以与Java类的静态方法映射。
与低版本的环境兼容-禁用EL
如果使用的Servlet 2.4/Jsp 2.0,就可以在页面中使用EL表达式,在Jsp2.0之前没有EL。为了与之前的兼容,JSP可以使用3种方法禁用EL
1.使用”\”符号 \${expression}
但该方法只是禁用页面一个或几个EL表达式的情况。
2.使用page指令<%@ page isELIgnored="布尔值">
如果布尔值为true则禁用页面的EL表达式,该方法使用禁用一个页面的EL表达式。
3.在web.xml文件中配置元素
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<el-ignored>true</el-ignored>
</jsp-property-group>
</jsp-config>
该方法适合禁用整个web应用的EL
EL保留的关键字
and eq gt instanceof div or le false empty not lt ge
EL的运算符和优先级
通过EL访问数据
通过EL提供的[]和.运算符访问数据,通常情况下,[]和.是等价的
//访问Javabean对象userInfo的id属性
${userInfo.id}
${userInfo[id]}
如果对象的属性名包括特殊的符号时,应当用[]如${userInfo[user-name]}
另外[]还可以用来访问数组或者List集合中的数据
${arrBook[0]}
通过EL表达式输出数组元素
<body>
<%
String[] arr={"Javaweb","C#","Python"};
request.setAttribute("language", arr);
String[] arr1=(String [])request.getAttribute("language");
for(int i=0;i<arr.length;i++){
request.setAttribute("i1", i);
%>
${i1}: ${language[i1]}
<!--注意EL表达式的前面的必须要在request范围内-->
<%
}
%>
</body>
在上面的代码中,必须要将循环变量i保存到request的范围内的变量中,否则将不能正确的访问数组,这里不能直接使用Java代码片段中定义的变量i,也不能使用<%=i%>输出i。
在运行时,系统会先获取request变量的值,然后将输出数组内容的表达式转换为${language[索引]}
EL表达式获取List集合中的指定元素
<body>
<%
List<String> list=new ArrayList<String>();
list.add("C");
list.add("Java");
list.add("Python");
request.setAttribute("langList", list);
for(int i=0;i<list.size();i++){
request.setAttribute("i1", i);
%>
${i1}: ${langList[i1]}
<%
}
%>
</body>
EL表达式进行算术运算
EL表达式提供了加+、减-、乘*、除/或div、求余%或mod、
EL表示出0返回Infinity,与0求余将抛出异常java.lang.ArithmeticException:/by zero
EL中的+运算符与Java中的+不同,它不能实现两个字符串之间的连接,如果使用该运算符连接两个不可转换为数值型的字符串,将抛出异常;如果使用该+号连接两个可以转换为数值类型的字符串,EL将自动将这两个字符串转换为数值类型,再进行加法运算。
在EL中判断对象是否为空
在EL中判断对象是否为空,可以使用empty运算符来实现,该运算符是一个前缀运算符,即位于操作数前方,用来判断一个对象是否null或空。格式为${empty expression}
<body>
<%
request.setAttribute("user", "");
request.setAttribute("user01", null);
%>
${empty user} //true
${empty user01} //true
</body>
一个变量或一个对象为null或为空代表的意义不同。null表示这个变量没有指定任何对象,而空表示这个变量所属的对象其内容为空,如空字符串,空数组,空List容器
与not连用表示非空${not empty user}
EL中的逻辑关系运算
关系运算符
==(eq) !=(ne) <(lt) >(gt) <=(le) >=(ge)
逻辑运算符
&&(and) ||(or) !(not)
EL表达式也遵循短路原则
EL中的条件运算
${条件表达式?表达式1:表达式2}
EL的隐含对象
为了获得web应用程序中的相关数据,EL提供了11个隐含对象,这些对象类似于JSP的内置对象,也是直接通过对象名操作。
在EL的隐含对象中,除了PageContext是JavaBean对象,对应于javax.servlet.jsp.PageContext类型外,其他隐含对象都位于java.util.Map类型,这些可以分为页面上下文对象,访问作用域对象,和访问环境信息的隐含对象。
页面上下文对象
页面上下文对象为pageContext,用于访问JSP内置对象(request、response、out、session、exception、page)但不能获取(application、config、pageContext)
${pageContext.request} ……
访问作用域范围的隐含对象
提供了4个pageScope、requestScope、sessionScope、applicationScope、
pageScope
用于返回包含page(页面)范围内的属性值的集合
,返回值为java.util.Map对象
requestScope
用于返回包含request(请求)范围内的属性值的集合
<%
request.setAttribute("userName","aa");
%>
${requestScope.userName}
sessionScope
用户返回包含session(会话)范围内的属性值的集合
<%
session.setAttribute("userName","aa");
%>
${sessionScope.userName}
applicationScope
用于返回包含application(应用)范围内的属性值的集合
<%
application.setAttribute("userName","aa");
%>
${applicationScope.userName}
访问环境信息的隐含对象
param
用于获取请求参数的值,应用在参数值只有一个的情况下,应用param将返回一个字符串。
<input name="username" type="text">
${param.username}
如果是包含中文的话,在之前要用request设置编码
paramValues
如果一个请求包含参数名为多个值的时候(复选框),
<input type="checkbox" name="affect" value="C">
<input type="checkbox" name="affect" value="Java">
<input type="checkbox" name="affect" value="Python">
<input type="checkbox" name="affect" value="C++">
$(paramValues.affect[0])$(paramValues.affect[1])
在应用param和paramValues对象时,如果指定的参数不存在,则返回空字符串,而不是返回null
header和headerValues
用于获取HTTP请求的一个具体的header值${header["user-agent"]}
initParam
用于返回web.xml中的初始化参数
<param-name>name</init-param>
……
${initParam.name}
cookie
EL没有提供想cookie中保存值的方法,只提供了访问cookie的方法
<%
Cookie cookie=new Cookie("user","shushu");
response.addCookie(cookie);
%>
${cookie.user.value}