一、关于JSTL 标签库
JSTL,JSP 标准标签库,由Apache 的Jakarta 小组负责维护,所以在apache的下载发布资源(distribution)时需进入jakarta 目录下载。
JSTL 的作用?取代在JSP 页面嵌入java 代码的方式,提高程序可维护性。
JSTL 与EL 的区别?EL 只是用于访问数据用户数据与bean数据的,JSTL 除了可访问,还可设置。
JSTL 标签库由4个标签库组成:core、fmt、sql、xml、functions 标签库。
一个标签库由两部分组成:jar 文件包、tld文件(tag library description)。
使用JSTL 需要的对应的 jar 包及各标签库的tld文件定义位置(即taglib指令的uri属性值):
jar 包:jstl.jar 、standard.jar
tld 定义位置:
core库:http://java.sun.com/jsp/jstl/core
fmt 库:http://java.sun.com/jsp/jstl/fmt
sql 库:http://java.sun.com/jsp/jstl/sql
xml 库:http://java.sun.com/jsp/jstl/xml
functions库:http://java.sun.com/jsp/jstl/functions
二、引用JSTL 标签库的配置
主要是对uri 属性。
方式一:标准定义
1、导入jstl.jar、standard.jar,发布时也需要包含进发布路径。
2、JSP 页面中使用:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="任意名字" %>
1、导入jstl.jar、standard.jar,同上。此外,还需下载使用标签库的tld 文件,假设core 库的描述文件c.tld放在WEB-INF/taglib目录下。
2、在web.xml 中配置标签库。
<jsp-config>
<taglib>
<taglib-uri>myTaglib</taglib-uri>
<taglib-location>WEB-INF/taglib/c.tld</taglib-location>
</taglib>
</jsp-config>
3、JSP 页面中使用:
<%@ taglib uri="myTaglib" prefix="任意名字" %>
三、JSTL 核心标签库core
核心标签的功能实现定义在standard.jar 包的org.apache.taglibs.standard.tag.common.core 与 org.apache.taglibs.standard.tag.rt.core 包下。
核心标签分为四类:表达式标签(out、set、remove、catch)、URL相关标签(import、redirect、url、param)、流程控制标签(if、when、choose、otherwise)、循环标签(forEach、forTokens,其中forTokens 可指定分隔符后遍历子串)
标签如下(取标签库前缀prefix 为core):
1、catch标签:
<core:catch var="aException">
<core:out value="request" ></core:out>
<core:set></core:set><!--此处将发生异常,因为没有指定set 标签的必须属性-->
</core:catch>
<core:if test="${aException != null }">
<core:out value="${pageScope.aException }"></core:out>
</core:if>
所有属性说明:var,非必须的。用于指定可能发生的异常的名称,即以var指定的值为键,以发生的异常为值,存储在pageContext 中。
打开c:catch 标签的源代码(org.apache.taglibs.standard.tag.common.core.CatchTag),其中一段代码如下:
public void doCatch(Throwable t) {
if (var != null)
pageContext.setAttribute(var, t, PageContext.PAGE_SCOPE);
caught = true;
}
可见是以键值对形式保存了异常。
2、if 标签:
<core:if test="判断条件,必须" var="test的boolean结果,可选" scope="var的范围">
条件体
</core:if>
<core:out value="输出的内容,必须"></core:out>
4、when、choose 与 otherwise 标签:choose只能作为when与otherwise的父标签,且内部不能包含之外的其它标签,只能有一个otherwise
<core:choose>
<core:when test="">
条件体1
</core:when>
<core:when test="">
条件体N
</core:when>
<core:otherwise>
只能包含一个otherwise
</core:otherwise>
</core:when>
相当于 switch 结构,otherwise为默认执行。
5、set 标签:属性分为两组
<core:set property="被设置在target中的属性名" scope="var的范围"
target="具有setter方法的JavaBean对象或java.util.Map对象" value="表达式"
var="存储value表达式结果的变量"></core:set>
属性都非必须的,但有的属性之间存在依赖关系。set 标签既可设置值,也可产生变量var。实例:
var、scope、value 为一组用于设置变量;
target、property、value 为一组用于设置bean 的属性值;
<jsp:useBean id="wjb" class="com.milan.pojo.Person" ></jsp:useBean>
<%--设置新的变量 --%>
<core:set var="userName" scope="page" value="weijianbao"></core:set>
<%--设置bean的属性值 --%>
<core:set target="${wjb}" property="name" value="zhengyingxia"></core:set>
<core:out value="${userName}"></core:out>
<core:out value="${wjb.name}"></core:out>
能正确输出,
注意target 是通过EL 赋值的,且操作的bean 只能通过jsp:useBean 标签获得,而不能通过new 创建,因为EL 无法访问到new 创建的对象。此外,应保证property 及其setter方法存在。此外target 还可指定为java.util.Map 的对象:
<%
Map<String,String> user=new HashMap<String,String>();
user.put("name", "郑");
//session.setAttribute("user", user);
%>
<core:out value="${session.user.name} "></core:out><%--无法访问 --%>
<core:out value="sessionScope.user.name:${sessionScope.user.name} "></core:out>
<core:set target="${user}" property="name" value="郑成功"></core:set>
<core:out value="user.name:${user.name}"></core:out>
注:虽然set是在第二个与第三个out标签之间的,但两个标签都显示设置后的值。
6、remove 标签:
<%-- <core:remove var="移除的变量名" scope="指定范围"/> --%>
<core:set var="aVar" scope="session" value="varValue"></core:set>
<core:out value="${aVar}"></core:out>
<core:out value="${sessionScope.aVar} "></core:out>
<core:remove var="aVar" scope="session"/>
<core:out value="${aVar}"></core:out>
注:通过jstl 标签设置的变量,既可通过EL 的范围对象(如sessionScope),也可直接访问,上面的前两个out 标签都能显示变量值。
7、foreach 标签:
<core:forEach items="遍历的集合" begin="开始索引" end="结束索引" step="步长,默认1"
var="遍历的集合当前item" varStatus="迭代状态,有多个可选值" >
<core:out value=""></core:out>
</core:forEach>
8、url、param、forTokens 标签:
暂不了解
暂不了解
三、sql 标签库
包含标签:
sql:transaction
sql:query
sql:update
sql:param
sql:dateParam
sql:setDataSource
四、fmt 标签库
五、functions 标签库
六、xml 标签库
七、JSTL 与 EL 的结合使用
1、关于EL 访问数据的顺序
属性的默认访问顺序为:page——>request——>session——>application,即从范围由小到大。
EL 提供了pageScope、requestScope、sessionScope、applicationScope 四个对象封装了page 、request、session、application范围内的属性,这四个对象都是Map 类型。
大前提:EL 只能访问 JavaBean 与 内置对象中的数据,在jsp的java 片段中new 的JavaBean 类的对象,不算JavaBean,所以无法通过EL 访问到。测试:
<%!String var="pageVar"; %>
<%
application.setAttribute("var", "applicationScope");
session.setAttribute("var", "sessionScope");
request.setAttribute("var", "requestScope");
%>
<core:out value="var:${var}"></core:out><br><!--重点:将显示requestScope,因为在page中查找不到,所以先查到了request中的var属性-->
<core:out value="applicationScope.var:${applicationScope.var}"><!--显示applicationScope-->
</core:out><br>
<core:out value="sessionScope.var:${sessionScope.var}"><!--显示sessionScope-->
</core:out><br>
<core:out value="requestScope.var:${requestScope.var}"><!--显示requestScope-->
</core:out><br>
<core:out value="pageScope.var:${pageScope.var}"><!--重点:此处无显示,因为page 范围中不存在var ,page内置对象也没有设置属性的方法-->
</core:out><br>
注:EL 的内置对象中,除了pageContext 对象是ServletContext 类型(用于获取其它内置对象),其它的都是java.util.Map 类型。
2、JSTL 与 EL 结合使用
JSTL 只有与EL 结合才能发挥强大功能,JSTL 的标签中的属性值都是引号包围的,即是是对象的赋值,如set 标签的 target 标签。所以,进行对象的赋值只能通过结合EL 实现,如:
<c:set target="${beanId}" property="attrName" value="..."/>
此外,算术与逻辑运算也都是在EL 中完成,如:
<c:out value="${3+2}-5"/><!--显示"5-5"-->