0x01 核心标签

  1. 核心标签是最常用的JSTL标签
  2. 引用核心标签库的语法如下:
  3. <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
标签 描述
用于在JSP中显示数据, 就像<%= … >
用于保存数据
用于删除数据
用来处理产生错误的异常状况, 并且将错误信息储存起来
与我们在一般程序中用的if一样
本身只当做的父标签
的子标签, 用来判断条件是否成立
的子标签, 接在标签后, 当标签判断为false时被执行
检索一个绝对或相对 URL, 然后将其内容暴露给页面
(注: 代码审计时可以看看URL参数是否可控,可控表示有SSRF)
基础迭代标签, 接受多种集合类型
根据指定的分隔符来分隔内容并迭代输出
用来给包含或重定向的页面传递参数
重定向至一个新的URL.
使用可选的查询参数来创造一个URL

0x02 小例子

  1. // 目录结构
  2. ├── src
  3. └── main
  4. └── webapp
  5. └── com
  6. └── ...
  7. └── WEB-INF
  8. └── web.xml
  9. ├── ...
  10. └── JSTL库测试
  11. ├── ...

0x02.1

0x02.1.1 语法

  1. <c:out> 标签用来显示一个表达式的结果
  2. <c:out> 标签与 <%= %>作用相似, 它们的区别就是 <c:out> 标签可以直接通过 "." 操作符访问属性
  3. 举例来说, 如果想要访问 customer.address.street, 只需要这样写: <c:out value="customer.address.street">
  4. <c:out> 标签会自动忽略 XML 标记字符, 所以它们不会被当做标签来处理
  1. <c:out> 标签语法格式如下:
  2. <c:out value="<string>" default="<string>" escapeXml="<true|false>"/>
标签有如下属性
属性 描述 必须 默认值
value 要输出的内容
default 输出的默认值 主体中的内容
escapeXml 是否忽略XML特殊字符 true

0x02.1.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_c_out.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%--引入对应标签--%>
  5. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  6. <html>
  7. <head>
  8. <title>jstl_c_out</title>
  9. </head>
  10. <body>
  11. <div><c:out value="&lt要显示的数据对象(未使用转义字符)&gt" escapeXml="true" default="默认值"></c:out></div>
  12. <div><c:out value="&lt要显示的数据对象(使用转义字符)&gt" escapeXml="false" default="默认值"></c:out></div>
  13. <div><c:out value="${null}" escapeXml="false">使用的表达式结果为null,则输出该默认值</c:out></div>
  14. </body>
  15. </html>
  16. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_out.jsp

image.png

0x02.2

0x02.2.1 语法

  1. <c:set> 标签用于设置变量值和对象属性
  2. <c:set> 标签就是 <jsp:setProperty> 行为标签的孪生兄弟
  3. 这个标签之所以很有用呢, 是因为它会计算表达式的值, 然后使用计算结果来设置JavaBean对象或java.util.Map对象的值
  1. <c:set>标签语法格式如下:
  2. <c:set
  3. var="<string>"
  4. value="<string>"
  5. target="<string>"
  6. property="<string>"
  7. scope="<string>"/>
标签有如下属性
属性 描述 必须 默认值
value 要存储的值 主体的内容
target 要修改的属性所属的对象
property 要修改的属性
var 存储信息的变量
scope var属性的作用域 Page

0x02.2.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_c_set
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%--引入对应标签--%>
  5. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  6. <html>
  7. <head>
  8. <title>jstl_c_set</title>
  9. </head>
  10. <body>
  11. <c:set var="number" scope="session" value="${2000*2}"/>
  12. <div>2000*2=<c:out value="${number}"/></div>
  13. </body>
  14. </html>
  15. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_set.jsp

image.png

0x02.3

0x02.3.1 语法

  1. <c:remove> 标签用于移除一个变量, 可以指定这个变量的作用域, 若未指定, 则默认为变量第一次出现的作用域
  2. 这个标签不是特别有用,不过可以用来确保JSP完成清理工作
  1. <c:remove> 标签语法格式如下:
  2. <c:remove var="<string>" scope="<string>"/>
标签有如下属性
属性 描述 必须 默认值
var 要移除的变量名称
scope 变量所属的作用域 所有作用域

0x02.3.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_c_remove.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%--引入对应标签--%>
  5. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  6. <html>
  7. <head>
  8. <title>jstl_c_remove</title>
  9. </head>
  10. <body>
  11. <c:set var="number" scope="session" value="${2000*2}"/>
  12. <div>number变量值:<c:out value="${number}"/></div>
  13. <c:remove var="number"/>
  14. <div>number变量后的值: <c:out value="${number}"/></div>
  15. </body>
  16. </html>
  17. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_remove.jsp

image.png

0x02.4

0x02.4.1 语法

  1. <c:catch> 标签主要用来处理产生错误的异常状况,并且将错误信息储存起来
  1. <c:catch> 标签语法格式如下:
  2. <c:catch var="<string>">
  3. ...
  4. </c:catch>
标签有如下属性
属性 描述 必须 默认值
var 用来储存错误信息的变量 None

0x02.4.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_c_catch.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  5. <%
  6. java.util.Calendar cal = java.util.Calendar.getInstance();
  7. request.setAttribute("cal", cal);
  8. %>
  9. <c:catch var="myException">
  10. <!-- 错误设置了Calendar对象的time属性值,将抛出异常 -->
  11. <c:set target="${cal}" property="time" value="abcd"/>
  12. </c:catch>
  13. <html>
  14. <head>
  15. <title>jstl_c_catch.jsp</title>
  16. </head>
  17. <body>
  18. <!-- 输出异常对象的相应信息 -->
  19. <div>myException: <c:out value="${myException}"/></div>
  20. <div>myException.getMessage(): <c:out value="${myException.message}"/></div>
  21. <div>myException.getCause(): <c:out value="${myException.stackTrace}"/></div>
  22. </body>
  23. </html>
  24. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_catch.jsp

image.png

0x02.5

0x02.5.1 语法

  1. <c:if> 标签判断表达式的值,如果表达式的值为true,则执行其主体内容
  1. <c:if> 标签语法格式如下:
  2. <c:if test="<boolean>" var="<string>" scope="<string>">
  3. ...
  4. </c:if>
标签有如下属性
属性 描述 必须 默认值
test 条件
var 用于存储条件结果的变量
scope var属性的作用域 page

0x02.5.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_c_if.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  5. <html>
  6. <head>
  7. <title>jstl_c_if</title>
  8. </head>
  9. <body>
  10. <c:set var="salary" scope="session" value="${2000*2}"/>
  11. <c:if test="${salary > 2000}">
  12. <div>我的工资为: <c:out value="${salary}"/><div>
  13. </c:if>
  14. </body>
  15. </html>
  16. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_if.jsp

image.png

0x02.6 //

0x02.6.1 语法

  1. <c:choose>标签与Java switch语句的功能一样,用于在众多选项中做出选择。
  2. switch语句中有case
  3. <c:choose>标签中对应有<c:when>
  4. switch语句中有default
  5. <c:choose>标签中有<c:otherwise>
  1. 语法格式如下:
  2. <c:choose>
  3. <c:when test="<boolean>">
  4. ...
  5. </c:when>
  6. <c:when test="<boolean>">
  7. ...
  8. </c:when>
  9. ...
  10. ...
  11. <c:otherwise>
  12. ...
  13. </c:otherwise>
  14. </c:choose>
  15. <c:choose> 标签没有属性
  16. <c:when> 标签只有一个属性,在下表中有给出。
  17. <c:otherwise> 标签没有属性
标签的属性如下
属性 描述 必须 默认值
test 条件

0x02.6.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_c_choose.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  5. <html>
  6. <head>
  7. <title>jstl_c_choose</title>
  8. </head>
  9. <body>
  10. <c:set var="salary" scope="session" value="${param.salary}"/>
  11. <div>你的工资为: <c:out value="${salary}"/></div>
  12. <c:choose>
  13. <c:when test="${salary <= 0}">
  14. <div>太惨了</div>
  15. </c:when>
  16. <c:when test="${salary > 1000}">
  17. <div>不错的薪水,还能生活</div>
  18. </c:when>
  19. <c:otherwise>
  20. <div>有一丢丢薪水</div>
  21. </c:otherwise>
  22. </c:choose>
  23. </body>
  24. </html>
  25. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_choose.jsp?salary=0
  26. 返回结果:
  27. 你的工资为: 0
  28. 太惨了
  29. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_choose.jsp?salary=200
  30. 返回结果:
  31. 你的工资为: 200
  32. 有一丢丢薪水
  33. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_choose.jsp?salary=4000
  34. 返回结果:
  35. 你的工资为: 4000
  36. 不错的薪水,还能生活

0x02.7

0x02.7.1 语法

  1. <c:import>标签提供了所有<jsp:include>行为标签所具有的功能,同时也允许包含绝对URL
  2. 举例来说,使用<c:import>标签可以包含一个FTP服务器中不同的网页内容
  1. <c:import> 标签语法格式如下:
  2. <c:import
  3. url="<string>"
  4. var="<string>"
  5. scope="<string>"
  6. varReader="<string>"
  7. context="<string>"
  8. charEncoding="<string>"/>
标签有如下属性
属性 描述 是否必要 默认值
url 待导入资源的URL, 可以是相对路径和绝对路径, 并且可以导入其他主机资源
context 当使用相对路径访问外部context资源时, context指定了这个资源的名字。 当前应用程序
charEncoding 所引入的数据的字符编码集 ISO-8859-1
var 用于存储所引入的文本的变量
scope var属性的作用域 page
varReader 可选的用于提供java.io.Reader对象的变量

0x02.7.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_c_import.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  5. <html>
  6. <head>
  7. <title>jstl_c_import.jsp</title>
  8. </head>
  9. <body>
  10. <c:import var="data" url="${param.url}"/>
  11. <c:out value="${data}"/>
  12. </body>
  13. </html>
  14. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_import.jsp?url=./jstl_c_out.jsp
  15. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_import.jsp?url=http://baidu.com

image.png
image.png

0x02.8

0x02.8.1 语法

  1. <c:forEach> 标签用于迭代一个集合中的对象
  1. <c:forEach> 标签语法格式如下:
  2. <c:forEach
  3. items="<object>"
  4. begin="<int>"
  5. end="<int>"
  6. step="<int>"
  7. var="<string>"
  8. varStatus="<string>">
  9. ...
标签有如下属性
属性 描述 是否必要 默认值
items 要被循环的信息
begin 开始的元素(0=第一个元素, 1=第二个元素) 0
end 最后一个元素(0=第一个元素, 1=第二个元素) Last element
step 每一次迭代的步长 1
var 代表当前条目的变量名称
varStatus 代表循环状态的变量名称

0x02.8.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_c_foreach.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  5. <html>
  6. <head>
  7. <title>jstl_c_foreach.jsp</title>
  8. </head>
  9. <body>
  10. <c:forEach var="i" begin="1" end="5">
  11. <div>Item <c:out value="${i}"/></div>
  12. </c:forEach>
  13. </body>
  14. </html>
  15. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_foreach.jsp

image.png

0x02.9

0x02.9.1 语法

  1. <c:forTokens> 标签通过指定分隔符将字符串分隔为一个数组然后迭代它们
  1. <c:forTokens> 语法格式如下:
  2. <c:forTokens
  3. items="<string>"
  4. delims="<string>"
  5. begin="<int>"
  6. end="<int>"
  7. step="<int>"
  8. var="<string>"
  9. varStatus="<string>">
标签有如下属性
属性 描述 必须 默认值
items 要被循环的信息
begin 开始的元素(0=第一个元素) 0
end 最后一个元素(0=第一个元素) Last element
step 每一次迭代的步长 1
var 代表当前条目的变量名称
varStatus 代表循环状态的变量名称
delims 分隔符

0x02.9.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_c_fortokens.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  5. <html>
  6. <head>
  7. <title>jstl_c_fortokens</title>
  8. </head>
  9. <body>
  10. <c:forTokens items="baidu,taobao,qq" delims="," var="name">
  11. <div><c:out value="${name}"/></div>
  12. </c:forTokens>
  13. </body>
  14. </html>
  15. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_fortokens.jsp

0x02.10

0x02.10.1 语法

  1. <c:param> 标签用于在 <c:url> 标签中指定参数, 而且与 URL 编码相关。
  2. <c:param> 标签内, name 属性表明参数的名称, value 属性表明参数的值。
  1. <c:param>标签语法格式如下:
  2. <c:param name="<string>" value="<string>"/>
  3. 注: 如果想要向<c:import>标签中传递参数,需要先使用<c:url>标签来创建URL
标签有如下属性
属性 描述 是否必要 默认值
name URL中要设置的参数的名称
value 参数的值 Body

0x02.10.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_c_param.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  5. <html>
  6. <head>
  7. <title>jstl_c_param</title>
  8. </head>
  9. <body>
  10. <c:url var="myURL" value="http://baiud.com">
  11. <c:param name="name" value="test"/>
  12. <c:param name="url" value="www.qq.com"/>
  13. </c:url>
  14. <c:out value="${myURL}"/>
  15. </body>
  16. </html>
  17. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_param.jsp

image.png

0x02.11

0x02.11.1 语法

  1. <c:redirect>标签通过自动重写URL来将浏览器重定向至一个新的URL
  2. 它提供内容相关的URL, 并且支持<c:param>标签
  1. <c:redirect> 标签语法格式如下:
  2. <c:redirect url="<string>" context="<string>"/>
  3. 注: 如果想要向<c:import>标签中传递参数,需要先使用<c:url>标签来创建URL
标签有如下属性
属性 描述 必须 默认值
url 目标URL
context 紧接着一个本地网络应用程序的名称 当前应用程序

0x02.11.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_c_redirect.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  5. <html>
  6. <head>
  7. <title>jstl_c_redirect</title>
  8. </head>
  9. <body>
  10. <c:redirect url="http://www.qq.com"/>
  11. </body>
  12. </html>
  13. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_redirect.jsp
  14. // 打开以后会302重定向到http://www.qq.com

image.png

0x02.12

0x02.12.1 语法

  1. <c:url> 标签将URL格式化为一个字符串, 然后存储在一个变量中
  2. <c:url> 标签会在需要的时候会自动重写URL
  3. <c:url> 标签只是用于调用response.encodeURL()方法的一种可选的方法
  4. <c:url> 标签真正的优势在于提供了合适的URL编码, 包括<c:param>中指定的参数。
  1. <c:url>标签语法格式如下:
  2. <c:url
  3. var="<string>"
  4. scope="<string>"
  5. value="<string>"
  6. context="<string>"/>
  7. 注: var属性用于存储格式化后的URL
标签有如下属性
属性 描述 必选 默认值
value 基础URL
context 本地网络应用程序的名称 当前应用程序
var 代表URL的变量名 Print to page
scope var属性的作用域 Page

0x02.12.2 小例子

  1. // 文件地址: ./src/main/webapp/JSTL库测试/
  2. // 文件名称: jstl_c_url.jsp
  3. <%@ page contentType="text/html;charset=UTF-8" language="java" %>
  4. <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
  5. <html>
  6. <head>
  7. <title>jstl_c_url.jsp</title>
  8. </head>
  9. <body>
  10. <c:url value="http://www.qq.com"/>
  11. </body>
  12. </html>
  13. // 打开: http://127.0.0.1:8081/mavenJspTest_war/JSTL库测试/jstl_c_url.jsp

image.png