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