JSP 笔记 —— JSTL 标签库

来源:互联网 发布:网络语黑洞的意思 编辑:程序博客网 时间:2024/05/20 09:22

一、关于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/corefmt 库:http://java.sun.com/jsp/jstl/fmtsql 库:http://java.sun.com/jsp/jstl/sqlxml 库:http://java.sun.com/jsp/jstl/xmlfunctions库: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>


3、out 标签:

<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 标签:

暂不了解


9、import 与 redirect 标签:

暂不了解


三、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"-->
















0 0