JSP Standard Tag Library JSP 标准标签库,JSP 为开发者提供的一系列的标签,使用这些标签可以完成
一些逻辑处理,比如循环遍历集合,让代码更加简洁,不再出现 JSP 脚本穿插的情况。
实际开发中 EL 和 JSTL 结合起来使用,JSTL 侧重于逻辑处理,EL 负责展示数据。

JSTL 的使用

1、需要导入 jar 包(两个 jstl.jar standard.jar)存放的位置 web/WEB-INF

2、在 JSP 页面开始的地方导入 JSTL 标签库

  • 核心标签库:
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
  • 格式化标签库:
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
  • 函数标签库:
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>

JSTL 优点:

1、提供了统一的标签

2、可以用于编写各种动态功能

​ 核心标签库常用标签:
​ set、out、remove、catch

out和set

<c:out value="" default="" escapeXml=""/>

c:out:输出

value:可以是字符串常量,也可以是EL表达式
default:当要输出的内容为null时,会输出default指定的值
escapeXml:默认值为true,表示转义!

c:out具有的优越性,当value的值不存在时可以用 default输出指定的值,不至于让用户不知道发生了什么事。

<c:set  value="" var="" scope="page"/>

c:set:设置(创建域的属性)

var:变量名
value:变量值,可以是EL表达式
scope:域,默认为page,可选值:page、request、session、application

<c:set var="name" value="王五" scope="page"/>
${name}<br>
<%
    User user=new User("张三",20,60.0);
    request.setAttribute("user",user);
%>
${user.name}<br>
<c:set target="${user}" property="name" value="李四"/>
${user.name}

输出:

set也有一定局限性,只能用来修改或者设置一个字面量,不能处理一个对象!

remove

<c:remove var="" scope="page"/>

< remove>:删除域变量

var:变量名
scope:如果不给出scope,表示删除所有域中的该名称的变量;如果指定了域,那么只删除该域的变量。

<c:set var="name" value="张三" />
<c:out value="${name}" default="未定义"/><br>
<c:remove var="name" scope="page" />
<c:out value="${name}" default="未定义"/>

截图:

)

if:对应java中的if语句

<c:if test="">
     
</c:if>

<c:if test="布尔类型">...</c:if>,当test为真值时,执行标签体内容!

choose:它对应java中的if/else if/ ... /else

例如:

<c:choose>
  <c:when test="">xxx</c:when>
  <c:when test="">yyy</c:when>
  <c:when test="">zzz</c:when>
   ... 
  <c:otherwise> other</c:otherwise>
</c:choose>

等同与

if(...) {
} else if( ....) {
} else if( ....) {
} else if( ....) {
} ...
else { ...}
<c:set var="num1" value="1"></c:set>
<c:set var="num2" value="2"></c:set>
<c:if test="${num1>num2}">ok</c:if>
<c:if test="${num1<num2}">fail</c:if>
<hr/>
<c:choose>
<c:when test="${num1>num2}">ok</c:when>
<c:otherwise>fail</c:otherwise>
</c:choose>

forEach

它用来循环遍历数组、集合!

<c:forEach items="${strs }" var="str">
${str }<br/>
</c:forEach>

等同于

for(String str : strs) {
  ...
}

属性:

items:指定要循环谁,它可以是一个数组或一个集合
var:把数组或集合中的每个元素赋值给var指定的变量。它还可以用来计数方式来循环!

计数方式:

<c:forEach var="i" begin="1" end="10">
  ${i}
</c:forEach>

等同于

for(int i = 1; i <= 10; i++) {
  ...
}

常用属性:

var:循环变量
begin:设置循环变量从几开始。
end:设置循环变量到几结束。
step:设置步长!等同与java中的i++,或i+=2。step默认为1

循环状态

可以使用varStatus来创建循环状态变量!
循环状态变量有如下属性:
count:循环元素的个数
index:循环元素的下标
first:是否为第一个元素
last:是否为最后一个元素
current:当前元素

<c:forEach items="${list }" var="ele" varStatus="vs">
    ${vs.index} ${vs.count } ${vs.first } ${vs.last } ${vs.current }<br/>
</c:forEach>

catch:捕获异常

var : 设置异常的变量

<c:catch var="error">
<%
int a = 10/0;
%>
</c:catch>
${error}

截图:

)

格式化标签库常用的标签:

<%
request.setAttribute("date",new Date());
%>
<fmt:formatDate value="${date}" pattern="yyyy-MM-dd HH:mm:ss">
</fmt:formatDate><br/>
<fmt:formatNumber value="32145.23434" maxIntegerDigits="2"
maxFractionDigits="3"></fmt:formatNumber>

函数标签库常用的标签:

<%
request.setAttribute("info","Java,C");
%>
${fn:contains(info,"Python")}<br/>
${fn:startsWith(info, "Java")}<br/>
${fn:endsWith(info, "C")}<br/>
${fn:indexOf(info, "va")}<br/>
${fn:replace(info, "C","Python")}<br/>
${fn:substring(info, 2, 3)}<br/>
${fn:split(info, ",")[0]}-${fn:split(info, ",")[1]}

Q.E.D.


于浩歌狂热之际中寒;于天上看见深渊。于一切眼中看见无所有;于无所希望中得救。