EL(表达式语言)
表达式语言(Expression Language,EL)是JSP2.0中新增的功能。使用表达式语言,可以方便地访问标志位(page,request,session和application标志位)中的属性内容,可以避免出现许多的Scriptlet代码。语法如下:
${属性名称}
注:Scriptlet:在JSP中,Scriptlet被称为脚本小程序,所有嵌入在HTML代码中的Java程序都必须使用Scriptlet标记起来。一共有三种:
第一种:<% %> 第二种:<%!%> 第三种:<%= %>
EL表达式可以方便得访问对象中的属性、提交的参数或者是进行各种数学运算,EL表达式最大的特点是如果输出内容为null,则会自动使用空字符串(“”)表示。EL表达式语言可以输出4种范围中的内容,如在不同的属性范围中设置了同一个属性名称,则将按照如下顺序查找:
page --> request --> session --> application
<% pageContext.setAttribute(“info”,”page范围属性”); request.setAttribute(“info”,” request范围属性”); session.setAttribute(“info”,” session范围属性”); application.setAttribute(“info”,” application范围属性”); %> ${info}
以上代码的运行结果是:page范围属性。
当然要指定一个要取出属性的范围,可以添加标记
属性范围 |
范例 |
说明 |
page |
${pageScpe.属性} |
取出page范围的属性内容 |
request |
${requestScpe.属性} |
取出request范围的属性内容 |
session |
${sessionScpe.属性} |
取出session范围的属性内容 |
application |
${applicationScpe.属性} |
取出application范围的属性内容 |
接受请求参数
使用表达式语言可以显示接收的请求参数,功能和request.getParameter()类似,语法如下:
接收一个参数 ${param.参数名}
接收一组参数 ${paramValues.参数名称}
接收到一组参数,如果想要取出,需要分别指定下标。
对集合的操作(Collection、Map集合中的内容)将集合保存在request范围中,使用EL表达式输出时,直接通过集合的下标即可访问。
<% List list = new Arraylist(); list.add(“a”); list.add(“b”); list.add(“c”); request.setAttribute(“list”,list); %> 第一个元素:${list[0]} 第二个元素:${list[1]} 第三个元素:${list[2]}
以上代码的运行结果是:
第一个元素:a
第二个元素:b
第三个元素:c
运算符
算术运算符 |
描述 |
范例 |
结果 |
+ |
加法 |
${4+6} |
10 |
- |
减法 |
${4-6} |
-2 |
* |
乘法 |
${4*6} |
24 |
/或div |
除法 |
${4/6} 或 ${4 div 6} |
0.666 |
%或mod |
取模(余数) |
${4%6} 或 ${4 mod 6} |
4 |
特别注意
“+”在EL中只代表加法,不表示连接;
${a+”20”} //20 ${a+”20a”} //异常 ${10/0} //Infinity ${“abc” < “b”} //true 比较的是位置的字符Unicode码 ${empty ulist} //返回的是boolean,即ulist是否为空。
JSTL(JSP标准标签库)
JSP标准标签库
使用标签库可以避免过多的Scriptlet代码,但是采用自定义的标签库的做法,非常繁琐且不通用,所以可以借助一些开源工具使用一些公共的标签来完成代码的开发。JSTL(JSP Standard Tag Library,JSP标准标签库)是一个开放源代码的标签组件。核心标签库是JSTL中最重要的部分,也是在开发中最常用的部分,在核心标签库中主要完成的就是流程控制、迭代输出等操作。
核心标签库中的主要标签
功能分类 |
标签名称 |
描述 |
基本标签 |
<c:out> |
输出属性内容 |
<c:set> |
设置属性内容 |
|
<c:remove> |
删除指定属性 |
|
<c:catch> |
异常处理 |
|
流程控制 |
<c:if> |
条件判断 |
<c:choose> |
多条件判断,可设置<c:when>和<c:otherwise>标签 |
|
迭代标签 |
<c:forEach> |
输出数组,集合 |
<c:forTokens> |
字符串拆分及输出操作 |
|
包含标签 |
<c:import> |
将指定的路径包含到当前页 |
生成URL标签 |
<c:url> |
根据路径和参数生成一个新URL |
客户端跳转 |
<c:redirect> |
客户端跳转 |
使用核心标签库之前,必须在JSP页面中引入标签库配置文件。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/fmt" prefix="fmt" %>
<c:if>标签
语法:
<c:if test=”判断条件” var=”存储判断结果”> </c:if>
例子
<c:if test=”${username != null}”> 欢迎,${username} </c:if>
<c:choose>标签
<c:if>的功能只是针对一个条件的判断,如果要判断多个条件,可以使用<c:choose>标签,<c:choose>只能作为<c:when>和<c:otherwise>的父标签出现,不能单独使用。
例子:
<%
request.setAttribute(“num”,12);
%> <c:choose> <c:when test=”${num == 10}”> num属性的值为10 </c:when> <c:when test=”${num == 20}”> num属性的值为20 </c:when> <c:otherwise> 没有一个条件满足 </c:otherwise> </c:choose>
以上代码输出结果为:没有一个条件满足
<c:otherwise>标签是当所有的<c:when>都不满足时执行的,所以编写时一定要放在所有<c:when>标签的最后。
<c:forEach>标签
<c:forEach>标签的主要功能为循环控制,可以将集合中的成员进行迭代输出,功能与Iterator接口类似。
<c:forEach [var=”每一个对象的属性名称”] items=”集合” [varStatus=”存放当前对象的成员信息”] [begin=”集合的开始输出位置”] [end=”集合的结束输出位置”] [step=”每次增长的步长]>
标签体
</c:forEach>
例子:
<% String info[] = {“a”, “b”, “c”, “d”, “e”, “f”, “g”}; request.setAttribute(“info”,info); %> 例一: <c:forEach var =”s” items=”${info}” > ${s}、 </c:forEach> 例二: <c:forEach var =”s” items=”${info}” step=”2”> ${s}、 </c:forEach> 例三: <c:forEach var =”s” items=”${info}” begin=”1” end=”2”> ${s}、 </c:forEach>
以上代码输出结果为:
例一:a、b、c、d、e、f、h、
例二:a、c、e、h、
例三:b、c、
使用<c:forEach>输出时,不仅可以输出List,也可以输出Set,即只要是Collection接口的子接口或类都可以输出。<c:forEach>也可以输出Map集合,但是Map集合中的元素都是按照键值对来存储的,要想得到key和value,则需要通过元素提供的getKey()和getValue()方法。
例子:
<% Map m = new HaspMap(); m.put(“1”,”first”); m.put(“2”,”second”); request.setAttribute(“m”,m); %> <c:forEach var =”s” items=”${m}” > ${m.key} --> ${m.value} </c:forEach>
以上代码输出结果为:
1 --> first
2 --> second