- lEL 全名为Expression Language。EL主要作用:
l获取数据:
•EL表达式主要用于替换JSP页面中的脚本表达式,以从各种类型的web域
中检索java对象、获取数据。(某个web域 中的对象,访问javabean的属性、访问list集合、访问map集合、访问数组)
l执行运算:
•利用EL表达式可以在JSP页面中执行一些基本的关系运算、逻辑运算和算术运算,以在JSP页面中完成一些简单的逻辑运算。${user==null}
l获取web开发常用对象
•EL 表达式定义了一些隐式对象,利用这些隐式对象,web开发人员可以很轻松获得对web常用对象的引用,从而获得这些对象中的数据。
l调用Java方法
•EL表达式允许用户开发自定义EL函数,以在JSP页面中通过EL表达式调用Java类的方法。
1.获取数据
EL表达式用于获取数据,在JSP页面中可使用${标识符}的形式,通知JSP引擎调用pageContext.findAttribute()方法,以标识符为关键字从各个域对象中获取对象。如果域对象中不存在标识符所对应的对象,则返回结果为””(注意,不是null)。
•示例:使用EL表达式获取request、session、applection域中的数据。
EL表达式中也可以使用${customerBean.address}的形式来访问JavaBean对象的属性。
•示例:使用EL表达式获取Bean属性。
结合JSTL标签,EL表达式也可轻松获取各种集合中的元素。
•示例:使用EL表达式获取List、Map集合中的元素。
EL表达式也可使用类如${1==1}的形式进行简单的逻辑判断。
JSTL标签库
•JSTL是sun公司开发的一套标签库,使用JSTL可以在页面中实现一些简单的逻辑,从而替换页面中的脚本代码。
•在页面中使用JSTL标签需完成以下2个步骤:
1、导入jstl.jar和standerd.jar这两个JSTL的jar文件。
2、在JSP页面中使用<%@ tablib url=“” prifix=“” %>元素导入标签库。
•JSTL标签库中常用标签:
<c:foreach var=“” items=“”>
<c:if test=“”>
<%@page import="javax.swing.plaf.basic.BasicScrollPaneUI.HSBChangeListener"%> <%@page language="java" import="java.util.*,com.kevin.*" pageEncoding="UTF-8" errorPage="/errors/error.jsp"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Insert title here</title> </head> <body> <font color="red"> <br />---------------------------------------------------<br /> <% Person person = new Person("xiang"); request.setAttribute("person", person); %> ${person.name } <br/> <br />---------------------------------------------------<br /> <% List list = new ArrayList(); list.add(new Person("kevin")); list.add(new Person("xiang")); request.setAttribute("list", list); %> ${list[0].name} <br/> <c:forEach var="pList" items="${list}"> ${pList.name} <br/> </c:forEach> <br />---------------------------------------------------<br /> <% Map map = new HashMap(); map.put("aaaa", new Person("aaaa___")); map.put("1111", new Person("1111____")); request.setAttribute("map", map); %> ${map.aaaa.name} <br/> ${map['1111'].name} <br/> <c:forEach var="entry" items="${map}"> ${entry.key} : ${entry.value.name} <br /> </c:forEach> <br />---------------------------------------------------<br /> ${pageContext.request.contextPath} <!-- 动态获取Web应用的路径 /WebTest4 --> <br />---------------------------------------------------<br /> <c:if test="${person==null}"> 请登录!!! </c:if> <c:if test="${person!=null}"> 欢迎:${person.name} </c:if> </font> </body> </html>
2. 执行运算
3. 获得web开发常用对象
4. 使用EL调用Java方法 (EL函数)
lEL表达式语法允许开发人员开发自定义函数,以调用Java类的方法。
•示例:${prefix:method(params)}
•在EL表达式中调用的只能是Java类的静态方法。
•这个Java类的静态方法需要在TLD文件中描述,才可以被EL表达式调用。
•EL自定义函数用于扩展EL表达式的功能,可以让EL表达式完成普通Java程序代码所能完成的功能。
EL函数 与 自定义标签的区别:
虽然两者都可以移除JSP中的Java代码, 但是EL函数不能传入pageContext对象,所以只能移除与Web对象无关的Java代码。
EL Function开发步骤
编写Java类静态方法
public class HtmlFilter { public static String filter(String message) { if (message == null) return (null); char content[] = new char[message.length()]; message.getChars(0, message.length(), content, 0); StringBuilder result = new StringBuilder(content.length + 50); for (int i = 0; i < content.length; i++) { switch (content[i]) { case '<': result.append("<"); break; case '>': result.append(">"); break; case '&': result.append("&"); break; case '"': result.append("""); break; default: result.append(content[i]); } } return (result.toString()); } }
编写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"> <description>A tag library exercising SimpleTag handlers.</description> <tlib-version>1.0</tlib-version> <short-name>kevin</short-name> <uri>http://www.kevin.com</uri> <function> <name>filter</name> <function-class>com.kevin.web.tag.HtmlFilter</function-class> <function-signature>java.lang.String filter( java.lang.String )</function-signature> </function> </taglib>
JSP使用
<%@ page language="java" contentType="text/html; charset=UTF-8" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="http://www.kevin.com" prefix="fn" %> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> <title>Insert title here</title> </head> <body> <a href=''>点点</a> ${fn:filter("<a href=''>点点</a>")} </body> </html>
如果函数不只有一个参数 ,filter(String message, List list), 在Jsp中调用时不能在$中再 嵌套$,直接取域中的list即可,${fn:filter("<a href=''>点点</a>", list)}
5.EL函数库
5.EL函数库
数据回显示例:
<body> <% User user = new User(); String[] licks = {"sing", "dance", "football"}; user.setLicks(licks); request.setAttribute("user", user); %> <input type="checkbox" name="lick" value="sing" ${fn:contains(fn:join(user.licks, ","),"sing")?'checked':''} />唱歌 <br /> <input type="checkbox" name="lick" value="dance" ${fn:contains(fn:join(user.licks, ","),"dance")?'checked':''} />跳舞 <br /> <input type="checkbox" name="lick" value="football" ${fn:contains(fn:join(user.licks, ","),"football")?'checked':''} />足球 <br /> <input type="checkbox" name="lick" value="basketball" ${fn:contains(fn:join(user.licks, ","),"basketball")?'checked':''} />篮球 <br /> </body> </html>
contains | boolean contains(java.lang.String, java.lang.String) | ${fn:contains(name, searchString)} |
containsIgnoreCase | boolean containsIgnoreCase(java.lang.String, java.lang.String) | ${fn:containsIgnoreCase(name, searchString)} |
endsWith | boolean endsWith(java.lang.String, java.lang.String) | ${fn:endsWith(filename, ".txt")} |
escapeXml | java.lang.String escapeXml(java.lang.String) | ${fn:escapeXml(param:info)} |
indexOf | int indexOf(java.lang.String, java.lang.String) | ${fn:indexOf(name, "-")} |
join | java.lang.String join(java.lang.String[], java.lang.String) | ${fn:join(array, ";")} |
length | int length(java.lang.Object) | ${fn:length(shoppingCart.products)} |
replace | java.lang.String replace(java.lang.String, java.lang.String, java.lang.String) | ${fn:replace(text, "-", "•")} |
split | java.lang.String[] split(java.lang.String, java.lang.String) | ${fn:split(customerNames, ";")} |
startsWith | boolean startsWith(java.lang.String, java.lang.String) | ${fn:startsWith(product.id, "100-")} |
substring | java.lang.String substring(java.lang.String, int, int) | ${fn:substring(zip, 6, -1)} |
substringAfter | java.lang.String substringAfter(java.lang.String, java.lang.String) | ${fn:substringAfter(zip, "-")} |
substringBefore | java.lang.String substringBefore(java.lang.String, java.lang.String) | ${fn:substringBefore(zip, "-")} |
toLowerCase | java.lang.String toLowerCase(java.lang.String) | ${fn.toLowerCase(product.name)} |
toUpperCase | java.lang.String toUpperCase(java.lang.String) | ${fn.UpperCase(product.name)} |
trim | java.lang.String trim(java.lang.String) | ${fn.trim(name)} |