JSP 笔记 —— JSTL 标签库

一、关于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>


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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值