1. EL 表达式简介
- EL 是 JSP 内置的表达式语言!!!表达式末尾没有";", 语句末尾需要";"
- jsp 2.0 开始, 不让再使用 java 脚本,而是使用 EL 表达式和动态标签来替代 java 脚本;
- EL 表达式只能做输出, 替代的是
<%=....%>
2. EL 表达式来读取四大域
${xxx}
表示全域查找名为 xxx 的属性, 如果不存在, 输出空字符串,而不是 null;- 获取指定域的属性:
${pageScope.xxx}, ${requestScope.xxx}
${sessionScope.xxx} ${applicationScope.xxx}
3. JavaBean 导航
// it.cast.domain 包下
public class Employee{
private String name;
private double salary;
private Address address;
public String getName(){
return name;
}
public void setName(String name){
this.name = name;
}
public double getSalary(){
return salary;
}
public void setSalary(double salary){
this.salary = salary;
}
public Address getAddress(){
return address;
}
public void setAddress(Address address){
this.address=address;
}
public String toString(){
return "Employee [name="+name+",salary="+salary+", address="+address+"]";
}
}
// Address 类
public class Address{
private String city;
private String street;
public String getCity(){
return city;
}
public void setCity(String city){
this.city = city;
}
public String getStreet(){
return street;
}
public void setStreet(String street){
this.street = street;
}
public String toString(){
return "Address [city="+city+",street="+street+"]";
}
}
// 在 a.jsp 中获取地址中的 street
// 导包
<%@page import="cn.itcast.domain.*" %>
<body>
<%
Address addr = new Address();
addr.setCity("北京");
addr.setStreet("西三旗");
Employee emp = new Employee();
emp.setName("张三");
emp.setSalary(1234);
emp.setAddress(addr);
request.setAttribute("emp",emp);
%>
// 使用 el 表达式获取 street
// 相当于: <% ((Employee)request.getAttribute("emp")).getAddress().getStreet() %>
${requestScope.emp.address.street}
</body>
4. EL 表达式的11个内置对象
- 无需创建即可使用, 这 11 个内置对象中有 10 个是 Map 类型的;
- pageContext 不是 Map 类型, 而是 pageContext 类型;
- 11 个内置对象
- pageScope
- requestScope
- sessionScope
- applicationScope
- param : 获取请求参数, 它是一个 Map, 其中 key 是参数名, value 是参数值, 适用于单值的参数;
- paramValues: 适用于多值的参数; value 对应的是数组;
- header: 获取请求头, 适用于单值请求头;
${header.Host}
- headerValues: 适用于多值请求头;
${header['User-Agent']}
- initParam: 获取 web.xml 中的
<context-param>
内的参数; - cookie: Map<String, Cookie> 类型, 其中 key是cookie 的name, value 是 cookie 对象;
例如: 获取 JSESSIONID 的值:${cookie.JSESSIONID.value}
- pageContext: 它是 PageContext 类型, 可以使用 pageContext 对象调用 getXXX() 方法.
例如, 获取项目名:${pageContext.request.contextPath}
其实就是:pageContext.getRequest.getContextPath()
5. EL 函数库 (由 JSTL 提供)
1. EL 函数库概述
- EL 函数库是由第三方对 EL 的扩展.
- EL 函数库就是定义一些有返回值的静态方法.
- EL 函数库中包含了很多对字符串的操作方法, 以及对集合对象的操作.
例如,${fn:length("abc")}
, 表示字符串的长度
2. 导入函数库
- 需要导入标签库:
jstl-1.2.jar
包 - 格式:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions"%>
3. EL 函数库介绍
- String toUpperCase(String input);
- String toLowerCase(String input);
- boolean contains(String input, String substring);
- String escapeXml(String input); 把 input 中的 "<", ">", "&"等符合进行转义.
例如:${fn:escapeXml("<html></html>")}
输出结果:
4. 自定义函数库
- 步骤:
- 写一个 java 类, 类中可以定义 0~N 个方法, 但必须是 Static, 而且有返回值;
- 在 WEB-INF 目录下创建一个 tld 文件;
- 在 jsp 页面导入标签库:
<%@ taglib prefix="it" uri="/WEB-INF/tlds/myfn.tld" %>
- 在 jsp 页面中使用自定义的函数
${it:test()}
// java 类
public class MyFunction{
// 静态方法
public static String test(){
return "这是自定义方法";
}
}
// WEB-INF 目录下创建 myfn.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>myfn</short-name>
<uri>http://www.cnbologs.com/link-world/jsp/functions</uri>
<function>
<name>test</name>
<function-class>cn.itcast.fn.MyFunction</function-class>
<function-signature>java.lang.String test()</function-signature>
</function>
</taglib>
参考资料: