JSTL标签库
-
由于JavaBean无法获得运行环境,无法与JSP页面进行更加深层次的交互,所以在JSP中引入了自定义标记机制JSTL。标记库的处理类不但有JavaBean的功能,而且将JSP的环境信息传递到类的中间,从而彻底解决了Web组件开发中的表示和业务逻辑代码的分离。大大增强了代码的可读性、可维护性、可复用性。
-
在JSP中使用JSTL需要两个JAR文件
1)第一个文件是jstl.jar,它为JSTL标记库提供API类
2)第二个文件是standard.jar,它提供了标记库的实现类 。复制到WEB-INF目录下的lib <%@ taglib uri=“http://java.sun.com/jsp/jstl/core” prefix=“c” %>引入到JSP
-
JSTL标准标记库
功能范围 | 作用 | URL | 前缀 |
核心(core) | 一般用途处理的标记 | http://java.sun.com/jsp/jstl/core | c |
xml | 解析、选择、转换XML数据的标记 | http://java.sun.com/jsp/jstl/xml | x |
数据库(sql) | 访问关系型数据库的标记 | http://java.sun.com/jsp/jstl/sql | sql |
国际化(I18N) | 为国际化应用格式化数据的标记 | http://java.sun.com/jsp/jstl/fmt | fmt
|
函数(Functions) | 处理字符串和集合的标记 | http://java.sun.com/jsp/jstl/functions | fn |
4在JSP中通过taglib指令引用标记库
如:<%@ taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c”%>
5.SUN将JSTL核心标记分为四类
1)通用标记:<c:catch>和<c:out>
<c:catch var=”e”>
会抛出异常的代码
</c:catch>
如果标记之间抛出了异 常,异常的值会存在页面范围e中,否则e会被删除
<c:out value=”${number}”/>
如果value属性包括字符<、>、’、”或者& 标记会显示相关的字符码 如:”>”显示
成”>”.
如果属性的变量还没有初始化,可指定一个默认值通过第二个属性default设置 如:
<c:catch var=”${color}” default=”red”/>
-
变量支持标记:<c:set>和<c:remove>
使用<c:set>设置变量需要用该标记的var属性指定变量的名称,然后用标记的
Value属性或标记体来设置变量的值 如下两个:
<c:set var=”num” value=”${4*4}”/> 和
<c:set var=”num”>
${8*2}
</c:set>
以上两种方式都将num变量的值设置为16。第二种方法允许我们在<c:set>标记内插
入 标记操作。如:
<c:set var=”num”>
<c:out value=“${8*2}”/>
</c:set>
设置JavaBean对象customer1的zipcode属性
<c:set target=”customer1” property=”zipcode”>
55501
</c:set>
或者
<c:set target=”customer1” property=”zipcode” value=”55501”>
使用<c:remove>标记从session作用域删除num变量
<c:remove var=”num” scope=”session”/>
它与<c:set>不同的是 <c:remove>标记不能用于JavaBean和Map对象
-
流程控制标记:<c:if>和<c:choose>、<c:forEach>和<c:cforTokens>
<c:if>和<c:choose>的功能与java中的if和switch语句基本相同,不同的是核心
标记库中没有else标记
代码只在显示x=9时才显示x的值
<c:if text=”${x==’9’}”>
${x}
</c:if>
<c:choose>
<c:when text=”${color==’white’}”>
Light!
</c:when>
<c:when text=”${color==black}”>
Dark!
</c:when>
<c:otherwise>
Color!
</c:otherwise>
</c:choose>
它与java的switch语句一样,在JSTL的<c:choose>标记中,当没满足条件时,使用可
选<c:otherwise>标记作为默认选项
循环: <c:forEach>和<c:forTokens>
如下,下面的jps从0~30计数,每隔三个数字在页面:
<%@ taglib url=”http://java.sun.com/jsp/jstl/core” prefix=”c” %>
<html><body>
<c:forEach var=”x” begin=”0” end=”30” step=”3”>
${x}
</c:forEach>
</body></html>
<c:forEach>标记也可以用于对java集合对象(列如 Vector、List、Map)的元素执行循环操
作
<c:forEach var=”num” item=”${numArray}”>
<c:set var=”num” value=”100”/>
</c:forEach>
</body></html>
<c:forTokens>标记用于循环处理字符串中由分隔符分隔的各成员
<c:forTokens items=”..” delims=”..”
[var=”..”] [varStatus=”..”] [begin=”begin=”..”] [end=”..”] [step=”..”]>
内容体
</c:forTokens>
其中 items 属性是要处理的用分隔符分隔的字符串对象,而delims指定分隔符
列如,下面的代码创建了一个表格,并且使用numlist字符串的内容填充单元格
<%@taglib uri=”http://java.sun.com/jsp/jstl/core” prefix=”c”%>
<%@ page contentType=”text/html;charset=gb2312” %>
<html><body>
<c:set var=”numList” value=”one,two,three,four,five,six”/>
forTokens标记的输出:<p>
<table border=”1”>
<c:forTokens var=”num” items=”${numList}” delims=”,”>
<tr><td>${num}</td></tr>
<c:forTokens>
</table>
</body></html>
4)URL处理标记:<c:url>和<c:import>、<c:iredirect>
<c:url>,重写URL并对其参数编码
<c:url value=”/page.html” var=”pagename”/>
在<c:url>标记的内容体中使用<c:param>标记,还可以为URL添加参数 如:
<c:url value=”/page.html” var=”pagename”>
<c;param name=”param1” value=”${2*2}”/>
<c;param name=”param1” value=”${3*3}”/>
</c:url>
访问servelet容器外的内容,就必须使用<c:import>标记
<c:import url=”/content.html var=”newstuff” scope=”session”>
<c:param name=”par1” value=”vall1”/>
<c:param name=”par2” value=”vall2”/>
</c:import>
<c:redirect>标记功能与HttpServletResponse的sendRedirect()方法相同,发送一个重定向响应到客户端,并告诉客户端去访问由其url属性指定的URL
可以在<c:redirect>标记中使用context属性指定的url上下文,使用<:param>标记添加参数 如
<c:redirect url=”/content.html”>
<c:param name=”par1” value=”val1”/>
<c:param name=”par2” value=”val2”/>
</c:redirect>
EL表达式
-
JSP页面中显示结果 jsp:useBean和jsp:getProperty两个元素冗长而笨拙 ,<jsp:getProperty>的property属性只能访问Bean的属性,而不能访问嵌套的属性,所以使用JSP EL(即表达式语言Expression Language)
-
EL表达式和JSP脚本表达式
EL表达式总是放在大括号里,而且前面有一个美元符前缀 ${person.name}
与JSP脚本表达式比较
室外温度是 <%= temp %> 度。
如果使用EL,则是:
室外温度是${temp}度
-
在EL表达式中使用隐式变量
类别 | 隐式变量名 | 描述 |
JSP | pageContext | 用来访问JSP的隐式对象 |
作用域 | pageScope | 与page作用域属性的名称和值相关联的 Map 类 |
requestScope | 与request作用域属性的名称和值相关联的 Map 类 | |
sessionScope | 与session作用域属性的名称和值相关联的 Map 类 | |
applicationScope | 与application作用域属性的名称和值相关联的 Map 类 | |
请求参数 | param | 包含请求参数字符串的Map 类 |
paramValues | 包含请求参数字符串数组( String[])的 Map 类 | |
请求头 | header | 包含请求头字符串的 Map 类 |
headerValues | 包含请求头字符串数组(String[])的 Map 类 | |
Cookie | cookie | 按名称存储请求附带的 cookie 的 Map 类 |
-
EL运算符
EL运算符可以分为四类
属性和集合访问运算符
算术运算符
关系运算符
逻辑运算符
访问属性和集合的EL运算符:
a.b:返回a的属性b的值。
a[b]:返回a的键或索引为b的值
b是一个字符串的话,这两个运算符在EL中的操作方式是可以互换
a[“b”]、a[‘b’]
数组是通过整数访问的,运算符“[]”不能被替换为运算符“.”