英文全称:Java Standard Tag Lib(Java标准的标签库)
使用目的:JSTL标签库通常结合EL表达式一起使用。目的是让JSP中的java代码消失。
使用位置:JSTL标签是写在JSP当中的,但实际上最终还是要执行对应的java程序。(java程序在jar包当中。)
使用JSTL标签库的步骤:
第一步:引入JSTL标签库对应的jar包。
tomcat10之前引入的jar包是:
taglibs-standard-impl-1.2.1.jar
taglibs-standard-spec-1.2.1.jar
tomcat10之后引入的jar包是:
jakarta.servlet.jsp.jstl-2.0.0.jar
jakarta.servlet.jsp.jstl-api-2.0.0.jar
在IDEA当中引入的操作:
在WEB-INF下新建lib目录,然后将jar包拷贝到lib当中。然后选中jar包,右击鼠标,点击“Add Lib...”
JSTL的jar包一定是要和mysql的数据库驱动一样,都是放在WEB-INF/lib目录下的。
什么时候需要将jar包放到WEB-INF/lib目录下?
回答:如果这个jar包是tomcat服务器没有的就需要放到WEB-INF/lib目录下。
第二步:在JSP文件中引入要使用标签库。(使用taglib指令引入标签库。)
JSTL提供了很多种标签,你要引入哪个标签?重点掌握核心标签库。
<%@taglib prefix="c" uri="Oracle Java Technologies | Oracle" %>这个就是核心标签库。
prefix="这里随便起一个名字就行了,核心标签库,大家默认的叫做c,你随意。"说是随意,但是最好跟随大家的脚步。
第三步:在需要使用标签的位置使用即可。表面上使用的是标签,底层实际上还是java程序。
JSTL标签的原理
JSP文件中使用<%@taglib prefix="c" uri="Oracle Java Technologies | Oracle" %>引入核心库标签
以上uri后面的路径实际上指向了一个xxx.tld文件。
1.tld文件实际上是一个xml配置文件。
2.在tld文件中描述了“标签”和“java类”之间的关系。
3.以上核心标签库对应的tld文件是:c.tld文件。它在哪里。
回答:在jakarta.servlet.jsp.jstl-2.0.0.jar里面META-INF目录下,有一个c.tld文件。
源码解析:配置文件tld解析
<tag>
<description>以下内容是对该标签的描述</description>
<name>catch</name> 标签的名字是catch
<tag-class>org.apache.taglibs.standard.tag.common.core.CatchTag</tag-class> 标签对应的java类。
<body-content>JSP</body-content> 标签体当中可以出现的内容,如果是JSP,就表示标签体中可以出现符合JSP所有语法的代码。例如EL表达式。
<attribute>
<description>对这个属性的描述</description>
<name>var</name> 属性名
<required>false</required> false表示该属性不是必须的。true表示该属性是必须的。
<rtexprvalue>false</rtexprvalue> 这个描述说明了该属性是否支持EL表达式。false表示不支持。true表示支持EL表达式。
</attribute>
</tag>
以下是JSP文件中的使用:
<%@taglib prefix="c" uri="Oracle Java Technologies | Oracle" %>
<c:catch var="">
JSP....
</c:catch>
JSTL中的核心标签库core当中常用的标签如下:
1.c:if
<body>
<%--
<c:if/>
if标签用来做if判断。
test属性表示判断的条件(使用EL表达式输出)
--%>
<%-- 如果test="${66 == 66}"条件为真 输出66等于66 --%>
<c:if test="${66 == 66}">
<h1>66等于66</h1>
</c:if>
<%-- 如果test="${66 != 66}"条件为真 输出66不等于66 --%>
<c:if test="${66 != 66}">
<h1>66不等于66</h1>
</c:if>
</body>
2.c:foreach (下面代码是完整的JSP页面代码,介绍foreach标签的使用)
<%@pageimport="java.util.Map"%>
<%@pageimport="java.util.HashMap"%>
<%@pageimport="java.util.List"%>
<%@pageimport="com.bjpowernode.entity.Person"%>
<%@pageimport="java.util.ArrayList"%>
<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
<%@pagecontentType="text/html;charset=UTF-8"language="java"%>
<html>
<head>
<title>foreach标签</title>
</head>
<body>
<%--
1.遍历1到10,并输出。
begin属性设置开始的索引
end属性设置结束的索引
var属性表示循环的变量(也是当前正在遍历到的数据)
类似Java中的代码:
for(inti=1; i<10; i++){
System.out.print(i);
}
--%>
<c:forEach begin="1" end="10" var="i">
${i}
</c:forEach>
<hr>
<c:forEach begin="1" end="10" var="i">
${i}<br/>
</c:forEach>
<hr>
<tableborder="1">
<c:forEach begin="1" end="10" var="i">
<tr>
<td>第${i}行</td>
</tr>
</c:forEach>
</table>
<hr>
<c:forEach var="i" begin="1" end="9">
<h1>${i}</h1>
</c:forEach>
<%--
2.遍历Object数组
items表示遍历的数据源(遍历的集合)
var表示当前遍历到的数据
--%>
<%--下面首先准备一个Object数组并添加到请求作用域中成为共享数据--%>
<%
request.setAttribute("array",newString[]{"abc","111","good"});
%>
<c:forEach items="${requestScope.array}" var="item">
${item}
</c:forEach>
<hr>
<%--
3.遍历Map集合
items表示被遍历的集合
var表示遍历到的元素
--%>
<%--下面我们现在先准备一个Map集合,并存入到请求作用域中--%>
<%
Map<String,Object> map = newHashMap<>();
map.put("key1","value1");
map.put("key2","value2");
map.put("key3","value3");
request.setAttribute("map",map);
%>
<c:forEach items="${requestScope.map}" var="entry">
${entry}<br/>
</c:forEach>
<hr/>
<%--
4.遍历List集合
items表示遍历的集合
var表示遍历到的数据
begin表示遍历开始的索引值
end表示结束遍历的索引值
step表示遍历的步长值也就是i++或者i+=2...
varStatus表示当前遍历到的数据的状态
比如:varStatus="status"
status就具有如下方法:
status.getCurrent获取当前遍历到的数据
status.getIndex获取遍历到的索引值
status.getCount获取遍历数据的个数
status.isFirst当前遍历的数据是否是第一条
status.isLast当前遍历的数据是否是最后一条
status.getBegin获取属性begin的值
status.getEnd获取属性end的值
status.getStep获取属性step的值
--%>
<%
List<Person> personList = newArrayList<Person>();
personList.add(newPerson(1,"张三","123",18,"13033335555"));
personList.add(newPerson(2,"李四","123",19,"13033334444"));
personList.add(newPerson(3,"王五","123",22,"13033333333"));
personList.add(newPerson(4,"赵六","123",20,"13033336666"));
personList.add(newPerson(5,"孙七","123",21,"13033337777"));
request.setAttribute("list",personList);
%>
<tableBORDER="1">
<tr>
<th>编号</th>
<th>姓名</th>
<th>密码</th>
<th>年龄</th>
<th>电话</th>
<th>操作</th>
</tr>
<c:forEachitems="${requestScope.list}"var="preson">
<tr>
<td>${preson.id}</td>
<td>${preson.name}</td>
<td>${preson.pwd}</td>
<td>${preson.age}</td>
<td>${preson.phone}</td>
<td>修改/删除</td>
</tr>
</c:forEach>
</table>
</body>
</html>
程序运行之后,浏览器页面显示效果如下:
3.<c:choose> <c:when> <c:otherwise>标签 (下面代码是完整的JSP页面代码,介绍这几个标签的使用)
<%@taglibprefix="c"uri="http://java.sun.com/jsp/jstl/core"%>
<%@pagecontentType="text/html;charset=UTF-8"language="java"%>
<html>
<head>
<title>choose-when-otherwise</title>
</head>
<body>
<%--
<c:choose><c:when><c:otherwise>标签
作用:多路判断。跟switch...case....default非常接近
choose标签开始选择判断
when标签表示每一种判断情况
test属性表示当前这种判断情况的值
otherwise标签表示剩下的情况
<c:choose><c:when><c:otherwise>标签使用时需要注意的点:
1、标签里不能使用html注释,要使用jsp注释
2、when标签的父标签一定要是choose标签
--%>
<%-- 在请求作用域中存入数据 --%>
<%
request.setAttribute("height",150);
%>
<c:choose>
<c:when test="${requestScope.height>=190}">
<h2>小巨人</h2>
</c:when>
<c:when test="${requestScope.height>=180}">
<h2>很高</h2>
</c:when>
<c:when test="${requestScope.height>=170}">
<h2>还可以</h2>
</c:when>
<c:otherwise>
<c:choose>
<c:when test="${requestScope.height>160}">
<h3>大于160</h3>
</c:when>
<c:when test="${requestScope.height>150}">
<h3>大于150</h3>
</c:when>
<c:when test="${requestScope.height>140}">
<h3>大于140</h3>
</c:when>
<c:otherwise>
其他小于140
</c:otherwise>
</c:choose>
</c:otherwise>
</c:choose>
</body>
</html>
程序运行之后,在浏览器页面显示结果如下: