JavaServer Pages Standard Tag Library为jsp标准标签库,jsp规范一部分。sun定义规范即接口。apache对规范进行了实现,开发时导入其jar包即可,但tomcat有自己的jar包支持,不同的tomcat版本也有差异,使用时需要注意。

  使用要求:容器必须支持Servlet 2.4 且JSP 2.0 以上版本,下载地址:http://tomcat.apache.org/taglibs/standard/。目前主流开发中,使用比较多的就是核心标签库(<c:out>),国际化标签库(<fmt:formatDate>)以及函数标签库(<fn:indexOf("adhsjakh","s")>),函数标签库之前已经介绍过,数据库标签与XML标签很少用到,所以本篇主要是核心库和国际化库常用的内容,最后提一下自定义标签库的思路。

=============================================================>

  核心标签库在导入时存在1.0和1.1两个版本,但在taglib引用时区别就只是路径上有区别,所以特别注意。

  常用核心库的内容,首先是一个域操作的例子:

...
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page isELIgnored="false"%>
</head>
<body>
    <c:out value="hello,This is jstl-c test!"></c:out>
    <br>
    <c:out value="${empty user}"></c:out>
    <br>
    <c:out value="<a>html编码显示</a>" escapeXml="true"></c:out>
    ====>
    <c:out value="<a>html编码转义后显示</a>" escapeXml="false"></c:out>
    <br>
    <hr/>
    <c:set value="changchun" var="place" scope="request"></c:set>
    c:set设置后取值:${requestScope.place }
    <c:remove var="place" scope="request"/>
    <br>
    c:remove后再取值:${requestScope.place }
</body>
...

页面展示:

hello,This is jstl-c test! 
true 
<a>html编码显示</a> ====> html编码转义后显示 
c:set设置后取值:changchun 
c:remove后再取值:

  逻辑控制操作的例子:

...
<title>Insert title here</title>
<%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page isELIgnored="false"%>
</head>
<body>
    <c:set var="username" value="changchun" scope="session"></c:set>
    <c:if test="${not empty sessionScope.username }">
        <b>not empty</b>
    </c:if>
    <c:if test="${empty sessionScope.username }">
        <b>empty</b>
    </c:if>
    <br>
    <c:choose>
        <c:when test="${not empty sessionScope.username }">
            <b>choose中显示有值!</b>
            <br>
        </c:when>
    </c:choose>
    <c:choose>
        <c:when test="${param.id<=10 }">
            param.id<=10
        </c:when>
        <c:when test="${param.id>100 }">
            param.id>100
        </c:when>
        <c:otherwise>
            <b>所输入的数值不在关注范围内</b>
        </c:otherwise>
    </c:choose>
</body>
...

页面展示:

http://localhost:8080/RFP02W/views/cTestLogic.jsp?id=18
not empty 
choose中显示有值! 
所输入的数值不在关注范围内

   另一个比较常用的就是url处理,对于复杂的地址,可以用<c:url>进行简化:

...
    <h2>Hello World!</h2>
    <a href="${pageContext.request.contextPath}/views/elTest.jsp">elTest</a>
    <a href="${pageContext.request.contextPath}/views/cTest.jsp">cTest</a>
    <a href="${pageContext.request.contextPath}/views/cTestLogic.jsp">cTestLogic</a>
    
    <c:url value="/views/elTest.jsp" var="elTest" scope="session"></c:url>
    <a href="${sessionScope.elTest }">try elTest again!</a>
...

简化后的地址与之前的效果一致,如果需要在其后加参数,直接在里面引用<c:param>,用name与value进行赋值。

  <c:foreach>可以对字符串,数组,集合实现遍历,使用得当可以减少脚本的篇幅,使代码易于理解。此处略过。

=================================================================>

  最后fmt标签库简单举个例子:

<body>
    <%
        pageContext.setAttribute("date", new Date());
    %>
    <fmt:formatDate value="${date}" pattern="yyyy-MM-dd hh:mm:ss:SSS"/><br>
    <fmt:formatNumber value="3.1415926"></fmt:formatNumber><br>
    <fmt:formatNumber value="3.1415926" pattern="#.##"></fmt:formatNumber><br>
    <fmt:formatNumber value="3" pattern="#.##"></fmt:formatNumber><br>
    <fmt:formatNumber value="3" pattern="0.00"></fmt:formatNumber><br>
</body>

页面效果:

2016-10-12 01:16:36:364
3.142
3.14
3
3.00

=================================================================>

  自定义标签的作用无非是为了减少jsp页面中冗余的脚本代码,对于高复用的脚本块来说,自定义标签可以代替脚本块。但目前的通用做法是要将展示与逻辑进行分离,逻辑的部分会放到servlet中进行更灵活的处理,所以这里简要介绍思路,具体要用时可以查阅资料。

开发步骤
1.编写实现类
2.编写配置文件,确定使用时那个实现类
3.在jsp中引用配置文件,使用标签
实现类
要求:实现接口 SimpleTag,继承类 SimpleTagSupport

传统标签:实现接口Tag,继承类TagSupport,功能更强大,但实现繁琐。
简单标签:接口SimpleTag,继承SimpleTagSupport ,在jsp2.0之后提供
提供标记接口父类:JspTag
配置文件
tld文件 tld是taglib description 的缩写 , 标签类库的描述文件,是jsp解析程序可以通过配置文件获得相应的实现类
tld文件基于xml文件,扩展名为tld,内容xml
tld位置:
1.WEB-INF目录,及子目录,但 classes、lib目录除外
2.WEB-INF/lib/*.jar/META-INF/目录下,jar文件内
简单标签生命周期:
1. 创建标签实例
2. 设置PageContext,执行setJspContext()
3. 每一个属性setter方法,执行 setPattern()
4. 如果有标签体,执行setJspBody()
5. 执行doTag()
执行标签体
this.getJspBody().invoke(null) ; 输出到浏览器。
在doTag()方法体中,throw SkipPageException() 异常 可以阻止当前标签之后内容的输出。

posted on 2016-10-12 13:28  长江同学  阅读(220)  评论(0编辑  收藏  举报