JSTL标准标签库(上)

  1. 云栖社区>
  2. 博客>
  3. 正文

JSTL标准标签库(上)

技术小阿哥 2017-11-28 20:48:00 浏览684
展开阅读全文

JSTL标准标签库简介:

JSTL(JavaServer Pages Standard Tag Library,JSP标准标签库)是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的。jstl是apache对EL表达式的扩展(也就是说JSTL依赖EL),JSTL是标签语言,所以JSTL标签使用以来非常方便,它与JSP动作标签一样,只不过它不是JSP内置的标签,需要我们自己导包,以及指定标签库而已。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上,如tomcat 4.x。在JSP 2.0中也是作为标准支持的。

JSTL 1.0 发布于 2002 年 6 月,由四个定制标记库(core、format、xml 和 sql)和一对通用标记库验证器(ScriptFreeTLV 和 PermittedTaglibsTLV)组成。core 标记库提供了定制操作,通过限制了作用域的变量管理数据,以及执行页面内容的迭代和条件操作。它还提供了用来生成和操作 URL 的标记。顾名思义,format 标记库定义了用来格式化数据(尤其是数字和日期)的操作。它还支持使用本地化资源束进行 JSP 页面的国际化。xml 库包含一些标记,这些标记用来操作通过 XML 表示的数据,而 sql 库定义了用来查询关系数据库的操作。

如果要使用JSTL,则必须将jstl.jar和 standard.jar文件放到classpath中,如果你还需要使用XML processing及Database access (SQL)标签,还要将相关JAR文件放到classpath中,这些JAR文件全部存在于下载回来的zip文件中。

使用JSTL标签+EL表达式+少许jsp内置标签,在开发jsp时就几乎看不到实质上的java代码了,使得代码变得更简洁,可读性更高,这些标签和表达式就是为此创造的。

<br>

使用JSTL标准标签库

1.maven工程配置以下依赖:

<dependencies>
        <dependency>
            <groupId>javax</groupId>
            <artifactId>javaee-api</artifactId>
            <version>7.0</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>javax.servlet</groupId>
            <artifactId>jstl</artifactId>
            <version>1.2</version>
        </dependency>
    </dependencies>

2.需要使用taglib指令在JSP页面中导入JSTL的标签库:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<br>

完成以上操作后,就可以使用JSTL标签了。
1.set标签,set标签是用于给对象属性设置值的:

index.jsp代码:
<%@ page language="java" contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
<html>
<body>

<c:set var="name" value="request" scope="request"></c:set>
<c:set var="name" value="session" scope="session"></c:set>
<c:set var="name" value="application" scope="application"></c:set>
<c:set var="name" value="page" scope="page"></c:set>

${requestScope.name}
${sessionScope.name}
${applicationScope.name}
${pageScope.name}

</body>
</html>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

request session application page

在jsp的内置对象中,set标签只能设置这四个对象的属性值。

可以结合EL表达式进行赋值:

<c:set var="name" value="lisi" scope="request"></c:set>
<c:set var="name1" value="${name}+123" scope="request"></c:set>
${name}<br>
${name1}

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

lisi
lisi+123

除了可以设置内置对象的属性值外,可以设置实例对象中的属性值,示例:
Student代码如下:

package org.zero01.test;
public class Student {

    private String sname;

    public String getSname() {
        return sname;
    }

    public void setSname(String sname) {
        this.sname = sname;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }

    private String email;
    private int age;

}

index.jsp代码如下:

<%@page import="org.zero01.test.Student"%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
    <%
        Student stu = new Student();
        request.setAttribute("student", stu);
    %>
    <!-- target的值是目标对象,property的值是目标对象的属性,标签包含的就是要设置给该属性的值 -->
    <c:set target="${requestScope.student}" property="sname">李四</c:set>

    ${student.sname}

</body>
</html>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

李四

2.out标签,显而易见,out是用来输出数据的:

<%@page import="org.zero01.test.Student"%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
    <c:set var="name" value="lisi" scope="request"></c:set>
    <c:out value="${name}"></c:out>
    <c:out value="123456abcdef"></c:out>
</body>
</html>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

lisi 123456abcdef

out标签主要的用途是过滤标记的,默认out会对标签的尖括号进行转换,将 < 转换成 &lt; ,将 > 转换成 &gt; 。如下:

<c:set var="name" value="<hr><hr>" scope="request"></c:set>
    <c:out value="${name}"></c:out>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

<hr><hr>

如果不需要进行转换,把out标签中的escapeXml属性值设置为false即可,但是建议不要设置为false。

<c:set var="name" value="<hr>" scope="request"></c:set>
    <c:set var="name" value="${name=='<hr>' ? '<hr>' : name}" scope="request"></c:set>
    <c:out value="${requestScope.name}" escapeXml="false"></c:out>

out标签中有一个default属性,可以设置一个默认输出的值,如果没有输出的数据,就会默认输出default中定义的内容:

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
    <c:out value="${requestScope.name}" default="lisi" ></c:out>
</body>
</html>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

lisi

3.remove标签,此标签用于删除对象中的属性,和removeAttribute方法的功能是一样的:

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
    <c:set var="name" value="lisi" scope="request"></c:set>
    <c:remove var="name" scope="request" />
    <c:out value="${name}" default="该属性不存在!"></c:out>
</body>
</html>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

该属性不存在!

4.catch标签,这个标签是用于捕获异常的,把可能发生异常的代码写在catch标签内,并且设置var属性的值,当发生异常时,可以在var属性值中得知异常的名称:

<%@page import="org.zero01.test.Student"%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>

<c:catch var="error">
    <%=10/0 %>
</c:catch>

${error}
</body>
</html>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

java.lang.ArithmeticException: / by zero

<br>

以下的标签是最为常用的:

5.if标签,和if判断语句是一样的,所以很常用,判断条件写在test属性中,也就是说test属性的值只能是true或false,我们可以通过EL表达式来产生这个值:

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>

<c:set var="name" value="zero" scope="request"></c:set>
<!-- 判断条件要写在EL表达式里 -->
<c:if test="${name == 'zero'}">
    <c:out value="${name}"></c:out>
</c:if>

<c:if test="${name eq 'zero'}">
    <c:out value="${name}"></c:out>
</c:if>

</body>
</html>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

zero zero

6.choose标签,这是类似于switch的一种可以实现多个条件判断的标签,它需要配合 c:when 和 c:otherwise 使用,每个 c:when 都是一个判断条件,类似于case。如果没有匹配到相应的条件就会执行 c:otherwise 里的代码,类似于default,如下:

<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>

    <c:set var="name" value="zero" scope="request"></c:set>

    <c:choose>
        <c:when test="${name == null}">
            <c:out value="属性值为空!"></c:out>
        </c:when>

        <c:when test="${name == 'zero'}">
            <c:out value="${name}"></c:out>
        </c:when>

        <c:otherwise>
            <c:out value="没有匹配到相应的条件!"></c:out>
        </c:otherwise>
    </c:choose>

</body>
</html>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

zero

7.forEach标签,看名字也就知道了,这和平时java代码中的for each是一样的,不过这个标签还可以用出 for(int i=0;i<=10;i++){} 这种语句的效果:
1.遍历一个集合(for each):

<%@page import="org.zero01.test.Student"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>

    <%
        List<Student> list=new ArrayList();
        Student xiaoming=new Student();
        xiaoming.setSname("小明");
        xiaoming.setEmail("12345@xx.com");
        xiaoming.setAge(15);
        list.add(xiaoming);

        Student xiaohong=new Student();
        xiaohong.setSname("小红");
        xiaohong.setEmail("14565@xx.com");
        xiaohong.setAge(14);
        list.add(xiaohong);

        Student lisi=new Student();
        lisi.setSname("李四");
        lisi.setEmail("78984@xx.com");
        lisi.setAge(16);
        list.add(lisi);

        request.setAttribute("list", list);
    %>

    <!-- items的值是需要被遍历的集合,var的值是被遍历出来的对象 -->
    <c:forEach var="student" items="${list}" >
        <c:out value="${student.sname}"></c:out><br>
        <c:out value="${student.email}"></c:out><br>
        <c:out value="${student.age}"></c:out><br><br>
    </c:forEach>

</body>
</html>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

小明br/>12345@xx.com
15

小红br/>14565@xx.com
14

李四br/>78984@xx.com
16

2.类似于普通for循环的用法:

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>
    <!-- var的值是循环的变量,begin是起始值,end是循环的结束条件 -->
    <c:forEach var="i" begin="0" end="10" >
        <c:out value="${i}"></c:out><br>
    </c:forEach>
    <!--
        所以以上这段类似于:
        for(int i=0;i<=10;i++){
            System.out.println(i);
        }
    -->
</body>
</html>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

01
2
3
4
5
6
7
8
9
10

3.forEach标签中有一个step属性,这个属性用于设置每一次循环的步长,例如我要输出2-20之间的偶数:

<c:forEach var="i" begin="2" end="20" step="2" >
    <c:out value="${i}"></c:out><br>
</c:forEach>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

2
4
6
8
10
12
14
16
18
20

4.forEach标签中还有一个varStatus属性,这个属性的值代表循环状态的变量名称,而且这个变量名称还有以下几个属性:
count:int类型,当前以遍历元素的个数;
index:int类型,当前元素的下标;
first:boolean类型,是否为第一个元素;
last:boolean类型,是否为最后一个元素;
current:Object类型,表示当前对象。

示例:

<%@page import="org.zero01.test.Student"%>
<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>

    <%
        List<Student> list=new ArrayList();
        Student xiaoming=new Student();
        xiaoming.setSname("小明");
        xiaoming.setEmail("12345@xx.com");
        xiaoming.setAge(15);
        list.add(xiaoming);

        Student xiaohong=new Student();
        xiaohong.setSname("小红");
        xiaohong.setEmail("14565@xx.com");
        xiaohong.setAge(14);
        list.add(xiaohong);

        Student lisi=new Student();
        lisi.setSname("李四");
        lisi.setEmail("78984@xx.com");
        lisi.setAge(16);
        list.add(lisi);

        request.setAttribute("list", list);
    %>

    <c:forEach items="${list}" var="student" varStatus="variable">
        <c:if test="${variable.first}">第一个元素</c:if><br>
        ${variable.count}: <c:out value="${student.sname}"></c:out><br>
        ${variable.count}: <c:out value="${student.email}"></c:out><br>
        ${variable.count}: <c:out value="${student.age}"></c:out><br>
        <c:out value="当前对象:${variable.current}; 下标为:${variable.index}"></c:out><br>
        <c:if test="${variable.last}">最后一个元素</c:if><br>
    </c:forEach>

</body>
</html>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

第一个元素
1: 小明
1: 12345@xx.com
1: 15
当前对象:org.zero01.test.Student@3f7a889e; 下标为:0

2: 小红
2: 14565@xx.com
2: 14
当前对象:org.zero01.test.Student@7d8f4532; 下标为:1

3: 李四
3: 78984@xx.com
3: 16
当前对象:org.zero01.test.Student@4f12267a; 下标为:2
最后一个元素

8.forTokens标签,这个标签也是循环的作用,而且属性基本上和forEach标签一样,只不过forTokens标签多了一个delims属性,这个属性用于定义分割符,将分割后的元素进行遍历。在这个forTokens标签中delims属性和items属性都是必须有的,示例:

<%@page import="java.util.ArrayList"%>
<%@page import="java.util.List"%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>

    <%
        String s="你好,Hello,Bonjour,Hallo,Ciao,こんにちは,Γειάσου,Hola";

        request.setAttribute("s", s);
    %>

    <c:forTokens items="${s}" delims="," var="variable" >
        <c:out value="${variable}"></c:out>
    </c:forTokens>
    <!--
        以上这段等价于:
        String s="你好,Hello,Bonjour,Hallo,Ciao,こんにちは,Γειάσου,Hola";
        String[] str=s.split(",");
        for (String string : str) {
            System.out.println(string);
        }
    -->
</body>
</html>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

你好 Hello Bonjour Hallo Ciao こんにちは Γειάσου Hola

<br>

9.fmt标签库,fmt是一个用来格式化数据的标签库,例如该标签库最常用的 f:formatDate 标签可以用来格式化日期格式,导入这个标签库的语句:

<%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt"%>

f:formatDate 标签使用示例:

 <%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>

    <%
        Date date=new Date(); 
        request.setAttribute("date", date);
    %>

    <!-- value属性的值需要是一个日期对象,pattern属性则是定义日期格式 -->
    <f:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss EEE" />

    <!--以上这段等价于:
        SimpleDateFormat dateFormat=new SimpleDateFormat("yyyy-MM-dd HH:mm:ss EEE");
        System.out.println(dateFormat.format(new Date()));
    -->
</body>
</html>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

2017-12-21 10:55:10 星期四

f:formatNumber 标签可以用来格式化数字,示例:

<%@page import="java.util.Date"%>
<%@ page language="java" contentType="text/html; charset=utf-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<title>Insert title here</title>
</head>
<body>

    <%  
        double d1 = 3.5;  
        double d2 = 4.4;   
        pageContext.setAttribute("d1", d1);  
        pageContext.setAttribute("d2", d2);  
    %>  
    <f:formatNumber value="${d1}" pattern="0.00"/><br/>  
    <f:formatNumber value="${d2}" pattern="#.##"/>  

</body>
</html>

访问http://localhost:8080/JSTL-test/index.jsp ,输出结果如下:

3.50
4.4

常用的JSTL标签就介绍到这,到目前为止,使用JSTL+EL+少量的jsp内置标签后,在jsp开发中就基本看不到实质上的java代码了。整个画风也整洁了很多,代码也减少了,JSTL、EL、jsp内置标签就是为了实现这个效果而创造的。




本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/2053618,如需转载请自行联系原作者

网友评论

登录后评论
0/500
评论
技术小阿哥
+ 关注