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; 下标为:02: 小红
2: [email protected]
2: 14
当前对象:org.zero01.test.Student@7d8f4532; 下标为:13: 李四
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内置标签就是为了实现这个效果而创造的。