Java的JSTL標(biāo)簽庫詳解
一:深入解析JSTL標(biāo)簽庫
1、什么是JSTL標(biāo)簽庫
①Java Standard Tag Lib(Java標(biāo)準(zhǔn)的標(biāo)簽庫)。
②JSTL標(biāo)簽庫通常結(jié)合EL表達(dá)式一起使用,目的是讓JSP中的java代碼消失。
③標(biāo)簽是寫在JSP當(dāng)中的,但實(shí)際上最終還是要執(zhí)行對應(yīng)的java程序(java程序在jar包當(dāng)中)
2、使用JSTL標(biāo)簽庫的步驟
第一步:引入JSTL標(biāo)簽庫對應(yīng)的jar包
- (1)tomcat9之前引入的jar包是:
- ①taglibs-standard-impl-1.2.5.jar
- ②taglibs-standard-spec-1.2.5.jar
- (2)tomcat10之后引入的jar包是:
- ①jakarta.servlet.jsp.jstl-2.0.0.jar
- ②jakarta.servlet.jsp.jstl-api-2.0.0.jar
- (3)在IDEA當(dāng)中怎么引入?
- ①在WEB-INF下新建lib目錄,然后將jar包拷貝到lib當(dāng)中,選中兩個(gè)jar包右擊鼠標(biāo),點(diǎn)擊“Add Lib...”進(jìn)行添加。
- ②一定是要和mysql的數(shù)據(jù)庫驅(qū)動(dòng)一樣,都是放在WEB-INF/lib目錄下的。
- ③什么時(shí)候需要將jar包放到WEB-INF/lib目錄下?如果這個(gè)jar是tomcat服務(wù)器沒有的。
第二步:在JSP中引入要使用標(biāo)簽庫
①使用taglib指令引入標(biāo)簽庫
②JSTL提供了很多種標(biāo)簽,重點(diǎn)掌握核心標(biāo)簽庫 ://java.sun.com/jsp/jstl/core
③語法格式如下:
prefix="起的名字,核心標(biāo)簽庫,一般默認(rèn)叫做c,可隨意。"
uri=//java.sun.com/jsp/jstl/core 表示使用的是這個(gè)庫
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
第三步: 在需要使用標(biāo)簽的位置使用即可
①表面使用的是標(biāo)簽,底層實(shí)際上還是java程序 。
②例如:<c:catch></c:catch> 實(shí)際上對應(yīng)的就是一個(gè)java類。
3、JSTL標(biāo)簽的原理
- <%@taglib prefix="c" uri="//java.sun.com/jsp/jstl/core" %>以上uri后面的路徑實(shí)際上指向了一個(gè)xxx.tld文件。鼠標(biāo)停留在路徑上,按ctr鍵就會(huì)自動(dòng)顯示對應(yīng)的xxx.tld文件,例如:C:\Users\86177\IdeaProjects\JavaWeb\jsp\web\WEB-INF\lib\taglibs-standard-impl-1.2.5.jar!\META-INF\c.tld
- tld文件實(shí)際上是一個(gè)xml配置文件,在tld文件中描述了“標(biāo)簽”和“java類”之間的關(guān)系。 以上核心標(biāo)簽庫對應(yīng)的tld文件是:c.tld文件。它在taglibs-standard-impl-1.2.5.jar里面META-INF目錄下,有一個(gè)c.tld文件。

- 以里面的catch標(biāo)簽為例,進(jìn)行源碼分析
<tag>
<description> 對標(biāo)簽的描述
Catches any Throwable that occurs in its body and optionally
exposes it.
</description>
<name>catch</name> 標(biāo)簽的名字
<tag-class>
org.apache.taglibs.standard.tag.common.core.CatchTag
</tag-class> 標(biāo)簽對應(yīng)的java類
<body-content>JSP</body-content>標(biāo)簽體當(dāng)中可以出現(xiàn)的內(nèi)容,如果是JSP,就表示標(biāo)簽體中可以出現(xiàn)符合JSP所有語法的代碼。例如EL表達(dá)式(屬于JSP的)。
<attribute> 屬性
<description> 對這個(gè)屬性的描述
Name of the exported scoped variable for the
exception thrown from a nested action. The type of the
scoped variable is the type of the exception thrown.
</description>
<name>var</name> 屬性名
<required>false</required> false表示該屬性不是必須的。true表示該屬性是必須的。
<rtexprvalue>false</rtexprvalue> 這個(gè)描述說明了該屬性是否支持EL表達(dá)式。false表示不支持。true表示支持EL表達(dá)式。
</attribute>
</tag>- 所以對于catch標(biāo)簽的語法格式如下:
<c:catch var=""> JSP.... </c:catch>
- 以foreach標(biāo)簽進(jìn)行舉例說明,通過源碼分析,發(fā)現(xiàn)foreach標(biāo)簽有一個(gè)items屬性,這個(gè)屬性是可以指向一個(gè)集合的,并且也支持EL表達(dá)式;還有一個(gè)var屬性,var后面的名字是隨意的,var屬性代表的是集合中的每一個(gè)元素。
- 所以現(xiàn)在就可以使用EL表達(dá)式來代替我們原來我們用java代碼使用增強(qiáng)for循環(huán)取出數(shù)據(jù)的過程!
<%@ page import="com.bjpowernode.javaweb.jsp.Student" %>
<%@ page import="java.util.*" %>
<%@page contentType="text/html; charset=UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
// 創(chuàng)建List集合
List<Student> stuList = new ArrayList<>();
// 創(chuàng)建Student對象
Student s1 = new Student("110", "經(jīng)常");
Student s2 = new Student("120", "救護(hù)車");
Student s3 = new Student("119", "消防車");
// 添加到List集合中
stuList.add(s1);
stuList.add(s2);
stuList.add(s3);
// 將list集合存儲到request域當(dāng)中
request.setAttribute("stuList", stuList);
%>
<%--第一種方式:使用Java代碼,把for循環(huán)拆分了,看起來很詭異--%>
<%
/// 從域中獲取List集合
List<Student> stus = (List<Student>)request.getAttribute("stuList");
// 編寫for循環(huán)遍歷list集合
for(Student stu: stus){
%>
id:<%=stu.getId()%>,name:<%=stu.getName()%><br>
<%
}
%>
<%--第二種方式:使用JSTL標(biāo)簽庫中的forEach標(biāo)簽,非常簡明、美觀--%>
<c:forEach items="${stuList}" var="s">
id:${s.id},name:${s.name}<br>
</c:forEach>- 進(jìn)行測試訪問://localhost:8080/jsp/17.jsp 發(fā)現(xiàn)這兩種方式都能取出數(shù)據(jù)!

4、jstl中的核心標(biāo)簽庫core當(dāng)中常用的標(biāo)簽
(1)if標(biāo)簽
- ①語法格式:<c:if test=" "></c: if> 。
- ②test屬性是必須的,test屬性支持EL表達(dá)式;test屬性值只能是boolean類型。
- ③if標(biāo)簽還有var屬性,不是必須的;v變量中存儲的是test屬性的值。
- ④還有scope屬性,用來指定var的存儲域,也不是必須的。scope有四個(gè)值可選:page(pageContext域)、request(request域)、session(session域)、application(application域)
<%@page contentType="text/html;charset=UTF-8" %>
<%--引入核心標(biāo)簽庫--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--if標(biāo)簽,test屬性是必須的--%>
<c:if test="${empty param.username}">
<h1>用戶名不能為空</h1>
</c:if>
<c:if test="${not empty param.username}" var="v" scope="request">
<h1>歡迎${param.username}登錄</h1>
</c:if>
<%--通過EL表達(dá)式將request域當(dāng)中的v取出--%>
${v}發(fā)送請求//localhost:8080/jsp/18.jsp?????? ,前端沒有傳入username,后端就取不到數(shù)據(jù),調(diào)用隱式對象param.username返回的就是一個(gè)false;所以變量v取出來的也就是false

發(fā)送請求//localhost:8080/jsp/18.jsp?username=zhangsan,前端傳入username為張三,后端就能取到數(shù)據(jù),調(diào)用隱式對象param.username返回的就是一個(gè)true;所以變量v取出來的也就是true

(2)forEach標(biāo)簽
①<c:forEach var="i" begin="1" end="10" step="2"> ${i} </c: forEach> ;var用來指定循環(huán)中的變量;begin開始;end結(jié)束;step步長。forEach底層實(shí)際上會(huì)將i存儲到pageContext域當(dāng)中;因?yàn)镋L表達(dá)式只能從某個(gè)域當(dāng)中取數(shù)據(jù)!
<%@ page contentType="text/html;charset=UTF-8"%>
<%--引入核心標(biāo)簽庫--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%--forEach底層實(shí)際上:會(huì)將i存儲到pageContext域當(dāng)中--%>
<c:forEach var="i" begin="1" end="10" step="2">
<%--所以這里才會(huì)使用EL表達(dá)式將其取出,因?yàn)镋L表達(dá)式只能從某個(gè)域當(dāng)中取數(shù)據(jù)--%>
${i}
</c:forEach>執(zhí)行結(jié)果如下:

②varStatus屬性:表示var的狀態(tài)對象,這里是一個(gè)java對象,這個(gè)java對象代表了var的狀態(tài);并且varStatus這個(gè)狀態(tài)對象有count屬性,可以直接使用。
<%@ page import="com.bjpowernode.javaweb.jsp.Student" %>
<%@ page import="java.util.*" %>
<%@ page contentType="text/html;charset=UTF-8"%>
<%--引入核心標(biāo)簽庫--%>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<%
// 創(chuàng)建List集合
List<Student> stuList = new ArrayList<>();
// 創(chuàng)建Student對象
Student s1 = new Student("110", "經(jīng)常");
Student s2 = new Student("120", "救護(hù)車");
Student s3 = new Student("119", "消防車");
// 添加到List集合中
stuList.add(s1);
stuList.add(s2);
stuList.add(s3);
// 將list集合存儲到request域當(dāng)中
request.setAttribute("stuList", stuList);
%>
<c:forEach items="${stuList}" var="s" varStatus="stuStatus">
<%--varStatus的count值從1開始,以1遞增,主要是用于編號/序號。--%>
編號:${stuStatus.count} ,id:${s.id},name:${s.name} <br>
</c:forEach>執(zhí)行結(jié)果:

(3)choose-when-otherwise
①這實(shí)際上是一個(gè)嵌套結(jié)構(gòu),語法格式是固定的,不能隨意使用!
<%@page contentType="text/html;charset=UTF-8" %>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<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>執(zhí)行結(jié)果:

到此這篇關(guān)于Java的JSTL標(biāo)簽庫詳解的文章就介紹到這了,更多相關(guān)JSTL標(biāo)簽庫內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java類比C++的STL庫詳解
- Java使用BouncyCastle加密
- java:程序包org.bouncycastle.jce.provider不存在問題及解決
- Java通用BouncyCastle實(shí)現(xiàn)的DES3加密的方法
- 詳解javaweb中jstl如何循環(huán)List中的Map數(shù)據(jù)
- JavaWeb開發(fā)之JSTL標(biāo)簽庫的使用、 自定義EL函數(shù)、自定義標(biāo)簽(帶屬性的、帶標(biāo)簽體的)
- 在JSTL EL中處理java.util.Map,及嵌套List的情況
- Java實(shí)現(xiàn)STL中的全排列函數(shù)next_permutation()
相關(guān)文章
基于Spring開發(fā)之自定義標(biāo)簽及其解析
Spring框架是現(xiàn)在Java最流行的開源框架之一,需要實(shí)現(xiàn)一些自定義的標(biāo)簽,主要是方便使用我們框架的人能夠快速、簡單進(jìn)行配置,有興趣的可以了解一下。2017-04-04
老生常談Java中List與ArrayList的區(qū)別
大家都知道List是接口,ArrayList是List接口的一個(gè)實(shí)現(xiàn)類,接下來通過本文給大家介紹Java中List與ArrayList的區(qū)別,需要的朋友可以參考下2022-08-08
詳解Elasticsearch如何把一個(gè)索引變?yōu)橹蛔x
這篇文章主要為大家介紹了詳解Elasticsearch如何把一個(gè)索引變?yōu)橹蛔x示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-02-02
一文探索Apache HttpClient如何設(shè)定超時(shí)時(shí)間
Apache HttpClient是一個(gè)流行的Java庫,用于發(fā)送HTTP請求,這篇文章主要為大家介紹了Apache HttpClient如何設(shè)定超時(shí)時(shí)間,感興趣的小伙伴可以學(xué)習(xí)一下2023-10-10
JAVA自定義注解實(shí)現(xiàn)接口/ip限流的示例代碼
本文主要介紹了JAVA自定義注解實(shí)現(xiàn)接口/ip限流的示例代碼,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2023-07-07
Spring中的@ModelAttribute模型屬性綁定詳解
這篇文章主要介紹了Spring中的@ModelAttribute模型屬性綁定詳解,@ModelAttribute用于將方法參數(shù)或返回值綁定到Model屬性上,并公開給Web視圖,支持使用@RequestMapping注釋的Controller類,需要的朋友可以參考下2024-02-02

