在JSP页面中使用标签库代替传统Java片段语文来实现页面显示逻辑已经不是新技术了,但是自定义的标签容易造成重复定义和非标准的实现,所以JSTL(JSP Standard Tag Library,JSP标准标签库)诞生了。JSTL是一个不断完善的开放源代码的JSP标签库,是由apache的jakarta小组来维护的(标准是SUN制定,apache实现的,SUN收录了apache的实现)。JSTL只能运行在支持JSP1.2和Servlet2.3规范的容器上。
Version | JSTL version | Requirements |
---|---|---|
Standard 1.2.3 | JSTL 1.2 | Servlet 2.5, JavaServer Pages 2.1 |
Standard 1.1 | JSTL 1.1 | Servlet 2.4, JavaServer Pages 2.0 |
Standard 1.0 | JSTL 1.0 | Servlet 2.3, JavaServer Pages 1.2 |
Sun 发布的标准 JSTL1.1 标签库有以下几个标签:
- 核心标签库:包含 Web 应用的常见工作,比如:循环、表达式赋值、基本输入输出等。
- 格式化标签库:用来格式化显示数据的工作,比如:对不同区域的日期格式化等。
- 数据库标签库:可以做访问数据库的工作。
- XML 标签库:用来访问 XML 文件的工作,这是 JSTL 标签库的一个特点。
- 函数标签库:用来读取已经定义的某个函数。
使用JSTL的步骤:
- 在项目中引入jstl的相关jar包,确保jar存在:jstl.jar、standard。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>1.1.2</version>
</dependency>
- 在需要使用标签的JSP页面上使用taglib指令引入标签库。
- 在需要使用标签的位置直接使用标签库。
核心标签:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="java.util.*"%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSTL_CORE</title>
</head>
<body>
<%
Emp e1 = new Emp();
e1.setEmpno("222");
e1.setEname("KING");
Emp e2 = new Emp();
e2.setEmpno("333");
pageContext.setAttribute("e1",e1);
pageContext.setAttribute("e2",e2);
List<Emp> empList = new ArrayList<Emp>();
empList.add(e1);
empList.add(e2);
request.setAttribute("empList",empList);
%>
<!-- ****显示数据【c:out】****
value="要显示的内容,必填项"
default="value为null时要输出的默认值,默认为主体内容"
escapeXml="是否忽略XML特殊字符,默认为true"
-->
<c:out value="<test/>"/>
、
<c:out value="<test/>" escapeXml="false"/> <!-- 这里会把<test/>当标签处理 -->
、
<c:out value="${e1.ename }"/>
、
<c:out value="${e2.ename }" default="无名氏"/>
<!-- 输出:
<test/> 、 、 KING 、 无名氏
-->
<hr>
<!-- ****保存数据【c:set】****
var="存储信息的变更"
value="要存储的值,默认为标签中的内容"
target="要修改的属性所属对象"
property="要修改的属性"
scope="var属性的作用域(page request session application),默认为page"
如果指定了target属性,那么property属性也需要被指定,target和scope不能同时使用
-->
<c:set var="e1" value="${e1}" scope="application"/>
${pageScope.e1 }
、
${applicationScope.e1}
<br>
<c:set target="${e1}" property="ename" value="Donna"/>
${pageScope.e1 }
、
${applicationScope.e1}
<!-- 输出:
Emp [empno=222, ename=KING] 、 Emp [empno=222, ename=KING]
Emp [empno=222, ename=Donna] 、 Emp [empno=222, ename=Donna]
-->
<hr>
<!-- ****删除数据【c:remove】****
var="要删除的变量名称,必填项"
scope="变量所属的作用域,默认为所有作用域"
-->
<c:set var="e1" value="${e1}" scope="session"/>
${sessionScope.e1.ename }
、
<c:remove var="e1" scope="session"/>
${sessionScope.e1.ename }
、
${pageScope.e1.ename }
、
${applicationScope.e1.ename }
<!-- 输出:
Donna 、 、 Donna 、 Donna
-->
<hr>
<!-- ****异常处理【c:catch】****
var="保存异常信息的变量名"
-->
<c:catch var="exceptionMsg">
<%=5 / 0 %>
</c:catch>
${exceptionMsg }
<!-- 输出:
java.lang.ArithmeticException: / by zero
-->
<hr>
<!-- ****IF判断【c:if】****
test="条件表达式,必填项"
var="存储结果的变量"
scope="var属性的作用域(page request session application),默认为page"
-->
<c:if test="${1 < 2 }" var="t1">
1 < 2 = ${pageScope.t1 }、
</c:if>
<c:if test="${empty e2.ename }">
请提供用户名、
</c:if>
<c:if test="${not empty e1.ename }">
欢迎${e1.ename }、
</c:if>
<!-- 输出:
1 < 2 = true、 请提供用户名、 欢迎Donna、
-->
<hr>
<!-- ****模拟if..else if..else..【c:choose c:when c:otherwise】**** -->
<c:set var="salary" value="8000"/>
<c:choose>
<c:when test="${salary <= 5000 }">
日子怎么过
</c:when>
<c:when test="${salary < 10000 }">
日子照样过
</c:when>
<c:when test="${salary < 20000 }">
日子还不错
</c:when>
<c:otherwise>
不知道怎么过
</c:otherwise>
</c:choose>
<!-- 输出:
日子照样过
-->
<hr>
<!-- ****检索一个URL对应的资源【c:import】****
url="资源的url(绝对路径\相对路径),必填项"
context="指定资源名字,默认为当前应用程序"
charEncoding="引入资源的字符编码,默认为ISO-8859-1"
var="用于存储文本的变量"
scope="var属性的作用域(page request session application),默认为page"
varReader="可选的用于提供java.io.Reader对象的变量"
-->
<c:import var="baidu" url="https://www.baidu.com" charEncoding="utf-8"/>
<c:out value="${baidu}"/>
<!-- 输出:
会打印出百度首页的源代码
-->
<hr>
<!-- ****迭代集合【c:forEach】****
items="要迭代的集合,必填项"
begin="开始元素下标,默认为0"
end="最后元素下标,默认为集合的长度"
step="迭代步长,默认为1"
var="当前条目名"
varStatus="迭代状态变量名"
varStatus的属性有:
current 当前条目
index 当前条目从0开始的迭代索引
count 当前条目从1开始的迭代计数
first 用来表明当前这轮迭代是否为第一次迭代的标志
last 用来表明当前这轮迭代是否为最后一次迭代的标志
-->
<c:forEach items="${empList}" var="emp" varStatus="empStatus">
${emp.empno}、${emp.ename}、
${empStatus.current}、${empStatus.index}、
${empStatus.count}、${empStatus.first}、${empStatus.last}
<br/>
</c:forEach>
<!-- 输出:
222、Donna、 Emp [empno=222, ename=Donna]、0、 1、true、false
333、、 Emp [empno=333, ename=null]、1、 2、false、true
-->
<hr>
<!-- ****迭代分隔符分隔的内容【c:forTokens】****
相比forEach多一个属性:
delims="分隔符,必填项"
-->
<c:forTokens items="重庆|北京|成都" var="addr" varStatus="empStatus" delims="|">
${addr}、${empStatus.current}、${empStatus.index}、
${empStatus.count}、${empStatus.first}、${empStatus.last}
<br/>
</c:forTokens>
<!-- 输出:
重庆、重庆、0、 1、true、false
北京、北京、1、 2、false、false
成都、成都、2、 3、false、true
-->
<hr>
<!-- ****URL【c:url】****
var="存储URL的变量名,默认直接输出在页面"
scope="var属性的作用域(page request session application),默认为page"
value="URL,必填项"
context="应用程序名称,默认为当前应用程序"
-->
<c:url value="https://www.baidu.com" />
<br>
<c:url value="http://blog.youkuaiyun.com/i_love_t" var="url_"/>
${url_ }
<!-- 输出:
https://www.baidu.com
http://blog.youkuaiyun.com/i_love_t
-->
<hr>
<!-- ****URL参数【c:param】****
name="参数名称,必填项"
value="参数值"
-->
<c:url value="https://www.baidu.com/baidu" var="meitu">
<c:param name="name1">值1</c:param>
<c:param name="name2" value="值2"></c:param>
</c:url>
${meitu }
<!-- 输出:
https://www.baidu.com/baidu?name1=%e5%80%bc1&name2=%e5%80%bc2
-->
<hr>
<!-- ****重定向【c:redirect】****
url="目标url必填项"
context="应用程序名称,默认当前应用程序"
支持c:param标签
-->
<%--
<c:redirect url="http://blog.youkuaiyun.com/i_love_t">
<c:param name="param">I LOVE YOU!</c:param>
</c:redirect>
--%>
<!-- 输出:
会直接重定向到http://blog.youkuaiyun.com/i_love_t
-->
<%-- 声明一个内部类 --%>
<%!
public static class Emp {
private String empno;
private String ename;
public Emp(){}
public String getEmpno() {
return empno;
}
public String getEname() {
return ename;
}
public void setEmpno(String empno) {
this.empno = empno;
}
public void setEname(String ename) {
this.ename = ename;
}
@Override
public String toString() {
return "Emp [empno=" + empno + ", ename=" + ename + "]";
}
}
%>
</body>
</html>