在Servlet中输出HTML内容是非常麻烦的;在JSP中嵌入大量的Java代码也同样不是什么好事。在学习了MVC架构后,Servlet/JSP终于可以各司其职——Servlet处理HTTP请求并访问业务逻辑代码,在JSP中则使用表达式求值并显示。但是,对于一些场景:
- 依据某个条件决定显示的HTML内容——导航栏根据用户是否登录的状态显示不同的内容
- 循环显示一段HTML内容——博客列表中每一个条目的文章
这都必须在JSP中嵌入Java代码才可以使得页面呈现出想要的结果——因为HTML本身并没有<if>
,<for>
这样的标签来完成动态生成网页的任务。
所幸的是,Java EE提供了这样的扩展标签库——JSTL,它不仅能提供条件判断、循环等常用实现程序逻辑的标签,还提供很多扩充标签让开发者能够更加方便的实现业务功能。
使用JSTL标签
安装JSTL标签库
首先需要下载JSTL库,在下载地址中选择javax.servlet.jsp.jstl-1.2.1.jar
。下载后将其复制到Eclipse项目中WEB-INF/lib
文件夹下:
这样相当于Web应用的类路径上添加了JSTL的类库依赖,同时Eclipse会自动将它添加到Web App Libraries
,这样在IDE中编写JSP文件时可以对JSTL语法进行自动检查以及自动完成。
第一个JSTL程序
JSTL是基于JSP的扩展标签库,在使用它之前我们必须在JSP文件头部引入它的定义:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
这里仅仅引入JSTL中的核心标签库(Core),它包含了条件判断、循环处理、属性存取、URL处理以及错误处理等标签。Core是JSTL最常用的标签库,除此之外,JSTL还包含了格式化标签库、SQL标签库、XML标签库、常用函数标签库等,在接下来的学习中将会一一接触到。
http://java.sun.com/jsp/jstl/core
是核心标签库的URL,prefix="c"
表示通过c
前缀来使用JSTL标签,例如<c:out>
,<c:forEach>
。
下面是一个简单的使用JSTL标签库的JSP程序:
<%
String[] cities = {"Beijing", "Shanghai", "Guangzhou"};
pageContext.setAttribute("cities", cities);//这里是测试数据,一般来说需要在Servlet中将数据传入JSP
%>
<body>
<c:forEach var="city" items="${cities}">
${city} <br/>
</c:forEach>
</body>
上述代码通过<c:forEach>
标签对上下文中的cities
变量(由items
属性定义)进行遍历,循环变量为city
(由属性var
定义,可以任意取名),标签的内容则会被循环输出。
常用的JSTL标签
JSTL核心标签库中还包含了很多有用的功能:
<c:set>
设置变量的值,它会计算表达式的值然后设置相应的变量:
<c:set var="salary" scope="session" value="${2000*2}"/>
<c:out value="${salary}"/>
<c:out>
用来显示一个表达式的结果,与<%= %>
作用相似。不同之处在于,<c:out>
标签可以直接通过.
来访问对象的属性:
<c:out value="${post.creator.name}"
<c:if>
<c:if>
标签判断表达式的值,如果表达式的值为真则执行其主体内容。
<c:set var="salary" value="${2000*2}"/>
<c:if test="${salary > 2000}">
<p>My salary is: <c:out value="${salary}"/><p>
</c:if>
<c:choose>
<c:choose>
标签与Java switch语句的功能一样,用于在众多选项中做出选择。switch语句中有case,而<c:choose>
标签中对应有<c:when>
,switch语句中有default,而<c:choose>
标签中有<c:otherwise>
。
<c:set var="salary" scope="session" value="${2000*2}"/>
<p>Your salary is : <c:out value="${salary}"/></p>
<c:choose>
<c:when test="${salary <= 0}">
Salary is very low to survive.
</c:when>
<c:when test="${salary > 1000}">
Salary is very good.
</c:when>
<c:otherwise>
No comment sir...
</c:otherwise>
</c:choose>
JSTL实例
使用<c:forEach>
标签显示首页用户列表
相当于对JSP中for循环的改写,然后通过.
操作符访问属性,例如user.avatar
,user.title
:
<div class="container user-list">
<!-- Three columns of text below the carousel -->
<div class="row">
<c:forEach var="user" items="${users}">
<div class="col-sm-4">
<img class="img-circle" src="${user.avatar}" width="140" height="140">
<h2>${user.title}</h2>
<p>${user.description}</p>
<p><a class="btn btn-default" href="user/${user.id}" role="button">访问 »</a></p>
</div>
</c:forEach>
</div>
</div>