1. EL 全名为Expression Language。它是一种数据访问语言
el 表达式
2. EL 能实现如下功能:
1) 使用变量访问web域中存储的对象${user }
2) 访问javabean的属性 ${user.address.city }
3) 执行基本的逻辑运算
4) 直接使用隐式对象
5) 调用 el 函数
3. el 表达式用在哪里
1) 在 jsp 页面直接输出数据
2) 在标签中使用el直接为属性赋值
4. el 表达式获取数据
在jsp页面使用el表达式可以轻松地获得web域中的对象
并对 javabean 、 数组、 list 、 map 进行取值
5. 需要对 web 域中的 list 和map 集合进行迭代就需要结合 jstl 迭代标签
EL变量
${user}表示在某一范围中找出名为user的变量,
查找范围为:page,request,sesion,application,从小到大依次查找,直到找到为止,找不到则返回null。
也可指定在某一范围内查找:${sessionScope.user}
范围名称: 四个对象都是EL的隐含对象。
范围 |
EL中的名称 |
page |
pageScope |
request |
requestScope |
session |
sessionScope |
application |
applicationScope |
自动转换类型
EL表达式可实现数据类型的自动转换,只要是可相互转换的类型,如:数值型转换为字符串,字符串转换为数值型,如果结果为null,则什么都不显示,如果转换出错,则报错。
EL隐含对象
EL共有11个隐含对象(Implicit Object):
隐含对象 |
类型 |
说明 |
pageContext |
javax.servlet.ServletContext |
对应于JSP页面中的pageContext |
pageScope |
java.util.Map |
代表page域中用于保存属性的Map对象 |
requestScope |
java.util.Map |
代表request域中用于保存属性的Map对象 |
sessionScope |
java.util.Map |
代表session域中用于保存属性的Map对象 |
applicationScope |
java.util.Map |
代表application域中用于保存属性的Map对象 |
param |
java.util.Map |
同request.getParameter(),返回String |
paramValues |
java.util.Map |
同request.getParameterValues(),返回String[] |
header |
java.util.Map |
同request.getHeader(),返回String |
headerValues |
java.util.Map |
同request.getHeaders(),返回String[] |
cookie |
java.util.Map |
同request.getCookies() |
initParam |
java.util.Map |
同ServletContext.getInitParameter(),返回String |
范围隐含对象:pageScope,requestScope,sessionScope,applicationScope,在这四个范围隐含对象中,只能取出属性值(Attribute),即:.getAttribute()方法的功能,不能取得其他信息。
隐式对象的具体用途
1. pageContext
获得servlet上下文路径 (web应用名称)
${pageContext.request.contextPath }
2. pageScope、requestScope、sessionScope、applicationScope
准确地获得四个域中的对象,用于取值
3. param、paramValues
获得请求参数,一般用于做表单的回显
4. header、headerValues
获得请求消息头
5. cookie
获得浏览器发送的cookie
Cookie也是map集合,key是cookie的name value是对应的cookie对象
6. initParam
获得web 初始化参数
el表达式语法
注意:如果jsp页面中不能使用el表达式,那么在jsp的页面指令中加入isELIgnored="false"就可以显示了。
EL 表达式的格式是这样的:用美元符号($)定界,内容包括在花括号({})中,例如:
${user.username}
上面这句EL代码的意思是,在四个Attribute scope范围中依次去找寻key为user的对象,并且调用此对象的firstName属性值,这句EL按照原来的脚本元素编写,你会发觉代码量一定会增加很多,其实就是因为这个原因,所以开发人员喜欢上了EL表达式。 下面列出了11 个 EL 隐式对象的标识符, 不要将这些对象与JSP 9个对象混淆,其中只有一个对象是它们所共有的。
类别 |
标识符 |
描述 |
JSP |
pageContext |
PageContext 实例对应于当前页面的处理 |
作用域 |
pageScope |
与页面作用域属性的名称和值相关联的 Map 类 |
requestScope |
与请求作用域属性的名称和值相关联的 Map 类 |
|
sessionScope |
与会话作用域属性的名称和值相关联的 Map 类 |
|
applicationScope |
与应用程序作用域属性的名称和值相关联的 Map 类 |
|
请求参数 |
param |
按名称存储请求参数的主要值的 Map 类 |
paramValues |
将请求参数的所有值作为 String 数组存储的 Map 类 |
|
请求头 |
header |
按名称存储请求头主要值的 Map 类 |
headerValues |
将请求头的所有值作为 String 数组存储的 Map 类 |
|
Cookie |
cookie |
按名称存储请求附带的 cookie 的 Map 类 |
初始化参数 |
initParam |
按名称存储 Web 应用程序上下文初始化参数的 Map 类 |
EL表达式语言的运算:
类别 |
运算符 |
算术运算符 |
+、-、*、/(或 div)和 %(或 mod) |
关系运算符 |
==(或 eq)、!=(或 ne)、<</code>(或 lt)、>(或 gt)、<=(或 le)和 >=(或 ge) |
逻辑运算符 |
&&(或 and)、||(或 or)和 !(或 not) |
验证运算符 |
empty |
JSTL核心语法
JavaServer Page standard Tag Library,JSP标准标签函数库。
JSTL 1.1必须在支持Servlet 2.4和JSP 2.0以上版本的Container中使用,如Tomcat 5以上版本。使用必须导入URI。
JSTL 1.1包含两个jar包:jstl.jar和standard.jar。
JSTL提供的标签库分五大类:
JSTL |
前缀 |
URI |
核心标签库(Core tag library) |
c |
http://java.sun.com/jsp/jstl/core |
I18N格式标签库(I18N-capable formatting) |
fmt |
http://java.sun.com.jsp/jstl/fmt |
SQL标签库(SQL tag library) |
sql |
http://java.sun.com/jsp/jstl/sql |
XML标签库(XML tag library) |
xml |
http://java.sun.com.jsp/jstl/xml |
函数标签库(Function tag library) |
fn |
http://java.sun.com/jsp/jstl/funcions |
注意:JSTL 1.1的URI中有/jsp,而JSTL1.0中没有,不要写错路径。 导入核心标签库: <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
1、核心标签库
核心标签库主要包括:基本输入输出,流程控制,迭代,URL操作。
表达式操作(输入输出):out,set,remove,catch
流程控制:if,chose(when,otherwise)
迭代操作:forEach,forTokens
URL操作:import,url,redirect
1)、表达式操作
out:显示数据的内容
<c:out value="" default="" escapeXml="true|false" />
value:要显示的值
default:默认值
escapeXml:是否转换特殊字符
如果没有指定default,而value值为null时,显示空字符串。
如: <c:out value="${sessionScope.loginUser.username }" default="您还没有登录" />
set:将变量存储在JSP范围或JavaBean属性中。
<c:set var="" value="" scope="" target="" property=""/>
var:变量名称
value:被存储的值
scope:范围
target:为一个JavaBean或Map对象
property:指定target对象的属性
remove:移除变量
<c:remove var="" scope=""/>
var:移除的变量名称
scope:范围
如果没有指定范围,则移除所有范围内相同名称的变量。
catch:处理异常
<c:catch var="">
//发生异常的代码
</c:catch>
将会发生异常的代码包围起来,当发生异常时,将错误信息存储在var指定的变量中。只有catch标签内的代码中止执行,其余部分将继续完成。
2、流程控制
if:
<c:if test="" var="" scope="">
//代码
</c:if>
test:如果表达式执行结果为true,则执行本体内的代码,否则不执行。如果要结果为假时执行,则加!。
如:
<c:if test="${ 1==1}">
结果为真。
</c:if>
choose:相当于switch语句块
<c:choose>
<c:when test=""></c:when>
<c:when test=""></c:when>
<c:when test=""></c:when>
<c:otherwise></c:otherwise>
</c:choose>
when和otherwise必须在choose之间,when必须在otherwise之前
可以有1个或多个when语句块,可以有0个或多个otherwise块
when块必须有test属性,当有几个when为真时,只有第一个执行。
如:
<c:choose>
<c:when test="true">
when1
</c:when>
<c:when test="true">
when2
</c:when>
<c:when test="false">
when3
</c:when>
<c:otherwise>
otherwise
</c:otherwise>
</c:choose>
foreach:迭代
<c:forEach var="" items="" begin="" end="" step="" varStatus="">
</c:forEach>
var:存放当前元素的变量
items:被迭代的集合对象,数组,list,map等等
begin:开始位置
end:结束位置
step:步长
varStatus:存放当前元素的相关信息。
示例:
<center>
<c:forEach var="i" begin="1" end="10">
<c:forEach begin="1" end="${2*i-1 }">*</c:forEach>
<br />
</c:forEach>
</center>
<table class="indexTable">
<c:forEach var="article" items="${sessionScope.type1Map}" end="3">
<tr>
<td width="55%" align="center">
<a href="#">${article.value.title}</a>
</td>
<td width="45%" align="center">
[${fn:substring(article.value.writeDate,0,16) }]
</td>
</tr>
</c:forEach>
</table>
注意:
如果有step,则必须大于0,否则出异常。
javax.servlet.ServletException: javax.servlet.jsp.JspTagException: 'step' <= 0
如果有begin,则必须大于等于0
javax.servlet.ServletException: javax.servlet.jsp.JspTagException: 'begin' < 0
当begin大于items的大小时,迭代不执行。
items为空时,迭代不执行。
当items为Map时,使用var.value.xxx的方法取出value中的值。
2、I18N格式标签库
用于格式化输出,可实现国际化格式输出等。
主要包括:国际化,消息,数字日期格式化。
数字格式化:
如:
<fmt:formatNumber value="12" pattern="0.00"/>
输出:12.00
3、SQL标签库(不推荐使用)
主要包含:setDataSource,query,update,param等
4、使用函数标签库
引入标签库:
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
使用标签截取字符串:
${fn:substring("xxxxxxx",0,5) }
5、使用fmt格式化日期
<jsp:useBean id="now" class="java.util.Date"/>
<fmt:formatDate var="d" type="date" value="${now}"/>
now : ${now}
d : ${d}
1、JSTL的用法:
如果要使用JSTL标记库,首先必须把对应的标签库引入进来,如下代码演示:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
目前项目中,使用的应该是JSTL1.1以上的版本,在JSTL1.1中有5个核心标记库,分别是 core(核心库),format(格式化库),SQL(数据库),XML(XML读取库),functions(基于EL操作库)
JSTL的xml 和 sql 库使用定制标记,从而能够在JSP页面上实施复杂的功能,但是在您的视图层使用这类功能可能不是最好的方法,所以在实际开发中,几乎不可能使用xml和sql标签库,我们在这里着重讲解core和format库。
2、CORE标签库:
Core的意思就是核心,通常开发中,我们命名为c标签,如果要使用core标签库中的标签,我们必须写入如下代码到指定的JSP中:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
然后,我们开始c标签的开发。
Ⅰ.<c:out>标签:
<c:out value="hello world" />
<!-- c:out标签是没有取值功能,只有显示功能 -->
<c:out value="${two}" default="目前没有任何值"/>
<c:out value="${one}" escapeXml="false"/>
<c:out value="${one}">
目前没有任何值
</c:out>
<!-- value属性是所见即所得模式,default属性是在EL取不到值的时候显示,escapeXml属性是关闭HTML标签解析 如果c:out标签是双标签出现的时候,中间插入的内容就是默认值 通常情况下,c:out都会和EL合并使用,因为c:out自身是无法取值的 -->
Ⅱ.<c:set>标签:
<c:set var="name" value="china" scope="pageContext"/>
<%=pageContext.getAttribute("name") %>
${name}
<!-- c:set标签是设置某一个值或者对象到某一个scope中,var代表key值,value代表value值,scope代表访问,scope默认是pageContext中 -->
另外一个例子:
<%
UserBean ub = new UserBean();
%>
<c:set var="beanname" target="ub" property="username" value="thinkmore"/>
<%=((UserBean)pageContext.getAttribute("beanname")).getUsername() %>
${beanname.username}
<!-- var代表key值,target代表对象名,property代表对象中的属性名,value代表value值 -->
Ⅲ.<c:remove>标签:
<c:remove var="name"/>
<%=pageContext.getAttribute("name") %>
${name}
<!-- 在scope中移除对应key的属性或者对象 -->
Ⅳ.<c:catch>标签:
<c:catch var="exception">
<% new Integer("a"); %>
</c:catch>
${exception }
<!--这个标签相当于捕获在它里边标签抛出异常对象 -->
Ⅴ.<c:if>标签:
<c:if test="true">比较成功</c:if>
<!-- test属性中的比较必须是EL表达式和jsp脚本元素 -->
<c:if test="${2>1}" var="return">EL比较成功</c:if>
${return}
<c:if test="<%=2>1 %>" var="return">jsp脚本比较成功</c:if>
<c:choose>标签和<c:when>标签和<c:otherwise>标签
<c:choose>
<c:when test="${1<0}">1<0比较成功</c:when>
<c:when test="${1<1}">1<1比较成功</c:when>
<c:when test="${1<2}">1<2比较成功</c:when>
<c:otherwise>没有结果</c:otherwise>
</c:choose>
<!-- when和otherwise标签必须在choose里面 -->
Ⅵ.<c:forEach>标签:
<!-- c:forEach就是一个循环取值的概念 -->
<% List list = new ArrayList();
list.add("one");
list.add("two");
list.add("three");
list.add("four");
list.add("five");
list.add("six");
request.setAttribute("list",list);
%>
${list}
<br/>
<c:forEach items="${list}" var="arraylist" begin="0" end="5" step="2">
${arraylist }
</c:forEach>
<br/>EL取值:${arraylist }
<br/>
<!-- c:forEach可以当做普通的循环,例如下面就是循环打印几个技术的字符串 -->
<c:forEach begin="0" end="5">
技术
</c:forEach>
<!-- c:forEach也可以取出map中的key和value -->
<%
Map map = new HashMap();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
request.setAttribute("map",map);
%>
<c:forEach items="${map}" var="maplist">
${maplist.key }
${maplist.value }
</c:forEach>
Ⅶ.<c:forTokens>标签:
<%
String str = "one,two,three,four,five,six,seven";
request.setAttribute("math",str);
%>
<c:forTokens items="${math}" delims="," var="va">
${va}
</c:forTokens>
<c:url>标签和<c:param>标签
<c:url value="error.jsp" var="errorpage">
<c:param name="username" value="china"/>
</c:url>
Ⅷ.<c:import>标签:
<c:import url="one.jsp"/>
<!-- import的作用和include包含指令的作用是一样的 -->
Ⅸ.<c:redirect>标签:
<c:redirect context="/2010struts1.2" url="/welcome.jsp"/>
<!--Context属性是指定网站名,url是跳转路径,两个都要加上斜线,重新定向到另外一个页面上,也可以使用下面的方式:-->
<c:redirect url=" http://localhost:8080/test/one.jsp"/>
3、 FN标签库:
Ⅰ.fn:contains 判断一个字符串是否含有另外一个字符串
例如:<c:if test="${fn:contains(str, searchString)}">
Ⅱ.fn:containsIgnoreCase 同上面tag只是不区分大小写
Ⅲ.fn:endsWith 判断一个字符串是否以某一个字符串结束
例如:<c:if test="${fn:endsWith(filename, ".txt")}">
Ⅳ.fn:escapeXml 将一个字符串转换为没有xml无法识别的一个字符串
例如:${fn:escapeXml(info)}
Ⅴ.fn:indexOf 判断某个字符串在一个字符串中位置
例如:${fn:indexOf(name, "-")}
Ⅵ.fn:join 拼接
例如:${fn:join(.gif' />, ";")}
Ⅶ.fn:length 计算一个字符串长度
Ⅷ.fn:replace 替换某一个字符串
例如:${fn:replace(text, "-", "•")}
Ⅸ.fn:split 基于某一个符号拆分
例如:${fn:split(customerNames, ";")}
Ⅹ.fn:startsWith 是否以某一个字符串开始
例如:<c: test="${fn:startsWith(product.id, "100-")}">
Ⅺ.fn:sub 获取一个字符串
例如:${fn:sub(zip, 6, -1)}
Ⅻ.fn:subAfter 从某一个字符串开始取一个字符串
例如:${fn:subAfter(zip, "-")}
ⅠⅠ.fn:subBefore 上条反过程
ⅠⅡ.fn:toUpperCase 把一个字符串中全部转为大写
ⅠⅢ.fn:trim 去掉一个字符串两边空格
例如:${fn.trim(name)}