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代码了,使得代码变得更简洁,可读性更高,这些标签和表达式就是为此创造的。


使用JSTL标准标签库

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


        
            javax
            javaee-api
            7.0
            provided
        
        
            javax.servlet
            jstl
            1.2
        
    

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

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • prefix="c":指定标签库的前缀,这个前缀可以自定义,但通常都会在使用core标签库时指定前缀为c
  • uri="http://java.sun.com/jstl/core":指定标签库的uri,它不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件


完成以上操作后,就可以使用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" %>








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



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

request session application page

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

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



${name}
${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"%>




Insert title here


    <%
        Student stu = new Student();
        request.setAttribute("student", stu);
    %>
    
    李四

    ${student.sname}


访问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"%>




Insert title here


    
    
    

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

lisi 123456abcdef

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


    

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



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


    
    

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

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




Insert title here


    

访问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"%>




Insert title here


    
    
    

访问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"%>




Insert title here




    <%=10/0 %>


${error}

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

java.lang.ArithmeticException: / by zero


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

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"%>




Insert title here






    



    



访问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"%>




Insert title here



    

    
        
            
        

        
            
        

        
            
        
    


访问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"%>




Insert title here



    <%
        List list=new ArrayList();
        Student xiaoming=new Student();
        xiaoming.setSname("小明");
        xiaoming.setEmail("[email protected]");
        xiaoming.setAge(15);
        list.add(xiaoming);

        Student xiaohong=new Student();
        xiaohong.setSname("小红");
        xiaohong.setEmail("[email protected]");
        xiaohong.setAge(14);
        list.add(xiaohong);

        Student lisi=new Student();
        lisi.setSname("李四");
        lisi.setEmail("[email protected]");
        lisi.setAge(16);
        list.add(lisi);

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

    
    
        



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

小明br/>[email protected]
15

小红br/>[email protected]
14

李四br/>[email protected]
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"%>




Insert title here


    
    
        

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

01
2
3
4
5
6
7
8
9
10

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


    

访问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"%>




Insert title here



    <%
        List list=new ArrayList();
        Student xiaoming=new Student();
        xiaoming.setSname("小明");
        xiaoming.setEmail("[email protected]");
        xiaoming.setAge(15);
        list.add(xiaoming);

        Student xiaohong=new Student();
        xiaohong.setSname("小红");
        xiaohong.setEmail("[email protected]");
        xiaohong.setAge(14);
        list.add(xiaohong);

        Student lisi=new Student();
        lisi.setSname("李四");
        lisi.setEmail("[email protected]");
        lisi.setAge(16);
        list.add(lisi);

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

    
        第一个元素
${variable.count}:
${variable.count}:
${variable.count}:

最后一个元素

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

第一个元素
1: 小明
1: [email protected]
1: 15
当前对象:org.zero01.test.Student@3f7a889e; 下标为:0

2: 小红
2: [email protected]
2: 14
当前对象:org.zero01.test.Student@7d8f4532; 下标为:1

3: 李四
3: [email protected]
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"%>




Insert title here



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

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

    
        
    
    

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

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


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"%>




Insert title here



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

    
    

    

访问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"%>




Insert title here



    <%  
        double d1 = 3.5;  
        double d2 = 4.4;   
        pageContext.setAttribute("d1", d1);  
        pageContext.setAttribute("d2", d2);  
    %>  
    

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

3.50
4.4

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