欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java的JSTL標(biāo)簽庫(kù)詳解

 更新時(shí)間:2023年05月17日 08:56:20   作者:@每天都要敲代碼  
JSTL包含用于編寫和開發(fā)JSP頁(yè)面的一組標(biāo)準(zhǔn)標(biāo)簽,它可以為用戶提供一個(gè)無(wú)腳本環(huán)境。在此環(huán)境中,用戶可以使用標(biāo)簽編寫代碼,而無(wú)須使用Java腳本

一:深入解析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}&nbsp;
</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} &nbsp;,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)文章希望大家以后多多支持腳本之家!

相關(guān)文章

最新評(píng)論