EL表达式

EL即Expression Language,主要的任务是帮助开发者简化获取域属性。

但是一般情况下需要使用EL和JSTL结合使用。

语法:

${

    // 隐含对象|直接写域中的属性

}   

    算术运算
<!-- 算术运算 -->
20+10 = ${ 20+10 } <br/>
20-10 = ${ 20-10 } <br/>
20*10 = ${ 20*10 } <br/>
20/10 = ${ 20/10 } <br/>
20%10 = ${ 20%10 } <br/>
    比较运算
<!-- 比较运算 -->
20 > 10 = ${ 20 > 10 } <br/>
20 < 10 = ${ 20 < 10 } <br/>
20 >= 10 = ${ 20 >= 10 } <br/>
10 == 10 = ${ 10 == 10 } <br/>
${ str == null }
    三目运算符
${ name != null ? "欢迎":"注册"}
    逻辑运算
${ 12>10 && 1<2 }<br/>

一  获取域对象(重点)

1. 普通数据

<!-- 获取普通属性 --> 
<%
request.setAttribute("name","jack");
%>
${name}<br/>

以上的代码在获取域属性的时候没有指定给任何的域空间,那么底层一定按照小到大的方式逐一的检测的域属性。

pageContext.findAttribute(“”);          à 实现原理

2 获取数组属性

<!-- 获取数组属性 -->
<%
int [] ins = {1,2,3,4};
request.setAttribute("arrs",ins);
%>
${arrs}<br/>
${arrs[2]}<br/>
${arrs["2"]}<br/>  该方式不是给数组用,是个集合使用。

3  List集合

<!-- 获取数组属性 -->
<%
List<String> list = new ArrayList<String>();
list.add(0,"jiao");
list.add(1,"ning");
list.add(2,"bo");
request.setAttribute("list",list);
%>
${list }<br/>
${list[0] }<br/>
${list["0"] }<br/>

4  获取Map属性

<% 
LinkedHashMap<String,String> map = new LinkedHashMap<String,String>();
map.put("001","ooooo");
map.put("002","fffff");
map.put("003","uuuuu");
request.setAttribute("map",map);
%>
${map }<br/>
${map[001] }<br/>
${map["001"] }<br/>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<c:forEach items="${map}" var="entry">
${entry.key } = ${entry.value }<br/>
</c:forEach>

6  Bean操作

<!-- 获取Map中Bean属性 -->
<%
LinkedHashMap<String,Cat> cats = new LinkedHashMap<String,Cat>();
cats.put("001",new Cat("A猫",3,"波斯猫"));
cats.put("002",new Cat("B猫",3,"狸猫"));
cats.put("003",new Cat("C猫",3,"加菲猫"));

request.setAttribute("cats",cats);
%>
<c:forEach items="${cats}" var="entry">
${entry.key} = ${entry.value.name } , ${entry.value.age },${entry.value.type }<br/>
</c:forEach>

7  EL隐含对象

pageScope

requestScope

sessionScope

applicationScope

如果在获取域属性的时候没有指定具体的域,那么逐一的查找比较耗时,因此希望大家在明确域名的时候一定要指定域名。

pageContext   该对象可以获取request对象

举例:

<!-- 隐含对象 -->
${pageContext.request.method }<br/>
${pageContext.request.servletPath }<br/>
${pageContext.request.contextPath }<br/>
${pageContext.request.protocol }<br/>


获取请求参数
param
paramValues

举例:
${param.name }<br/>
${paramValues.likes[0] }<br/>


获取请求头信息
header
headerValues

举例:
${header["accept"] }<br/>
initParam

获取Cookie
cookie

举例:
${cookie }<br/>
${cookie.address }<br/>
${cookie.address.name }<br/>
${cookie.address.value }<br/>

EL和函数库

问题:在数据显示的时候经常需要调用一些方法对需要显示的数据进行基本的处理,如:

数据过滤、求子串等操作。那么就需要使用EL表达式进行快速的函数调用。

  1. 引入HTMLFilter.java类
  2. 描述为函数

2.1 在WEB-INF中创建一个myfun.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>jnb</short-name>
<function>
<name>filter</name>
<function-class>cn.itcast.utils.HTMLFilter</function-class>
<function-signature>java.lang.String filter(java.lang.String)</function-signature>
</function>
</taglib>

2.2  引入函数库

​​%@taglib uri="/WEB-INF/myfuns.tld" prefix="jnb"%​​

1.2  使用EL调用函数

<td>${jnb:filter(entry.value.info)}</td>

注意:

  1. EL表达式中不能继续嵌套EL表达式
  2. 定义函数的时候函数必须是静态的。

总结

JSTL总过有5个库,但是由于JSP主要是做数据显示的,因此我们只学习核心库和函数库。

源码面前,了无秘密