EL的作用
JSP2.0要把html和css分离、把html和javascript分离、要把Java脚本替换成标签。标签的好处是非Java人员都可以使用。
JSP2.0 – 纯标签页面,即:不包含<% … %>、<%! … %>,以及<%= … %>
EL(Expression Language)是一门表达式语言,它对应<%=…%>。我们知道在JSP中,表达式会被输出,所以EL表达式也会被输出。
EL的格式
格式:${…}
例如:${1 + 2}
关闭EL
如果希望整个JSP忽略EL表达式,需要在page指令中指定isELIgnored=”true”。
如果希望忽略某个EL表达式,可以在EL表达式之前添加“\”,例如:\${1 + 2}。
EL运算符
运算符 |
说明 |
范例 |
结果 |
+ |
加 |
${17+5} |
22 |
- |
减 |
${17-5} |
12 |
* |
乘 |
${17*5} |
85 |
/或div |
除 |
${17/5}或${17 div 5} |
3 |
%或mod |
取余 |
${17%5}或${17 mod 5} |
2 |
==或eq |
等于 |
${5==5}或${5 eq 5} |
True |
!=或ne |
不等于 |
${5!=5}或${5 ne 5} |
False |
<或lt |
小于 |
${3<5}或${3 lt 5} |
True |
>或gt |
大于 |
${3>5}或${3 gt 5} |
false |
<=或le |
小于等于 |
${3<=5}或${3 le 5} |
true |
>=或ge |
大于等于 |
${3>=5}或${3 ge 5} |
false |
&&或and |
并且 |
${true&&false}或${true and false} |
false |
!或not |
非 |
${!true}或${not true} |
False |
||或or |
或者 |
${true||false}或${true or false} |
True |
empty |
是否为空 |
${empty “”},可以判断字符串、数据、集合的长度是否为0,为0返回true。empty还可以与not或!一起使用。${not empty “”} |
True |
EL不显示null
当EL表达式的值为null时,会在页面上显示空白,即什么都不显示。
EL内置对象
EL可以输出的东西都在11个内置对象中!11个内置对象,其中10个是Map!pageContext不是map,它就是PageContext类型,1个顶9个。
- pageScope
- requestScope
- sessionScope
- applicationScope
上面四个域对象,${xxx}为全域查找,${域名.xxx}:在指定域内查找
- pageScope:${pageScope.name}等同与pageContext.getAttribute(“name”);
- requestScope:${requestScope.name}等同与request.getAttribute(“name”);
- sessionScoep: ${sessionScope.name}等同与session.getAttribute(“name”);
- applicationScope:${applicationScope.name}等同与application.getAttribute(“name”);
- param:对应参数,它是一个Map,其中key参数名,value是参数值,适用于单值的参数。
- paramValues:对应参数,它是一个Map,其中key参数名,value是多个参数值,适用于多值的参数。
<body>
${param.xxx }<br/>
${paramValues.yyy[0] }<br/>
${paramValues.yyy[1] }<br/>
</body>
- header:对应请求头,它是一个Map,其中key表示头名称,value是单个头值,适用于单值请求头
- headerValues:对应请求头,它是一个Map,其中key表示头名称,value是多个头值,适用于多值请求头
header: Map<String,String>类型,用来获取请求头。
<body>
${header.Host }
</body>
headerValues:headerValues是Map<String,String[]>类型。当一个请求头名称,对应多个值时,使用该对象,这里就不在赘述。
- initParam:获取<context-param>内的参数!
在WEB-INF目录下的web.xml中
<context-param>
<param-name>xxx</param-name>
<param-value>XXX</param-value>
</context-param>
<context-param>
<param-name>yyy</param-name>
<param-value>YYY</param-value>
</context-param>
在initParam.jsp文件
<body>
${initParam.xxx }<br/>
${initParam.yyy }<br/>
</body>
- cookie:Map<String,Cookie>类型,其中key是cookie的name,value是cookie对象。
<body>
<%
response.addCookie(new Cookie("xxx","XXX"));
%>
${cookie.xxx.name}<br/>
${cookie.xxx.value}<br/>
${cookie.JSESSIONID.name }<br/>
${cookie.JSESSIONID.value }<br/>
</body>
<body>
${pageContext.request.contextPath }<br/>
</body>
显示项目路径
- pageContext:它是PageContext类型!${pageContext.request.contextPath}
JavaBean 导航
对于javaBean对象,可以对getxxx(),直接通过.xxx来调用
<%
Address address = new Address();
address.setCity("北京");
address.setStreet("西三旗");
Employee emp = new Employee();
emp.setName("李小四");
emp.setSalary(123456);
emp.setAddress(address);
request.setAttribute("emp", emp);
%>
<h3>使用el获取request域的emp</h3>
${requestScope.emp.address.street }<!-- request.getAttribute("emp").getAddress().getStreet() --><br/>
EL函数库
导入标签库:<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
- String toUpperCase(String input):把参数转换成大写
- String toLowerCase(String input):把参数转换成小写
- int indexOf(String input, String substring):从大串,输出小串的位置!
- boolean contains(String input, String substring):查看大串中是否包含小串
- boolean containsIgnoreCase(String input, String substring):忽略大小写的,是否包含
- boolean startsWith(String input, String substring):是否以小串为前缀
- boolean endsWith(String input, String substring):是否以小串为后缀
- String substring(String input, int beginIndex, int endIndex):截取子串
- String substringAfter(String input, String substring):获取大串中,小串所在位置后面的字符串
- substringBefore(String input, String substring):获取大串中,小串所在位置前面的字符串
- String escapeXml(String input):把input中“<”、">"、"&"、"'"、""",进行转义
- String trim(String input):去除前后空格
- String replace(String input, String substringBefore, String substringAfter):替换
- String[] split(String input, String delimiters):分割字符串,得到字符串数组
- int length(Object obj):可以获取字符串、数组、各种集合的长度!
- String join(String array[], String separator):联合字符串数组!
<body>
<% String[] strs = {"a", "b","c"};
List list = new ArrayList();
list.add("a");
pageContext.setAttribute("arr", strs);
pageContext.setAttribute("list", list);
%>
${fn:length(arr) }<br/><!--3-->
${fn:length(list) }<br/><!--1-->
${fn:toLowerCase("Hello") }<br/> <!-- hello -->
${fn:toUpperCase("Hello") }<br/> <!-- HELLO -->
${fn:contains("abc", "a")}<br/><!-- true -->
${fn:containsIgnoreCase("abc", "Ab")}<br/><!-- true -->
${fn:contains(arr, "a")}<br/><!-- true -->
${fn:containsIgnoreCase(list, "A")}<br/><!-- true -->
${fn:endsWith("Hello.java", ".java")}<br/><!-- true -->
${fn:startsWith("Hello.java", "Hell")}<br/><!-- true -->
${fn:indexOf("Hello-World", "-")}<br/><!-- 5 -->
${fn:join(arr, ";")}<br/><!-- a;b;c -->
${fn:replace("Hello-World", "-", "+")}<br/><!-- Hello+World -->
${fn:join(fn:split("a;b;c;", ";"), "-")}<br/><!-- a-b-c -->
</body>
自定义EL函数库
写一个java类,类中可以定义0~N个方法,但必须是static,而且有返回值的!
public class ElFunctions {
public static String eltld(){
return "自定义EL库函数";
}
}
在WEB-INF目录下创建一个tld文件(放在WEB-INF中可以防止项目发布时,用户访问)
el-tld.tld
<?xml version="1.0" encoding="UTF-8" ?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
version="2.0">
<tlib-version>1.0</tlib-version>
<short-name>el</short-name>
<uri>http://www.siacu.edu.cn</uri>
<function>
<name>eltld</name>
<function-class>cn.edu.sicau.www.ElFunctions</function-class>
<function-signature>String eltld()</function-signature>
</function>
</taglib>
在jsp页面中导入标签库
<%@ taglib prefix="el" uri="WEB-INF/el-tld.tld" %>