0x01 核心标签
核心标签是最常用的JSTL标签引用核心标签库的语法如下:<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
| 标签 |
描述 |
|
用于在JSP中显示数据, 就像<%= … > |
|
用于保存数据 |
|
用于删除数据 |
|
用来处理产生错误的异常状况, 并且将错误信息储存起来 |
|
与我们在一般程序中用的if一样 |
|
本身只当做和的父标签 |
|
的子标签, 用来判断条件是否成立 |
|
的子标签, 接在标签后, 当标签判断为false时被执行 |
|
检索一个绝对或相对 URL, 然后将其内容暴露给页面 (注: 代码审计时可以看看URL参数是否可控,可控表示有SSRF) |
|
基础迭代标签, 接受多种集合类型 |
|
根据指定的分隔符来分隔内容并迭代输出 |
|
用来给包含或重定向的页面传递参数 |
|
重定向至一个新的URL. |
|
使用可选的查询参数来创造一个URL |
0x02 小例子
// 目录结构├── src│ └── main│ └── webapp│ └── com│ │ └── ...│ └── WEB-INF│ │ └── web.xml│ ├── ...│ └── JSTL库测试│ │ ├── ...
0x02.1
0x02.1.1 语法
<c:out> 标签用来显示一个表达式的结果<c:out> 标签与 <%= %>作用相似, 它们的区别就是 <c:out> 标签可以直接通过 "." 操作符访问属性举例来说, 如果想要访问 customer.address.street, 只需要这样写: <c:out value="customer.address.street"><c:out> 标签会自动忽略 XML 标记字符, 所以它们不会被当做标签来处理
<c:out> 标签语法格式如下:<c:out value="<string>" default="<string>" escapeXml="<true|false>"/>
| 标签有如下属性 |
|
|
|
| 属性 |
描述 |
必须 |
默认值 |
| value |
要输出的内容 |
是 |
无 |
| default |
输出的默认值 |
否 |
主体中的内容 |
| escapeXml |
是否忽略XML特殊字符 |
否 |
true |
0x02.1.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/// 文件名称: jstl_c_out.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %><%--引入对应标签--%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html><head> <title>jstl_c_out</title></head><body> <div><c:out value="<要显示的数据对象(未使用转义字符)>" escapeXml="true" default="默认值"></c:out></div> <div><c:out value="<要显示的数据对象(使用转义字符)>" escapeXml="false" default="默认值"></c:out></div> <div><c:out value="${null}" escapeXml="false">使用的表达式结果为null,则输出该默认值</c:out></div></body></html>// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_out.jsp

0x02.2
0x02.2.1 语法
<c:set> 标签用于设置变量值和对象属性<c:set> 标签就是 <jsp:setProperty> 行为标签的孪生兄弟这个标签之所以很有用呢, 是因为它会计算表达式的值, 然后使用计算结果来设置JavaBean对象或java.util.Map对象的值
<c:set>标签语法格式如下:<c:set var="<string>" value="<string>" target="<string>" property="<string>" scope="<string>"/>
| 标签有如下属性 |
|
|
|
| 属性 |
描述 |
必须 |
默认值 |
| value |
要存储的值 |
否 |
主体的内容 |
| target |
要修改的属性所属的对象 |
否 |
无 |
| property |
要修改的属性 |
否 |
无 |
| var |
存储信息的变量 |
否 |
无 |
| scope |
var属性的作用域 |
否 |
Page |
0x02.2.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/// 文件名称: jstl_c_set<%@ page contentType="text/html;charset=UTF-8" language="java" %><%--引入对应标签--%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html><head> <title>jstl_c_set</title></head><body> <c:set var="number" scope="session" value="${2000*2}"/> <div>2000*2=<c:out value="${number}"/></div></body></html>// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_set.jsp

0x02.3
0x02.3.1 语法
<c:remove> 标签用于移除一个变量, 可以指定这个变量的作用域, 若未指定, 则默认为变量第一次出现的作用域这个标签不是特别有用,不过可以用来确保JSP完成清理工作
<c:remove> 标签语法格式如下:<c:remove var="<string>" scope="<string>"/>
| 标签有如下属性 |
|
|
|
| 属性 |
描述 |
必须 |
默认值 |
| var |
要移除的变量名称 |
是 |
无 |
| scope |
变量所属的作用域 |
否 |
所有作用域 |
0x02.3.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/// 文件名称: jstl_c_remove.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %><%--引入对应标签--%><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html><head> <title>jstl_c_remove</title></head><body> <c:set var="number" scope="session" value="${2000*2}"/> <div>number变量值:<c:out value="${number}"/></div> <c:remove var="number"/> <div>number变量后的值: <c:out value="${number}"/></div></body></html>// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_remove.jsp
0x02.4
0x02.4.1 语法
<c:catch> 标签主要用来处理产生错误的异常状况,并且将错误信息储存起来
<c:catch> 标签语法格式如下:<c:catch var="<string>">...</c:catch>
| 标签有如下属性 |
|
|
|
| 属性 |
描述 |
必须 |
默认值 |
| var |
用来储存错误信息的变量 |
否 |
None |
0x02.4.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/// 文件名称: jstl_c_catch.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><% java.util.Calendar cal = java.util.Calendar.getInstance(); request.setAttribute("cal", cal);%><c:catch var="myException"> <!-- 错误设置了Calendar对象的time属性值,将抛出异常 --> <c:set target="${cal}" property="time" value="abcd"/></c:catch><html><head> <title>jstl_c_catch.jsp</title></head><body> <!-- 输出异常对象的相应信息 --> <div>myException: <c:out value="${myException}"/></div> <div>myException.getMessage(): <c:out value="${myException.message}"/></div> <div>myException.getCause(): <c:out value="${myException.stackTrace}"/></div></body></html>// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_catch.jsp

0x02.5
0x02.5.1 语法
<c:if> 标签判断表达式的值,如果表达式的值为true,则执行其主体内容
<c:if> 标签语法格式如下:<c:if test="<boolean>" var="<string>" scope="<string>"> ...</c:if>
| 标签有如下属性 |
|
|
|
| 属性 |
描述 |
必须 |
默认值 |
| test |
条件 |
是 |
无 |
| var |
用于存储条件结果的变量 |
否 |
无 |
| scope |
var属性的作用域 |
否 |
page |
0x02.5.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/// 文件名称: jstl_c_if.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html><head> <title>jstl_c_if</title></head><body><c:set var="salary" scope="session" value="${2000*2}"/><c:if test="${salary > 2000}"> <div>我的工资为: <c:out value="${salary}"/><div></c:if></body></html>// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_if.jsp

0x02.6 //
0x02.6.1 语法
<c:choose>标签与Java switch语句的功能一样,用于在众多选项中做出选择。switch语句中有case而<c:choose>标签中对应有<c:when>switch语句中有default而<c:choose>标签中有<c:otherwise>
语法格式如下:<c:choose> <c:when test="<boolean>"> ... </c:when> <c:when test="<boolean>"> ... </c:when> ... ... <c:otherwise> ... </c:otherwise></c:choose><c:choose> 标签没有属性<c:when> 标签只有一个属性,在下表中有给出。<c:otherwise> 标签没有属性
| 标签的属性如下 |
|
|
|
| 属性 |
描述 |
必须 |
默认值 |
| test |
条件 |
是 |
无 |
0x02.6.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/// 文件名称: jstl_c_choose.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html><head> <title>jstl_c_choose</title></head><body><c:set var="salary" scope="session" value="${param.salary}"/><div>你的工资为: <c:out value="${salary}"/></div><c:choose> <c:when test="${salary <= 0}"> <div>太惨了</div> </c:when> <c:when test="${salary > 1000}"> <div>不错的薪水,还能生活</div> </c:when> <c:otherwise> <div>有一丢丢薪水</div> </c:otherwise></c:choose></body></html>// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_choose.jsp?salary=0返回结果:你的工资为: 0太惨了// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_choose.jsp?salary=200返回结果:你的工资为: 200有一丢丢薪水// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_choose.jsp?salary=4000返回结果:你的工资为: 4000不错的薪水,还能生活
0x02.7
0x02.7.1 语法
<c:import>标签提供了所有<jsp:include>行为标签所具有的功能,同时也允许包含绝对URL举例来说,使用<c:import>标签可以包含一个FTP服务器中不同的网页内容
<c:import> 标签语法格式如下:<c:import url="<string>" var="<string>" scope="<string>" varReader="<string>" context="<string>" charEncoding="<string>"/>
| 标签有如下属性 |
|
|
|
| 属性 |
描述 |
是否必要 |
默认值 |
| url |
待导入资源的URL, 可以是相对路径和绝对路径, 并且可以导入其他主机资源 |
是 |
无 |
| context |
当使用相对路径访问外部context资源时, context指定了这个资源的名字。 |
否 |
当前应用程序 |
| charEncoding |
所引入的数据的字符编码集 |
否 |
ISO-8859-1 |
| var |
用于存储所引入的文本的变量 |
否 |
无 |
| scope |
var属性的作用域 |
否 |
page |
| varReader |
可选的用于提供java.io.Reader对象的变量 |
否 |
无 |
0x02.7.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/// 文件名称: jstl_c_import.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html><head> <title>jstl_c_import.jsp</title></head><body><c:import var="data" url="${param.url}"/><c:out value="${data}"/></body></html>// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_import.jsp?url=./jstl_c_out.jsp// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_import.jsp?url=http://baidu.com


0x02.8
0x02.8.1 语法
<c:forEach> 标签用于迭代一个集合中的对象
<c:forEach> 标签语法格式如下:<c:forEach items="<object>" begin="<int>" end="<int>" step="<int>" var="<string>" varStatus="<string>"> ...
| 标签有如下属性 |
|
|
|
| 属性 |
描述 |
是否必要 |
默认值 |
| items |
要被循环的信息 |
否 |
无 |
| begin |
开始的元素(0=第一个元素, 1=第二个元素) |
否 |
0 |
| end |
最后一个元素(0=第一个元素, 1=第二个元素) |
否 |
Last element |
| step |
每一次迭代的步长 |
否 |
1 |
| var |
代表当前条目的变量名称 |
否 |
无 |
| varStatus |
代表循环状态的变量名称 |
否 |
无 |
0x02.8.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/// 文件名称: jstl_c_foreach.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html><head> <title>jstl_c_foreach.jsp</title></head><body><c:forEach var="i" begin="1" end="5"> <div>Item <c:out value="${i}"/></div></c:forEach></body></html>// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_foreach.jsp

0x02.9
0x02.9.1 语法
<c:forTokens> 标签通过指定分隔符将字符串分隔为一个数组然后迭代它们
<c:forTokens> 语法格式如下:<c:forTokens items="<string>" delims="<string>" begin="<int>" end="<int>" step="<int>" var="<string>" varStatus="<string>">
| 标签有如下属性 |
|
|
|
| 属性 |
描述 |
必须 |
默认值 |
| items |
要被循环的信息 |
否 |
无 |
| begin |
开始的元素(0=第一个元素) |
否 |
0 |
| end |
最后一个元素(0=第一个元素) |
否 |
Last element |
| step |
每一次迭代的步长 |
否 |
1 |
| var |
代表当前条目的变量名称 |
否 |
无 |
| varStatus |
代表循环状态的变量名称 |
否 |
无 |
| delims |
分隔符 |
是 |
无 |
0x02.9.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/// 文件名称: jstl_c_fortokens.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html><head> <title>jstl_c_fortokens</title></head><body><c:forTokens items="baidu,taobao,qq" delims="," var="name"> <div><c:out value="${name}"/></div></c:forTokens></body></html>// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_fortokens.jsp
0x02.10
0x02.10.1 语法
<c:param> 标签用于在 <c:url> 标签中指定参数, 而且与 URL 编码相关。在 <c:param> 标签内, name 属性表明参数的名称, value 属性表明参数的值。
<c:param>标签语法格式如下:<c:param name="<string>" value="<string>"/>注: 如果想要向<c:import>标签中传递参数,需要先使用<c:url>标签来创建URL
| 标签有如下属性 |
|
|
|
| 属性 |
描述 |
是否必要 |
默认值 |
| name |
URL中要设置的参数的名称 |
是 |
无 |
| value |
参数的值 |
否 |
Body |
0x02.10.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/// 文件名称: jstl_c_param.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html><head> <title>jstl_c_param</title></head><body><c:url var="myURL" value="http://baiud.com"> <c:param name="name" value="test"/> <c:param name="url" value="www.qq.com"/></c:url><c:out value="${myURL}"/></body></html>// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_param.jsp

0x02.11
0x02.11.1 语法
<c:redirect>标签通过自动重写URL来将浏览器重定向至一个新的URL它提供内容相关的URL, 并且支持<c:param>标签
<c:redirect> 标签语法格式如下:<c:redirect url="<string>" context="<string>"/>注: 如果想要向<c:import>标签中传递参数,需要先使用<c:url>标签来创建URL
| 标签有如下属性 |
|
|
|
| 属性 |
描述 |
必须 |
默认值 |
| url |
目标URL |
是 |
无 |
| context |
紧接着一个本地网络应用程序的名称 |
否 |
当前应用程序 |
0x02.11.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/// 文件名称: jstl_c_redirect.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html><head> <title>jstl_c_redirect</title></head><body><c:redirect url="http://www.qq.com"/></body></html>// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_redirect.jsp// 打开以后会302重定向到http://www.qq.com

0x02.12
0x02.12.1 语法
<c:url> 标签将URL格式化为一个字符串, 然后存储在一个变量中<c:url> 标签会在需要的时候会自动重写URL<c:url> 标签只是用于调用response.encodeURL()方法的一种可选的方法<c:url> 标签真正的优势在于提供了合适的URL编码, 包括<c:param>中指定的参数。
<c:url>标签语法格式如下:<c:url var="<string>" scope="<string>" value="<string>" context="<string>"/>注: var属性用于存储格式化后的URL
| 标签有如下属性 |
|
|
|
| 属性 |
描述 |
必选 |
默认值 |
| value |
基础URL |
是 |
无 |
| context |
本地网络应用程序的名称 |
否 |
当前应用程序 |
| var |
代表URL的变量名 |
否 |
Print to page |
| scope |
var属性的作用域 |
否 |
Page |
0x02.12.2 小例子
// 文件地址: ./src/main/webapp/JSTL库测试/// 文件名称: jstl_c_url.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %><%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %><html><head> <title>jstl_c_url.jsp</title></head><body><c:url value="http://www.qq.com"/></body></html>// 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_url.jsp
