JSTL(JavaServer Pages Standard Tag Library)是JSP的标准标签库,它提供了一组JSP自定义标签,用于简化和增强JSP页面的开发。JSTL包含了多个标签库,每个标签库都有不同的功能,例如核心功能、格式化和国际化、XML处理、SQL数据库访问等。通过结合JSTL和EL(Expression Language),开发人员可以在JSP页面中以一种更简洁和模块化的方式编写代码,从而提高开发效率和代码质量。不过在实际开发中,我们通常使用MVC模式开发JavaWeb程序,JSP作为生成Web页面的模板引擎主要还是使用条件渲染、循环渲染等核心功能,很少使用到JSTL的其它非核心标签库。
这篇笔记我们主要介绍JSTL核心标签库的使用。
在Maven的pom.xml
中我们需要引入JSTL的依赖,当前JSTL的最新版本的1.2
,这部分并没有被包含在JavaEE SDK中。
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
JSTL中最常用的就是核心标签库,其余标签库很少使用。核心标签也就是能够让JSP作为模板引擎使用的那部分标签,包含了输出、条件渲染、循环渲染等核心功能,我们可以使用如下taglib指令在JSP页面上引入核心标签库。
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
注意:其中prefix="c"
是我们自定义的一个前缀名字,用于引用标签库中的标签,核心标签通常惯用的写法是c
,取Core的意思。
<c:out>
标签用于显示一个变量到页面上。
<c:out value="<string>" default="<string>" escapeXml="<true|false>"/>
true
,转义XML特殊字符能够一定程度上防御XSS攻击,一般来说仅在展示富文本信息时才会将其设置为false
例子:
<c:out value="${user.username}" />
<c:set>
标签用于设置变量供后续使用。
<c:set
var="<string>"
value="<string>"
target="<string>"
property="<string>"
scope="<string>"/>
例子:
<c:set value="hello" var="str" />
<c:remove>
标签用于移除已经设置的变量。
<c:remove var="<string>" scope="<string>"/>
<c:catch>
标签用于异常处理。
<c:catch var="<string>">
</c:catch>
<c:if>
标签用于条件渲染,它接收一个EL表达式作为条件,决定是否显示内部的内容。
<c:if test="<boolean>" var="<string>" scope="<string>">
</c:if>
true
显示主体内容例子:
<c:if test="${sessionScope.user != null}">
<li><a href="http://www.gacfox.com">博客</a></li>
<li><a href="${pageContext.request.contextPath}/logout">退出系统</a></li>
</c:if>
<c:choose>
标签的作用类似switch...case语句,由于JSP核心标签里没有“else”,因此实际开发中<c:choose>
比<c:if>
更加常用。
<c:choose>
<c:when test="<boolean>"/>
</c:when>
<c:when test="<boolean>"/>
</c:when>
<c:otherwise>
</c:otherwise>
</c:choose>
true
显示内部的内容<c:forEach>
用于实现循环渲染。
<c:forEach
items="<object>"
begin="<int>"
end="<int>"
step="<int>"
var="<string>"
varStatus="<string>">
</c:forEach>
例子:
<table border="1">
<c:forEach items="${collection}" var="v">
<tr>
<td><c:out value="${v}"/></td>
</tr>
</c:forEach>
</table>
EL是JavaEE规范中的一种表达式语言,它可以访问JSP中的变量或动态计算变量的值。JSP中嵌入EL表达式的格式为${}
,EL表达式提供了.
和[]
运算符,写法形如${user.username}
、${user[2]}
,其中[]
内可以是数组的索引值也可以是一个变量,用于动态取值。
EL表达式中可以使用丰富的运算符来进行数学运算、逻辑运算、关系运算等,包括:
数学运算符:+ - * /或div %或mod
关系运算符:==或eq !=或ne <或lt >或gt <=或le >=或ge
逻辑运算符:&&或and ||或or !或not
empty运算符:empty
三目运算符::?
关于EL表达式中变量的作用域,如果EL表达式中不明确指定变量的作用域,它会依次从page、request、session、application中查找该变量,也可以用pageScope
、requestScope
、sessionScope
、applicationScope
明确指定变量的作用域,例如${requestScope.user.username}
。
JSP中除了之前介绍过的9大内置对象,还有一些隐式对象。
通过EL表达式可以直接读取Cookie值。
下面例子中,我们获得了cookie对象、cookie键和cookie值并打印出来。
<c:out value="${cookie.username}" />
<c:out value="${cookie.username.name}" />
<c:out value="${cookie.username.value}" />
通过EL表达式可以读取请求头信息,下面是一个例子。
<c:out value="${header['User-Agent']}" />
如果请求头中一个键对应多个值,可以用headerValues属性。
initParam
隐式对象相当于application.getInitParam()
,不常用。
pageContext
即JSP页面上下文,用于取得一些页面的其他信息。
下面是一些常见的例子。
${pageContext.request.queryString}
取得请求的参数字符串${pageContext.request.requestURL}
取得请求的URL,但不包括请求之参数字符串${pageContext.request.contextPath}
服务的web application 的名称${pageContext.request.method}
取得HTTP 的方法(GET、POST)${pageContext.request.protocol}
取得使用的协议(HTTP/1.1、HTTP/1.0)${pageContext.request.remoteUser}
取得用户名称${pageContext.request.remoteAddr}
取得用户的IP 地址${pageContext.session.new}
判断session 是否为新的${pageContext.session.id}
取得session 的ID${pageContext.servletContext.serverInfo}
取得主机端的服务信息