其实之前在用JSTL的时候还是比较懵逼的,虽然在列表页时通常都会用到foreach标签,但其实并没有真正的理解,这也是重新学习的理由。
简介
JSTL全称:JSP Standard Tag Library,即JSP标准标记库,它是一个开源的JSP标签库,由Apache在维护,封装了许多JSP应用程序通用的核心功能,因而使用广泛,JSTL由四个定制标签库(core、fmt、xml和sql)组成。其中,core提供了一些定制操作,通过限制作用域管理变量、实现迭代以及条件操作,它还提供了用来生成和操作URL的标记。fmt定义了用来格式化数据的操作,例如数字和时间的格式化输出。xml 库包含一些标记,这些标记用来操作通过 XML 表示的数据,而 sql 库定义了用来查询关系数据库的操作。后两者实际上已经过时了。
使用
导入标签库
除了JSP内置的动作标签之外,使用其他的自定义标签库时,都需要
- 添加相关依赖jar包
- 在JSP页面使用taglib标签导入标签库,如下:
<%@taglib prefix="c" uri="http://java.sun.com/jstl/core" %>
- 其中prefix的值可以是任意值,但约定俗成写成"c";
- uri="http://java.sun.com/jstl/core":指定标签库的uri,它不一定是真实存在的网址,但它可以让JSP找到标签库的描述文件
常用标签
1.set标签
<c:set var="xxx" value="yyy"/>
/**表示在pageContext中添加name为xxx,值为yyy的键值对**/
<c:set var="xxx" value="yyy" scope="session"/>
/**表示在session中添加name为xxx,值为yyy的键值对**/
2.out标签
<c:out value=”xxx”/>
/**在页面中输出xxx字符串**/
<c:out var="aaa" value=”${xxx}” default=”yyy”/>
/**在页面中输出xxx所指代的值,如果${xxx}不存在,则默认为yyy,aaa表示变量的名称**/
<%
request.setAttribute("xxx","<script>javascript语句</script>");
%>
<c:out value="${xxx}" default="xxx" escapeXml="false" />
/**在escapeXml为false的情况下,"<"">"不会被转换,这就导致可能的JavaScript攻击。**/
3.remove标签
<c:remove var="xxx" scope="session"/>
/**删除session中变量名为xxx的变量,还有一个scope属性,默认是all scopes。**/
4.url标签
<c:url value="/"/>
/**输出"/项目名称/"**/
<c:url value="/" var="x" scope="session"/>
/**将上述变量赋值给变量x,作用域为session。**/
<c:url value="/xxxServlet">
<c:param name="username" value="abc"/>
<c:param name="password" value="123"/>
/**输出:/项目名/xxxServlet?username=abc&password=123
如果参数中包含中文,那么会自动使用URL编码**/
5.foreach标签
<c:forEach var="i" begin="1" end="5">
Item <c:out value="${i}"/><p>
</c:forEach>
/** var指定变量名,begin为变量起始值,end为变量终止值。**/
<%
List<String> names = new ArrayList<String>();
names.add("zhangSan");
names.add("liSi");
names.add("wangWu");
names.add("zhaoLiu");
pageContext.setAttribute("ns", names);
%>
<c:forEach var="item" items="${ns }">
<c:out value="name: ${item }"/><br/>
</c:forEach>
/**这里forEach中依然item作为变量名,需要被循环遍历的items是域对象中的ns,forEach下的out标签中输出item变量,该变量即为forEach中var声明的item。**/
6.if标签
<c:set var="salary" scope="session" value="${2000*2}"/>
<c:if test="${salary > 2000}">
<p>My salary is: <c:out value="${salary}"/><p>
</c:if>
/**这里test需要是一个布尔表达式,只有当表达式值为true时,下面的代码才会被执行。**/