传智播客day13-EL表达式
更新日期:
EL表达式
- 作用, 向界面输出内容, 只适合显示数据
- 基本语法形式: ${EL表达式}
- 不支持字符串连接操作
- 永远没有空指针
1 2 3 | <jsp:JavaBean id="p" class="cn.itcast.Person"></jsp:JavaBean> <%=p.getName()%> <!--Java表达式, 官方不建议使用--> ${p.name} <!--EL表达式, 官方推荐--> |
作用分解
- 获取数据, 替换JSP中的
<%= %>
- 执行简单的数学或逻辑运输
- EL隐式对象(难点, 容易和JSP的隐式对象混淆)
- 调用Java中的静态方法
- 获取数据, 替换JSP中的
获取数据
只能获取四大域对象中的数据
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <% pageContext.setAttribute("p", p, page|request|session|application); %> ${p} <!--依次查找名字为p的对象, 没有找到页面什么都不显示你--> ${p.name} <!-- 获取对象属性的值,显示到页面上 --> ${p.addreess.province} <!-- 使用`[]`运算符, 获取 List 和 Map 中的数据 但是无法获取 Set 中的数据 --> <% List<Person> ps = new ArrayList<Person> ps.add(new Person("a")); ps.add(new Person("b")); ps.add(new Person("c")); ps.add(new Person("d")); pageContent.setAttribute("ps", ps); Map<String, Person> m = new HashMap<String, Person>; m.put("aa", new Person("a")); %> ${ps[2].name} <!-- output: d --> ${ps[2]['name']} ${m.aa.name} <!-- output: a --> ${m['a'].name} <!-- output: a --> |
执行数据
- empty 运算符: 判断一个对象是不是null, 还能判断一个集合中是否有元素, 是否为空字符串
- 三元判断符:
${empty user? "true":"false"}
1 2 3 4 5 6 7 | ${1+1} 2 ${1==2} false ${empty p} p="" => true; p=null => true; p=List() => true; p=List("dfjk") => false ${empty user?"您还没有登陆":"欢迎您"} ${"a" + "b"} <!--报错!!!!!!!!!!!!不能字符串相加---> |
EL中的11个隐式对象
内置对象 | 表示类型 | 备注 | 对应的JSP内置对象 |
---|---|---|---|
pageContext | javax.servlet.jsp.PageContext | 和jsp的内置对象完全一样 | pageContext |
requestScope | java.util.Map | 代表servletRequest中的那个Map | 没有 |
pageScope | java.util.Map | 代表pageContext中的那个Map | 没有 |
sessionScope | java.util.Map | 代表session中的那个Map | 没有 |
applicationScope | java.util.Map | 代表application中的那个Map | 没有 |
param | Map |
获取单一请求参数 | 没有 |
paramValues | Map |
获取重名请求参数 | 没有 |
header | Map |
单一请求消息头 | 没有 |
headerValues | Map |
重名请求消息头 | 没有 |
initParam | Map |
代表web.xml中的全局变量 | 没有 |
cookie | Map |
获取Cookie对象 | 没有 |
1 2 3 4 5 6 7 8 9 10 11 12 13 | <!-- pageContent --> <%= request.getContextPath() %> ${pageContext.request.contextPath} <!-- request.contextPath 非法 --> ${param.name} <!-- 获取单一请求参数的值 --> ${paramValues.password[0]} <!-- 获取多个请求参数的值 --> ${header['Accept-Language']} <!-- 请求消息头 --> ${headerValues['Accept-Language'][0]} <!-- 重名的请求消息头 --> ${cookie.JSESSIONID} <!-- cookie对象 --> ${cookie.JSESSIONID.value} <!-- cookie对象的value --> ${cookie.JSESSIONID.name} <!-- cookie对象的name --> |
调用Java中的静态方法
产生原因: EL表达式不支持字符串的相关功能
EL 能调用普通Java类的静态方法, 但是不能调用实例的方法
开发步骤:
- 定义一个静态类, 提供静态方法
- 在WEB-INF目录下建立一个扩展名为tld的xml文件
- 在jsp中使用
1 2 | <%@ taglib uri="http://www.itcast.cn/jsp/myfunction" prefix="myfn" %> ${myfn:toUppercase(s)} |
WEB-INF/myfn.tld
1 2 3 4 5 6 7 8 9 10 11 12 | <taglib> <tlib-version>1.0 </tlib-version> <short-name>myfn </short-name> <!-- 定位符 --> <uri>http://www.itcast.cn/jsp/myfunction </uri> <function> <description>toUppercase the string</description> <name>toUppercase </name> <function-class>cn.itcast.MyFunctions </function-class> <function-signature>java.lang.String toUppercase(java.lang.String)</function-signature> </function> </taglib> |
JSTL
sun提供了标准的EL函数
JSTL标签库
- core: 核心
- fmt: 国际化
- sql: 数据库
- xml: 操作xml
- functions: EL函数
由 Apache 实现, 需要导入 jstl.jar, standard.jar
所有的java开发规范由JCP.org发布的, 代号 JSR-XXX JCP组织由: Oracle\Apache\Jboss 等知名开源组织构成
- 使用JSTL中的EL函数
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
<% taglib uri="http://java.sun.com/jsp/jstl/functions" prefix=fn %> <!--导入--> ${fn:toLowerCase(s1)} ${fn:toUpperCase(s1)} ${fn:trim(s1)} ${fn:length(s1)} ${fn:escapeXml(s1)} <!-- <hr/> 转义成 <hr/> --> ${fn:split(s1, "-")[0]} ${fn:join(s1, "-")[0]} <!-- 联接 --> ${fn:indexOf(s1, "f")} <!--打印字符索引--> ${fn:contains(s1, "a")} <!--是否包含字母--> ${fn:subString(s1, 0, 2)} <!-- abcdefg => abc --> ${fn:subString(s1, 5, 1000)} <!-- abcdefg => fg, 数组不会越界, 只能是三个参数--> <!-- startWith --> <!-- endsWith --> <!-- replace --> <!-- subStringAfter --> <!-- subStringBefore -->