JSTL核心标签库
导入核心标签库,一般使用c作为访问前缀
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
一.表达式标签
表达式标签包括<c:out>、<c:set>、<c:remove>、<c:catch>
1.<c:out>标签
用于将计算的结果输出到JSP页面,该标签可以替代<%= %>
(1).属性说明:
属性 | 类型 | 描述 | 引用EL |
---|---|---|---|
value | Object | 输出的变量或表达式 | 是 |
escapeXml | boolean | 转换特殊字符,默认值true | 否 |
default | Object | 如果value属性为空,显示default属性定义的默认值 | 否 |
<!-- escapeXml为false时,输出html -->
<c:out value="<hr>" escapeXml="false" />
<!-- escapeXml为true时,输出字符串 -->
<c:out value="<hr/>"/>
<!-- 第一种语法格式 -->
<c:out value="${name}" default="name值为空输出"/>
<!-- 第二种语法格式 -->
<c:out value="${name}">
name值为空输出
</c:out>
2.<c:set>标签
用于定义和存储变量,可以定义变量是在JSP会话范围或者JavaBean属性中
(1).属性说明
属性 | 类型 | 描述 | 引用EL |
---|---|---|---|
value | Object | 存储的变量值 | 是 |
var | String | 变量名称 | 否 |
target | Object | 存储变量值或者标签主体的目标对象,可以是JavaBean或Map | 是 |
property | String | 指定目标对象存储数据的属性名 | 是 |
scope | String | 指定变量存储范围,默认page | 否 |
<!-- 设置值,方式一,scope默认值page,可不写 -->
<c:set var="sex" value="男" scope="page"/>
<!-- 设置值,方式二 -->
<c:set var="sex" scope="page">
女
</c:set>
<!-- 定义bean -->
<jsp:useBean id="user" class="cn.edu.njit.pojo.User"/>
<!-- 设置值到bean 方式一,target属性不能直接写user,需使用${user} -->
<c:set value="男" target="${user}" property="sex"/>
<!-- 设置值到bean 方式二 -->
<c:set target="${user}" property="sex">
女
</c:set>
3.<c:remove>标签
可以从指定JSP范围移除指定变量
(1).属性说明
属性 | 类型 | 描述 | 引用EL |
---|---|---|---|
var | String | 指定存储变量值的变量值名称 | 否 |
scope | String | 指定变量所在JSP范围,默认page,可选值page、request、session、application | 否 |
(2).使用:
<!-- 定义page域中sex变量 -->
<c:set var="sex" value="男" scope="page"/>
<!-- 移除page域中sex变量 -->
<c:remove var="sex" />
4.<c:catch>标签
处理程序异常的标签,可以将异常信息保存到变量中
使用:
<!-- 处理异常,var属性为可选项 -->
<c:catch var="exception">
<c:set value="男" target="user" property="sex"/>
</c:catch>
<c:out value="${exception}" default="空"/>
输出异常信息:javax.servlet.jsp.JspTagException: Invalid property in <set>: "sex"
二.条件标签
条件标签包括:<c:if>、<c:choose>、<c:when>、<c:otherwise>1.<c:if>
根据不同的条件执行不同的代码,和Java的if语句功能一样。(ps:不知道为啥不直接提供<c:else>,用<c:choose>代替?)
(1).属性说明
属性 | 类型 | 描述 | 引用EL |
---|---|---|---|
test | Boolean | 条件表达式 | 是 |
var | String | 变量名,指定test属性判断结果存放在该变量中,不存在则创建 | 否 |
scope | String | 存储范围,指定var属性指定的变量存在的范围。默认page | 否 |
<!-- 语法一 -->
<c:if test="condition" var="result" [scope="page|request|session|application"] />
<!-- 语法二 ,根据test判断结果去执行标签主体内容。标签主体是JSP页面任何可以使用的元素-->
<c:if test="condition" [var="result"] [scope="page|request|session|application"]>
标签主体
</c:if>
(3).使用
<!-- 获取test属性值 -->
<c:if test="${name != null}" var="result" scope="page"/>
<c:out value="${result}" default="空"/>
<!-- 执行标签主体内容,没有提供else标签。。。 -->
<c:if test="${name != null}">
${name}
</c:if>
2.<c:choose>、<c:when>、<c:otherwise>标签
<c:choose>结合<c:when>、<c:otherwise>可以根据不同的条件完成指定的业务逻辑,如果没有符合的条件则会执行默认条件的业务逻辑。<c:choose>标签中可以包含多个<c:when>处理不同条件,只能有一个<c:otherwise>处理默认条件。使用这3个标签可以完成if..else if...else的判断。
(1).语法
<c:choose>
<c:when test="">
业务逻辑
</c:when>
...
多个<c:when>
<c:otherwise>
业务逻辑
</c:otherwise>
</c:choose>
(2).使用
<c:set var="hour">
<%= java.util.Calendar.getInstance().get(java.util.Calendar.HOUR_OF_DAY) %>
</c:set>
<c:out value="${hour }"/>
<c:choose>
<c:when test="${hour > 6 && hour <= 11}">
上午
</c:when>
<c:when test="${hour > 11 && hour <= 17}">
下午
</c:when>
<c:otherwise>
晚上
</c:otherwise>
</c:choose>
三.循环标签
循环标签包括:<c:forEach>、<c:forTokens>
1.<c:forEach>标签
遍历集合中所有元素,也可以指定循环次数。所有属性为可选
(1).属性说明
属性 | 类型 | 描述 | 引用EL |
---|---|---|---|
items | 数组、集合类、字符串、枚举 | 循环遍历对象,一般用户数组和集合 | 是 |
var | String | 循环体变量,存储items指定对象的成员 | 否 |
begin | int | 循环起始位置 | 是 |
end | int | 循环结束位置 | 是 |
step | int | 循环步长 | 是 |
varStatus | String | 循环状态变量,常用属性index、count、first、last、begin、end、step、current | 否 |
所有属性可以参照:javax.servlet.jsp.jstl.core.LoopTagStatus接口的源码
- current:当前元素,与var属性一致(${var属性值}、${vs.current})
- index:元素下标,0开始
- count:计数,从1开始
- first:是否为第一个元素,返回boolean类型;若定义了begin属性,则该属性值作为是否是第一个元素的判断条件
- last:是否为最后一个元素,返回boolean类型;判断条件:当前元素后是否还有元素,没有则表示当前元素是最后一个元素,返回false(与end属性关系不大)
- begin:开始元素的下标,可以理解为:int i = begin;
- end:结束元素下标,可以理解为:i <= end;end超出范围时不会报错
- step:步长,可以理解为循环时,i += step;
(3).使用
<!-- 遍历List,获取元素下标、当前元素个数、元素内容-->
<c:forEach items="${userList}" var="user" varStatus="vs">
index:${vs.index} - count:${vs.count} - ${user.username}
</c:forEach>
<!-- ${vs.begin} 获取begin属性的值,如果未定义则为空;end、step属性类似-->
<c:forEach items="${userList}" var="user" begin="0" end="${userList.size()-1}" step="1" varStatus="vs">
begin:${vs.begin } - end:${vs.end } - step:${vs.step } <br>
${user.username}<hr/>
</c:forEach>
2.<c:forTokens>标签
可以用指定的分隔符将一个字符串分割开,根据分割的数量确定循环次数
(1).属性说明
属性 | 类型 | 标签 | 引用EL |
---|---|---|---|
items | String | 字符串 | 是 |
delims | String | 字符串的分隔字符,可以同时有多个分隔字符 | 否 |
var | String | 变量名称 | 否 |
begin | int | 循环起始位置 | 是 |
end | int | 循环结束位置 | 是 |
step | int | 循环步长 | 是 |
varStatus | String | 循环状态变量,同<c:forEach> | 否 |
<c:set var="names" value="小明|小茗|小名"/>
<c:forTokens items="${names}" delims="|" var="name" varStatus="vs">
<c:choose>
<c:when test="${!vs.last}">
${vs.count }:${name },
</c:when>
<c:otherwise>
${vs.count }:${name }
</c:otherwise>
</c:choose>
</c:forTokens>
四.URL操作标签
包括:<c:import>、<c:redirect>、<c:url>1.<c:import>标签
可以导入站内或其他网站的静态、动态页面到JSP页面中。
(1).属性说明
属性 | 类型 | 描述 | 引用EL |
---|---|---|---|
url | String | 导入资源的URL路径,绝对/相对路径 | 是 |
context | String | 上下文路径,用于访问同一个服务器的其他Web工程,其值必须以'/'开头,如果指定了该属性,那么url属性值也必须以'/'开头 | 是 |
var | String | 变量名称,获取的资源存储在变量中 | 否 |
scope | String | 变量存在的范围 | 否 |
varReader | String | 以Reader类型存储被包含的文件内容 | 否 |
charEncoding | String | 导入文件的编码格式 | 是 |
<!-- 导入任意URL -->
<c:import url="https://www.baidu.com/" charEncoding="utf-8"/>
<!-- 同一Context下的导入,绝对路径,相对于项目根目录 -->
<c:import url="/index.jsp"/>
<!-- 同一Context下的导入,相对路径,相对于当前文件所在目录 -->
<c:import url="test.html"/>
<!-- 不同Context下导入,相对于context属性指定的项目根目录;乱码时设置charEncoding属性;
由于使用了<c:param>,所以请求url为:xxx/test_servlet/index.html?name=l&age=18
-->
<c:import url="/html/index.html" context="/test_servlet" charEncoding="utf-8" var="page">
<c:param name="name" value="l"/>
<c:param name="age" value="18"/>
</c:import>
2.<c:redirect>标签
请求重定向
(1).使用
<!-- 重定向到任意URL -->
<c:redirect url="https://www.baidu.com/"/>
<!-- 同一Context,重定向到当前项目根目录下页面 -->
<c:redirect url="/index.jsp"/>
<!-- 同一Context,请求重定向到Servlet -->
<c:redirect url="/file/uploadServlet"/>
<!-- 不同Context,重定向到context属性指定的项目根目录 -->
<c:redirect url="/index.jsp" context="/test_servlet"/>
<!-- 不同Context,请求重定向到context属性指定项目的Servlet -->
<c:redirect url="/LoginServlet" context="/test_servlet"/>
3.<c:url>标签
生成URL路径字符串,不是实现<a>的功能。若定义了var属性,url信息存储在该变量中;未定义则直接输出。
(1).使用
<!-- 直接输出index.jsp,相对路径下路径时value属性的值 -->
<c:url value="index.jsp" />
<!-- 绝对路径(相对于项目的根目录),并存于page域的url变量中,使用${url}获取路径信息 -->
<c:url value="/index.jsp" var="url" scope="page"/>
<!-- 绝对路径,同时传递查询参数, xxx/LoginServlet?name=l -->
<c:url value="/LoginServlet/" var="url">
<c:param name="name" value="l"/>
</c:url>
<!-- 不同Context,url为:context属性指定的项目/LoginServlet -->
<c:url value="/LoginServlet" var="url" context="/test_servlet"/>
大概整理了一下c标签以及使用方法,内容有点多,写的不是很详细,,