在JSP文件中使用Core标签库,要先通过 taglib 指令引入该标签库:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
JSTL Core标签库的标签描述文件位于 JAR/META-INF/c.tld 中。
一般用途的标签包括一下几种:
(命名变量的定义在 EL表达式基础 一节中;实际上是指存放在特定范围内的属性,命名变量的名字就是属性的名字;)
能够把一个表达式的结果打印到网页中,这个表达式可以为基于<%%>,EL表达式;如果value指定的命名变量不存在(null),则什么也不输出;
<c:out>标签可以采用两种方式设定默认值:设定defautl属性,或者在body中设定默认值。
测试coretest.jsp
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!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>Insert title here</title> </head> <body> <%-- JSTL Core --%> <%-- c:out --%> <c:out value="${param.username}" default="default username" /> <br/> </body> </html>
访问上面的URL:
http://localhost:8080/base-webapp/jsp/jstl/coretest.jsp?username=test user
不加request parameter - username,
http://localhost:8080/base-webapp/jsp/jstl/coretest.jsp
显示为:
<c:set>标签具有一下作用:
语法为:
<c:out var="命名变量的名字" value="表达式" scope="page|request|session|application" />
scope的默认值为page
以下代码在session scope设置了一个命名变量,然后打印出来:
<%-- c:set --%> c:set<br/> <c:set var="user" value="new user" scope="session" /> ${user} <br/>
访问这个JSP,显示如下:
语法:
<c:set target="代表JavaBean的命名变量" property="JavaBean的属性名" value="表达式" />
一下代码先通过<jsp:useBean>动作定义一个命名变量,然后通过c:set标签设置id属性的值为new id,打印出结果:
<jsp:useBean id="mytestbean" class="com.gof.test.bean.TestBean" scope="application" /> <c:set target="${mytestbean}" property="id" value="new id" /> ${mytestbean.id} <br/>
访问JSP,显示为:
语法:
<c:set target="代表Map对象的命名变量" property="key的名字" value="表达式" />
示例:
<jsp:useBean id="weeks" scope="request" class="java.util.HashMap" /> <c:set target="${weeks}" property="1" value="Monday" /> <c:set target="${weeks}" property="2" value="Thuesday" /> ${weeks} <br/>
访问JSP,显示为:
用于删除特定范围内命名变量,语法为:
<c:remove var="命名变量的名字" scope="page|request|session|application" />
若不指定scope的值,那么会从所有范围内删除var指定的命名变量。
示例:
<%--c:remove --%> c:remove<br/> <c:remove var="user" /> ${user} <br/>
删除c:set中设置的命名变量user,无任何输出内容。
用于捕获标签主题中可能出现的一场,并且把一场对象作为命名变量保存在页面范围内,语法为:
<c:catch var="代表异常对象的命名变量的名字" />
示例:
<%-- c:catch --%> c:catch<br/> <c:catch var="ex"> <% int a = 1; int b = 0; int c = a / b; // will throw an exception %> </c:catch> <c:out value="${ex.message}" default="No exception" />
<% try{ int a = 1; int b = 0; int c = a / b; }catch (Exception e){ pageContext.setAttribute("ex", e, PageContext.PAGE_SCOPE); } %> <c:out value="${ex.message}" default="No exception" />
显示为:
条件标签能实现Java语言中的if语句以及if-else语句的功能,包括:
语法为:
<c:if test="逻辑表达式" var="代表逻辑表达式的值的命名变量的名字" scope="page|request|session|application" />
<c:if>标签可以包含标签主体,只有当逻辑表达式的值为true时,才会执行标签主体。
示例:
<%-- c:if --%> c:if <br/> <c:if test="${param.user=='me'}" var="result" scope="request"> the parameter.user is ${param.user } <br/> </c:if> ${result}
http://localhost:8080/base-webapp/jsp/jstl/coretest.jsp?user=me
示例:
<%-- choose when otherwise --%> c:choose c:when c:otherwise<br/> <c:choose> <c:when test="${empty param.username }"> Unknown User. </c:when> <c:when test="${param.username == 'New' }"> ${param.username} is New. </c:when> <c:otherwise> ${param.username } is others. </c:otherwise> </c:choose>
http://localhost:8080/base-webapp/jsp/jstl/coretest.jsp http://localhost:8080/base-webapp/jsp/jstl/coretest.jsp?username=New http://localhost:8080/base-webapp/jsp/jstl/coretest.jsp?username=Old
<c:forEach>标签可以遍历的集合包括:
<c:forEach var="代表集合中的一个元素的命名变量的名字" items="集合"> 标签主体 </c:forEach>
每次从集合中去除一个元素,并且把它存放在NESTED范围内的命名变量中,在标签主体中可以访问这个命名变量。NESTED范围是指当前标签主体构成的范围。只有当前标签主体才能够访问NESTED范围内的命名变量。
示例:
<%-- c:forEach --%> c:forEach<br/> <% HashMap maps = new HashMap(); maps.put("1","the first value"); maps.put("2","the second value"); %> <c:forEach var="mapitem" items="<%= maps%>"> ${mapitem.key} ${mapitem.value}<br/> </c:forEach> <br/>
输出:
varStatus属性用于设定一个javax.servlet.jsp.jstl.core.LoopTagStatus类型的命名变量,它位于NESTED范围,这个命名变量包含了从集合中取出的当前元素的状态信息。
示例:继续上面的例子
c:forEach varStatus<br/> <table border="1"> <tr> <td>序号</td> <td>索引</td> <td>是否是第一个元素</td> <td>是否是最后一个元素</td> <td>元素的key</td> <td>元素的value</td> </tr> <c:forEach var="mapitem" items="<%= maps %>" varStatus="status"> <tr> <td>${status.count }</td> <td>${status.index }</td> <td>${status.first }</td> <td>${status.last }</td> <td> <c:choose> <c:when test="${status.last }"> <font color="red">${mapitem.key}</font> </c:when> <c:otherwise> <font color="green">${mapitem.key}</font> </c:otherwise> </c:choose> </td> <td>${mapitem.value}</td> </tr> </c:forEach> </table>
访问URL显示为:
begin end step属性分别指定循环的起始索引,结束索引和步长。
用于遍历字符串中用特定分隔符分隔的子字符串,并且能重复执行标签主体。
基本语法如下:
<c:forTokens var="代表子字符串的命名变量的名字" items="被分隔的字符串" delims="分隔符" > 标签主体 </c:forTokens>
示例:
c:forToken<br/> <% String str = "First:Second:Third:Forth"; %> <c:forTokens var="stritem" items="<%= str %>" delims=":"> ${stritem } <br/> </c:forTokens> <br/>
显示为:
用于包含其他Web资源,它与<jsp:include>动作的作用有些类似。
<c:import>标签雨<jsp:include>动作的区别在于,牵着不仅可以包含同一个Web应用中的资源,还能包含其他Web应用中的资源,甚至是其他网站的资源。
基本语法为:
<c:import url="Web资源的URL" />
url路径的格式:
<c:import>标签还可以通过var属性设定一个String类型的命名变量。如果设定了var属性,那么<c:import>标签不会把url属性设定的目标文件的内容直接包含到当前文件中,而是把目标文件中的文本内容保存在var属性设定的命名变量中。
例如:
一下标签把target.jsp文件中的文本内容存放在target命名变量中,通过EL表达式输出target.jsp文件中的内容。
<c:import url="dir/target.jsp" var="target" /> ${target}
按照特定的重写规则重新构造URL。
基本语法为:
<c:url value="原始URL" var="存放新的URL的命名变量" scope="page|request|session|application" />
标签把重新生成的URL存放在var属性指定的命名变量中,scope默认值为page。
例如,一下<c:url>标签中的value属性以“/”开头,标签会在重新生成的URL中加上当前Web应用的跟路径,因此,myurl命名变量的值为
/base-webapp/dir1/dir2/test.jsp
<%-- c:url --%> c:url<br/> <c:url value="/dir1/dir2/test.jsp" var="myurl" /> <a href="${myurl}">test.jsp</a> <br/>
<c:url>标签中可以包含<c:param>子标签,用于设定请求参数。
例如:
<%-- c:url --%> c:url<br/> <c:url value="/dir1/dir2/test.jsp" var="myurl" > <c:param name="username" value="New" /> </c:url> <a href="${myurl}">test.jsp</a> <br/>
则myurl的值为:
/base-webapp/dir1/dir2/test.jsp?username=New
用于把请求重定向到其他Web资源。
基本语法为:
<c:redirect url="目标Web资源的URL" />