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" %>
- prefix="c":指定标签库的前缀,这个前缀可以自定义,但通常都会在使用core标签库时指定前缀为c
- uri="http://java.sun.com/jstl/core":指定标签库的uri,它不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件
<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会对标签的尖括号进行转换,将 < 转换成 <
,将 > 转换成 >
。如下:
<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 ,输出结果如下:
<%@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 ,输出结果如下:
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 ,输出结果如下:
<%@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; 下标为:02: 小红
2: 14565@xx.com
2: 14
当前对象:org.zero01.test.Student@7d8f4532; 下标为:13: 李四
3: 78984@xx.com
3: 16
当前对象:org.zero01.test.Student@4f12267a; 下标为:2
最后一个元素
<%@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 ,输出结果如下:
9.fmt标签库,fmt是一个用来格式化数据的标签库,例如该标签库最常用的 f:formatDate 标签可以用来格式化日期格式,导入这个标签库的语句:
<%@ taglib prefix="f" uri="http://java.sun.com/jsp/jstl/fmt"%>
<%@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 ,输出结果如下:
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 ,输出结果如下:
本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/2053618,如需转载请自行联系原作者