Java的JSTL標(biāo)簽庫(kù)詳解
一:深入解析JSTL標(biāo)簽庫(kù)
1、什么是JSTL標(biāo)簽庫(kù)
①Java Standard Tag Lib(Java標(biāo)準(zhǔn)的標(biāo)簽庫(kù))。
②JSTL標(biāo)簽庫(kù)通常結(jié)合EL表達(dá)式一起使用,目的是讓JSP中的java代碼消失。
③標(biāo)簽是寫在JSP當(dāng)中的,但實(shí)際上最終還是要執(zhí)行對(duì)應(yīng)的java程序(java程序在jar包當(dāng)中)
2、使用JSTL標(biāo)簽庫(kù)的步驟
第一步:引入JSTL標(biāo)簽庫(kù)對(duì)應(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ù)庫(kù)驅(qū)動(dòng)一樣,都是放在WEB-INF/lib目錄下的。
- ③什么時(shí)候需要將jar包放到WEB-INF/lib目錄下?如果這個(gè)jar是tomcat服務(wù)器沒(méi)有的。
第二步:在JSP中引入要使用標(biāo)簽庫(kù)
①使用taglib指令引入標(biāo)簽庫(kù)
②JSTL提供了很多種標(biāo)簽,重點(diǎn)掌握核心標(biāo)簽庫(kù) ://java.sun.com/jsp/jstl/core
③語(yǔ)法格式如下:
prefix="起的名字,核心標(biāo)簽庫(kù),一般默認(rèn)叫做c,可隨意。"
uri=//java.sun.com/jsp/jstl/core 表示使用的是這個(gè)庫(kù)
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
第三步: 在需要使用標(biāo)簽的位置使用即可
①表面使用的是標(biāo)簽,底層實(shí)際上還是java程序 。
②例如:<c:catch></c:catch> 實(shí)際上對(duì)應(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)顯示對(duì)應(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)簽庫(kù)對(duì)應(yīng)的tld文件是:c.tld文件。它在taglibs-standard-impl-1.2.5.jar里面META-INF目錄下,有一個(gè)c.tld文件。
- 以里面的catch標(biāo)簽為例,進(jìn)行源碼分析
<tag> <description> 對(duì)標(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)簽對(duì)應(yīng)的java類 <body-content>JSP</body-content>標(biāo)簽體當(dāng)中可以出現(xiàn)的內(nèi)容,如果是JSP,就表示標(biāo)簽體中可以出現(xiàn)符合JSP所有語(yǔ)法的代碼。例如EL表達(dá)式(屬于JSP的)。 <attribute> 屬性 <description> 對(duì)這個(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è)描述說(shuō)明了該屬性是否支持EL表達(dá)式。false表示不支持。true表示支持EL表達(dá)式。 </attribute> </tag>
- 所以對(duì)于catch標(biāo)簽的語(yǔ)法格式如下:
<c:catch var=""> JSP.... </c:catch>
- 以foreach標(biāo)簽進(jìn)行舉例說(shuō)明,通過(guò)源碼分析,發(fā)現(xiàn)foreach標(biāo)簽有一個(gè)items屬性,這個(gè)屬性是可以指向一個(gè)集合的,并且也支持EL表達(dá)式;還有一個(gè)var屬性,var后面的名字是隨意的,var屬性代表的是集合中的每一個(gè)元素。
- 所以現(xiàn)在就可以使用EL表達(dá)式來(lái)代替我們?cè)瓉?lái)我們用java代碼使用增強(qiáng)for循環(huán)取出數(shù)據(jù)的過(guò)程!
<%@ 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對(duì)象 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集合存儲(chǔ)到request域當(dāng)中 request.setAttribute("stuList", stuList); %> <%--第一種方式:使用Java代碼,把for循環(huán)拆分了,看起來(lái)很詭異--%> <% /// 從域中獲取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)簽庫(kù)中的forEach標(biāo)簽,非常簡(jiǎn)明、美觀--%> <c:forEach items="${stuList}" var="s"> id:${s.id},name:${s.name}<br> </c:forEach>
- 進(jìn)行測(cè)試訪問(wèn)://localhost:8080/jsp/17.jsp 發(fā)現(xiàn)這兩種方式都能取出數(shù)據(jù)!
4、jstl中的核心標(biāo)簽庫(kù)core當(dāng)中常用的標(biāo)簽
(1)if標(biāo)簽
- ①語(yǔ)法格式:<c:if test=" "></c: if> 。
- ②test屬性是必須的,test屬性支持EL表達(dá)式;test屬性值只能是boolean類型。
- ③if標(biāo)簽還有var屬性,不是必須的;v變量中存儲(chǔ)的是test屬性的值。
- ④還有scope屬性,用來(lái)指定var的存儲(chǔ)域,也不是必須的。scope有四個(gè)值可選:page(pageContext域)、request(request域)、session(session域)、application(application域)
<%@page contentType="text/html;charset=UTF-8" %> <%--引入核心標(biāo)簽庫(kù)--%> <%@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> <%--通過(guò)EL表達(dá)式將request域當(dāng)中的v取出--%> ${v}
發(fā)送請(qǐng)求//localhost:8080/jsp/18.jsp?????? ,前端沒(méi)有傳入username,后端就取不到數(shù)據(jù),調(diào)用隱式對(duì)象param.username返回的就是一個(gè)false;所以變量v取出來(lái)的也就是false
發(fā)送請(qǐng)求//localhost:8080/jsp/18.jsp?username=zhangsan,前端傳入username為張三,后端就能取到數(shù)據(jù),調(diào)用隱式對(duì)象param.username返回的就是一個(gè)true;所以變量v取出來(lái)的也就是true
(2)forEach標(biāo)簽
①<c:forEach var="i" begin="1" end="10" step="2"> ${i} </c: forEach> ;var用來(lái)指定循環(huán)中的變量;begin開始;end結(jié)束;step步長(zhǎng)。forEach底層實(shí)際上會(huì)將i存儲(chǔ)到pageContext域當(dāng)中;因?yàn)镋L表達(dá)式只能從某個(gè)域當(dāng)中取數(shù)據(jù)!
<%@ page contentType="text/html;charset=UTF-8"%> <%--引入核心標(biāo)簽庫(kù)--%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%--forEach底層實(shí)際上:會(huì)將i存儲(chǔ)到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)對(duì)象,這里是一個(gè)java對(duì)象,這個(gè)java對(duì)象代表了var的狀態(tài);并且varStatus這個(gè)狀態(tài)對(duì)象有count屬性,可以直接使用。
<%@ page import="com.bjpowernode.javaweb.jsp.Student" %> <%@ page import="java.util.*" %> <%@ page contentType="text/html;charset=UTF-8"%> <%--引入核心標(biāo)簽庫(kù)--%> <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <% // 創(chuàng)建List集合 List<Student> stuList = new ArrayList<>(); // 創(chuàng)建Student對(duì)象 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集合存儲(chǔ)到request域當(dāng)中 request.setAttribute("stuList", stuList); %> <c:forEach items="${stuList}" var="s" varStatus="stuStatus"> <%--varStatus的count值從1開始,以1遞增,主要是用于編號(hào)/序號(hào)。--%> 編號(hào):${stuStatus.count} ,id:${s.id},name:${s.name} <br> </c:forEach>
執(zhí)行結(jié)果:
(3)choose-when-otherwise
①這實(shí)際上是一個(gè)嵌套結(jié)構(gòu),語(yǔ)法格式是固定的,不能隨意使用!
<%@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)簽庫(kù)詳解的文章就介紹到這了,更多相關(guān)JSTL標(biāo)簽庫(kù)內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
- java類比C++的STL庫(kù)詳解
- Java使用BouncyCastle加密
- java:程序包org.bouncycastle.jce.provider不存在問(wèn)題及解決
- Java通用BouncyCastle實(shí)現(xiàn)的DES3加密的方法
- 詳解javaweb中jstl如何循環(huán)List中的Map數(shù)據(jù)
- JavaWeb開發(fā)之JSTL標(biāo)簽庫(kù)的使用、 自定義EL函數(shù)、自定義標(biāo)簽(帶屬性的、帶標(biāo)簽體的)
- 在JSTL EL中處理java.util.Map,及嵌套List的情況
- Java實(shí)現(xiàn)STL中的全排列函數(shù)next_permutation()
相關(guān)文章
SpringBoot集成redis實(shí)現(xiàn)共享存儲(chǔ)session
這篇文章主要介紹了SpringBoot集成redis實(shí)現(xiàn)共享存儲(chǔ)session的流程步驟,文中通過(guò)代碼示例介紹的非常詳細(xì),并總結(jié)了一些常見的錯(cuò)誤及解決方法,需要的朋友可以參考下2024-03-03Java 在volatile內(nèi)部調(diào)用接口的方法
在Java中,volatile?關(guān)鍵字通常用于確保變量的可見性和有序性,而不是用來(lái)修飾接口或方法調(diào)用的,這篇文章主要介紹了Java 在volatile內(nèi)部調(diào)用接口的方法,需要的朋友可以參考下2024-07-07mybatis查詢返回Map<String,Object>類型的講解
這篇文章主要介紹了mybatis查詢返回Map<String,Object>類型的講解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-06關(guān)于對(duì)Java正則表達(dá)式"\\"的理解
正則表達(dá)式中,\代表轉(zhuǎn)義字符,通常是轉(zhuǎn)義一些特殊字符,下面這篇文章主要給大家介紹了關(guān)于對(duì)Java正則表達(dá)式"\\"的相關(guān)理解,需要的朋友可以參考下2022-09-09mybatis中@Param注解總是報(bào)取不到參數(shù)問(wèn)題及解決
這篇文章主要介紹了mybatis中@Param注解總是報(bào)取不到參數(shù)問(wèn)題及解決方案,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-07-07Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例
這篇文章主要介紹了Spring Cloud Alibaba 使用 Feign+Sentinel 完成熔斷的示例,幫助大家更好的理解和學(xué)習(xí)使用Spring Cloud,感興趣的朋友可以了解下2021-03-03Java運(yùn)行時(shí)動(dòng)態(tài)生成類實(shí)現(xiàn)過(guò)程詳解
這篇文章主要介紹了Java運(yùn)行時(shí)動(dòng)態(tài)生成類實(shí)現(xiàn)過(guò)程詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-07-07java實(shí)現(xiàn)識(shí)別二維碼圖片功能方法詳解與實(shí)例源碼
這篇文章主要介紹了java實(shí)現(xiàn)識(shí)別二維碼圖片,java無(wú)法識(shí)別二維碼情況下對(duì)二維碼圖片調(diào)優(yōu)功能方法與實(shí)例源碼,需要的朋友可以參考下2022-12-12解決SpringCloud下spring-boot-maven-plugin插件的打包問(wèn)題
這篇文章主要介紹了SpringCloud下spring-boot-maven-plugin插件的打包問(wèn)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-03-03