什么是JSTL标签库?
- java Standard Tag Lib(java标准的标签库)
- JSTL标签库通常结合EL表达式一起使用
- 标签是写在JSP当中的,但实际上最终还是要执行对应的java代码(java程序在jar包当中)
使用JSTL的目的
- 代替JSP中的java代码
使用JSTL标签库的步骤
-
引入JSTL标签库对应的jar包
- tomcat10之后引入的jar包是
- tomcat9之前引入的jar包是
- IDEA工具怎样引入?
- 把以上对应的jar包,放在WEB-INF目录下的lib目录(目录不存在就新建)中,然后右键菜单点击“Add as Library…”项
-
在JSP中引入要使用标签库(使用taglib指令引入标签库)
-
JSTL提供了很多标签,我们这里重点掌握的是核心标签库,所以以引入核心标签库为例。
<%-- 核心标签库,这里prefix的值可以顺便写,一般写c --%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%-- 格式化标签库 --%> <%@taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <%-- sql标签库 --%> <%@taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %>
-
-
使用标签,表面使用的是标签,底层实际还是调用了java程序
<%-- 用法 --%> <c:if test=""></c:if>
JSTL中的核心标签库core当中有哪些常用的标签?
if标签
<%@page contentType="text/html;charset=UTF-8" %>
<%--引入核心标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--if标签--%>
<%--test属性是必须的,test属性支持EL表达式,test属性值只能是boolean类型--%>
<%--http://127.0.0.1:8080/jstl/02.jsp--%>
<c:if test="${empty param.username}">
<h1>用户名不能为空!</h1>
</c:if>
<%--http://127.0.0.1:8080/jstl/02.jsp?username=zhangsan--%>
<c:if test="${not empty param.username}">
<h1>欢迎你${param.username}</h1>
</c:if>
forEach标签
注意:需要在JSP页面上方引入标签库
<%@page contentType="text/html;charset=UTF-8" %>
<%--引入核心标签库--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
案例1
<c:forEach var="i" begin="1" end="10" step="2">
${i}<br>
</c:forEach>
案例2
<%
List<Student> list = new ArrayList<>();
Student stu1 = new Student("zhangsan", "男");
Student stu2 = new Student("lisi", "男");
Student stu3 = new Student("wangwu", "男");
Student stu4 = new Student("zhaoliu", "女");
list.add(stu1);
list.add(stu2);
list.add(stu3);
list.add(stu4);
// 将list集合存储到request域中
request.setAttribute("stuList", list);
%>
<%--需求:遍历集合中的数据,并输出到浏览器--%>
<%--使用java代码--%>
<%
List<Student> stuList = (List<Student>) request.getAttribute("stuList");
for (Student stu: stuList) {
%>
<%=stu.getName()%>、<%=stu.getSex()%><br/>
<%
}
%>
<%-- 使用标签实现效果 --%>
<%--varStatus:元素状态对象--%>
<c:forEach items="${stuList}" var="s" varStatus="stuStatus">
${stuStatus.count}、${s.name}、${s.sex}<br/>
</c:forEach>
Student.java
package com.bz.web.bean;
import java.util.Objects;
public class Student {
private String name;
private String sex;
public Student() {
}
public Student(String name, String sex) {
this.name = name;
this.sex = sex;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
@Override
public String toString() {
return "Student{" +
"name='" + name + '\'' +
", sex='" + sex + '\'' +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Student student = (Student) o;
return name.equals(student.name) && sex.equals(student.sex);
}
@Override
public int hashCode() {
return Objects.hash(name, sex);
}
}
案例3
<%--类似:switch--%>
<%--http://127.0.0.1:8080/jstl/02.jsp?age=17--%>
<c:choose>
<c:when test="${param.age < 18}">青少年</c:when>
<c:when test="${param.age < 35}">青年</c:when>
<c:when test="${param.age < 55}">中年</c:when>
<c:otherwise>老年</c:otherwise>
</c:choose>
JSTL标签源码分析
<tag>
<description>
标签描述
</description>
<name>catch</name> 标签的名字
<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:表示该属性不是必须的,可以不写
<rtexprvalue>false</rtexprvalue> 这个描述说明了该属性是否支持EL表达式,false:表示不支持EL表达式
</attribute>
</tag>
用法:
<c:catch var="">
JSP...
</c:catch>