EL表达式:Expression Language。
主要作用:1.获取数据,替换jsp中的java代码脚本,从各类型的web域中检索java对象获取数据。
2.执行计算,利用el表达式可以再jsp中执行一些基本的关系运算、逻辑运算和算术运算。
3.获取web开发常用对象,el表达式定义了一些隐式对象,利用这些隐式对象可以获得web常用对象。
4.调用java方法,el表达式允许用户开发自定义el函数,以在jsp页面中调用el表达式的方式来调用java方法。
注:el表达式不支持字符串操作。
例子:获取数据
.运算符:调用对象的getter方法
[]运算符:作用与.运算符一样。能做.不能做的事。
<!-- 获取对象的某些属性,调用getter方法 -->
<%
Student s1 = new Student();
s1.setName("s1");
pageContext.setAttribute("s", s1);
%>
${s.name}${s.birthday}${s.class }<br/>
<%
Student s2 = new Student();
s2.setName("s2");
request.setAttribute("s", s2);
%>
${s.name}<br/>
<%
Student s3 = new Student();
s3.setName("小三");
s3.getHomeAddress().setProvince("你家");
pageContext.setAttribute("s3", s3);
%>
${s3.homeAddress.province}<br/>
${s3['homeAddress']["province"]}
<hr/>
<!-- 获取List集合中的元素 -->
<%
List<String> list = new ArrayList<String>();
list.add("aaa");
list.add("bbb");
list.add("ccc");
pageContext.setAttribute("list", list);
%>
${list[1]}<br/>
<!-- 获取Map中的元素 -->
<%
Map<String,Student> map = new HashMap<String,Student>();
map.put("a", new Student("aname"));
map.put("b", new Student("bname"));
map.put("c", new Student("cname"));
pageContext.setAttribute("map", map);
%>
>
${map.b.name}
执行运算:
关系运算符: == 或 eq,!= 或 en,< 或 lt ,> 或 gt, <= 或 le,>= 或 ge
逻辑运算符:&& 或 and,|| 或 or,! 或 not
empty:检查对象是否为null 或 空
三元表达式:${user en null?user.name : ""}
<%
String s1 = null;
pageContext.setAttribute("s1", s1);
%>
${empty s1}<br/>
<%
String s2 = "";
pageContext.setAttribute("s2", s2);
%>
${empty s2}<br/>
<%
String s3 = " ";
pageContext.setAttribute("s3", s3);
%>
${empty s3}<br/>
<%
List l1 = new ArrayList();
pageContext.setAttribute("l1", l1);
%>
${empty l1}<br/>
<%
List l2 = new ArrayList();
l2.add("aaa");
pageContext.setAttribute("l2", l2);
%>
${empty l2}<br/>
<hr/>
${1>2?"大于":"小于" }<hr/>
<!-- 以下就是具体的真实应用 -->
<%
session.setAttribute("user", new Student("小温静"));
%>
<!-- EL表达式不支持字符串连接操作 -->
${empty user?"木有登录":"欢迎您"}${user.name}<hr/>
<%
List cart = new ArrayList();
cart.add("p");
session.setAttribute("cart", cart);
%>
${empty cart?"您还没有购物":"你购买了以下内容:" }<hr/>
<%
pageContext.setAttribute("gender", "0");
%>
<input type="radio" name="gender" value="1" ${gender=="1"?'checked="checked"':'' }/>男
<input type="radio" name="gender" value="0" ${gender=="0"?'checked="checked"':'' }/>女<hr/>
<%
pageContext.setAttribute("city", "JN");
%>
<select>
<option value="BJ" ${city=="BJ"?'selected="selected"':'' }>北京</option>
<option value="JN" ${city=="JN"?'selected="selected"':'' }>济南</option>
<option value="JZ" ${city=="JZ"?'selected="selected"':'' }>荆州</option>
</select>
el表达式中的内置对象:
pageContext javax.servlet.jsp.PageContext 与JSP内置对象一样
pageScope java.util.Map 对应PageContext中的那个Map
requestScope java.util.Map 对应ServletRequest中的那个Map
sessionScope java.util.Map 对应HttpSession中的那个Map
applicationScope java.util.Map 对应ServletContext中的那个Map
param java.util.Map 对应请求参数。key是参数名 value是参数值String
paramValues java.util.Map 对应请求参数。key是参数名 value是参数值String[]
header java.util.Map 对应请求消息头。key是头名 value是头值String
cookie java.util.Map 对应cookie。key是cookie的name value是Cookie对象
initParam java.util.Map 获取web.xml中配置的context-param key是参数名 value参数值String
${pageContext.request.contextPath}=<%=request.getContextPath() %><hr/>
<%
pageContext.setAttribute("p", "pp");
request.setAttribute("p", "rp");
%>
${p}<br/>
<%--pageContext.findAttribute("p") --%>
${pageScope.p} <br/>
<%--pageContext.getAttribute("p") --%>
${requestScope.p }<br/>
<hr/>
<%
request.setAttribute("user", "hehe");
//session.setAttribute("user", "user");//这个才是登录标记
%>
${empty sessionScope.user?"木有登录":"欢迎您" }<br/>
<%
List list = new ArrayList();
list.add("");
request.setAttribute("cart", list);
session.setAttribute("cart", list);
%>
${empty sessionScope.cart?"木有购买东西":"买了东西" }
<hr/>
<!-- http://localhost:8080/day07_02_el/03.jsp?username=abc&username=def -->
${param.username}<!-- request.getParameter("username") -->
${paramValues.username[0]}<!-- request.getParameterValues("username") -->
${paramValues.username[1]}<br/>
${header['Accept-Encoding']}<!-- request.getHeader("Accept-Encoding") -->
${headerValues['Accept-Encoding'][0]}<!-- request.getHeaders("Accept-Encoding") -->
<br/>
${cookie.JSESSIONID.value }
${cookie.JSESSIONID.name }<br/>
${initParam.encoding }
自定义EL函数:
a.编写一个普通类,添加要实现功能的静态方法
public class MyFunctions {
public static String toUpperCase(String s){
return s.toUpperCase();
}
}
b.在WEB-INF目录下,建立一个扩展名为tld(Tag Libary Definition)的xml文件,增加以下内容
<?xml version="1.0" encoding="UTF-8"?>
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>2.0</jsp-version>
<short-name>myfunctions</short-name>
<uri>http://www.ivan.com/jsp/functions</uri>
<function>
<description>to uppercase</description>
<name>toUpperCase</name>
<function-class>com.i.funcitons.MyFunctions.java</function-class>
<function-signature>java.lang.String toUpperCase( java.lang.String )</function-signature>
</function>
</taglib>
c.(Servlet2.5是可选的,前提是把tld文件放在了WEB-INF的根目录下),修改web.xml
<jsp-config>
<taglib>
<taglib-uri>http://www.itheima.com/jsp/functions</taglib-uri>
<taglib-location>/WEB-INF/myfn.tld</taglib-location>
</taglib>
</jsp-config>
d.在jsp中使用
<%@ taglib prefix="myfun" uri="http://www.ivan.com/jsp/functions"%>
<%
session.setAttribute("s", "ss");
%>
${s}
${myfun:toUpperCase(s)}
导入jar包:standard.jar jstl.jar
标签的作用:替换JSP中的<%%>
JSTL:Java Standard Tag Libary(JSP内部标准。由apache提供的)
由5部分组成:
Core 核心 c
Fmt 国际化 fmt
Functions EL函数 fn
SQL 数据库 sql
XML 操作XML xml
${fn:contains("Tomcat","Tom") }<br/>
${fn:containsIgnoreCase("Tomcat","CAT") }<br/>
${fn:substring("Tomcat",3,6000)}<br/>
${fn:split("2013-12-27","-")[0] }<br/>
${fn:split("2013-12/27","-/")[0] }<br/>
${fn:split("2013-12/27","-/")[1] }<br/>
${fn:split("2013-12/27","-/")[2] }<br/>
<%
String s[] = {"I love","U"};
pageContext.setAttribute("s", s);
%>
${fn:join(s,"!") }<br/>
<%
pageContext.setAttribute("h", "<hr/>");
%>
${fn:escapeXml(h)}
c标签
<!-- c:if判断,属性test的值,如果为true,标签的主题内容会显示 -->
<c:if test="true">
哈哈
</c:if>
<c:if test="false">
shit
</c:if>
<hr/>
<%
List cart = new ArrayList();
cart.add("");
session.setAttribute("cart", cart);
%>
<c:if test="${empty sessionScope.cart}">
没有买东西
</c:if>
<c:if test="${!empty sessionScope.cart}">
买了
</c:if><br/>
<!-- var指定的是一个字符串,记住test的运算结果,并以var指定的字符串为key,存到域范围中 -->
<c:if test="${12>10}" var="result" scope="page">
<!-- pageContext.setAttribute('result',true) -->
大于
</c:if>
${pageScope.result}
<!-- c:forEach遍历.重复执行主题内容 -->
<%
String s[] = {"a","b","c"};
pageContext.setAttribute("s", s);
%>
<c:forEach items="${s}" var="v">
${v}<br/>
</c:forEach>
<!-- 遍历List -->
<hr/>
<%
List list = new ArrayList();
list.add("aa");
list.add("bb");
list.add("cc");
list.add("dd");
list.add("ee");
list.add("ff");
list.add("gg");
list.add("hh");
pageContext.setAttribute("list", list);
%>
<c:forEach items="${list}" var="v">
${v }<br/>
</c:forEach>
<!-- 遍历Set -->
<hr/>
<%
Set set = new HashSet();
set.add("aaa");
set.add("bbb");
set.add("ccc");
pageContext.setAttribute("set", set);
%>
<c:forEach items="${set}" var="v">
${v }<br/>
</c:forEach>
<!-- 遍历Map -->
<hr/>
<%
Map map = new HashMap();
map.put("a", "aaaa");
map.put("b", "bbbb");
map.put("c", "cccc");
pageContext.setAttribute("map", map);
%>
<!-- pageContext.setAttribute("v",Map.Entry) -->
<c:forEach items="${map}" var="v">
${v.key}=${v.value}<br/>
</c:forEach>
<hr/>
<c:forEach begin="1" end="100" var="v">
${v}
</c:forEach>
<hr/>
<!-- 索引从0开始。0索引是第1个元素 。含头含尾-->
<c:forEach items="${list}" var="v" begin="2" end="5">
${v }<br/>
</c:forEach>
<hr/>
<c:forEach items="${list}" var="v" begin="2" end="500">
${v }<br/>
</c:forEach>
<hr/>
<c:forEach items="${list}" var="v" begin="2" end="500" step="2">
${v }<br/>
</c:forEach>
<hr/>
<!-- 真实的开发 -->
<%
//一般由Servlet来做
List ps = new ArrayList();
ps.add(new Person("温静",0,"南阳"));
ps.add(new Person("王学进",1,"泰州"));
ps.add(new Person("刘梅双",0,"泰安"));
ps.add(new Person("丁魏",1,"信阳"));
ps.add(new Person("胡王飞",1,"九江"));
pageContext.setAttribute("ps", ps);
%>
<!-- 先弄模板:html -->
<table border="1" width="438">
<tr>
<th>序号</th>
<th>姓名</th>
<th>性别</th>
<th>城市</th>
</tr>
<!--
varStatus:指定一个变量,该变量引用一个对象(放到page范围中)。该对象记录着当前遍历的元素的信息
int getIndex():从0开始,索引号
int getCount():从1开始,计数
boolean isFirst():是否是第一个
boolean isLast():是否是最后一个
-->
<c:forEach items="${ps}" var="p" varStatus="vs">
<tr class="${vs.count%2==0?'even':'odd' }">
<td>${vs.count}</td>
<td>${p.name}</td>
<td>${p.gender==0?'女':'男'}</td>
<td>${p.city}</td>
</tr>
</c:forEach>
</table>