Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 Warning: error_log(/data/www/wwwroot/hmttv.cn/caches/error_log.php): failed to open stream: Permission denied in /data/www/wwwroot/hmttv.cn/phpcms/libs/functions/global.func.php on line 537 中文字幕手机在线视频,亚洲校园激情,精品哟哟哟国产在线不卡

          整合營銷服務(wù)商

          電腦端+手機(jī)端+微信端=數(shù)據(jù)同步管理

          免費咨詢熱線:

          JSP 標(biāo)準(zhǔn)標(biāo)簽庫(JSTL)

          JSP標(biāo)準(zhǔn)標(biāo)簽庫(JSTL)是一個JSP標(biāo)簽集合,它封裝了JSP應(yīng)用的通用核心功能。

          JSTL支持通用的、結(jié)構(gòu)化的任務(wù),比如迭代,條件判斷,XML文檔操作,國際化標(biāo)簽,SQL標(biāo)簽。 除了這些,它還提供了一個框架來使用集成JSTL的自定義標(biāo)簽。

          根據(jù)JSTL標(biāo)簽所提供的功能,可以將其分為5個類別。

          • 核心標(biāo)簽

          • 格式化標(biāo)簽

          • SQL 標(biāo)簽

          • XML 標(biāo)簽

          • JSTL 函數(shù)

          JSTL 庫安裝

          Apache Tomcat安裝JSTL 庫步驟如下:

          從Apache的標(biāo)準(zhǔn)標(biāo)簽庫中下載的二進(jìn)包(jakarta-taglibs-standard-current.zip)。

          • 官方下載地址:http://archive.apache.org/dist/jakarta/taglibs/standard/binaries/

          • 本站下載地址:jakarta-taglibs-standard-1.1.2.zip

          下載jakarta-taglibs-standard-1.1.2.zip 包并解壓,將jakarta-taglibs-standard-1.1.2/lib/下的兩個jar文件:standard.jar和jstl.jar文件拷貝到/WEB-INF/lib/下。

          接下來我們在 web.xml 文件中添加以下配置:

          <?xml version="1.0" encoding="UTF-8"?><web-app version="2.4"

          xmlns="http://java.sun.com/xml/ns/j2ee"

          xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

          xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee

          http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

          <jsp-config>

          <taglib>

          <taglib-uri>http://java.sun.com/jstl/fmt</taglib-uri>

          <taglib-location>/WEB-INF/fmt.tld</taglib-location>

          </taglib>

          <taglib>

          <taglib-uri>http://java.sun.com/jstl/fmt-rt</taglib-uri>

          <taglib-location>/WEB-INF/fmt-rt.tld</taglib-location>

          </taglib>

          <taglib>

          <taglib-uri>http://java.sun.com/jstl/core</taglib-uri>

          <taglib-location>/WEB-INF/c.tld</taglib-location>

          </taglib>

          <taglib>

          <taglib-uri>http://java.sun.com/jstl/core-rt</taglib-uri>

          <taglib-location>/WEB-INF/c-rt.tld</taglib-location>

          </taglib>

          <taglib>

          <taglib-uri>http://java.sun.com/jstl/sql</taglib-uri>

          <taglib-location>/WEB-INF/sql.tld</taglib-location>

          </taglib>

          <taglib>

          <taglib-uri>http://java.sun.com/jstl/sql-rt</taglib-uri>

          <taglib-location>/WEB-INF/sql-rt.tld</taglib-location>

          </taglib>

          <taglib>

          <taglib-uri>http://java.sun.com/jstl/x</taglib-uri>

          <taglib-location>/WEB-INF/x.tld</taglib-location>

          </taglib>

          <taglib>

          <taglib-uri>http://java.sun.com/jstl/x-rt</taglib-uri>

          <taglib-location>/WEB-INF/x-rt.tld</taglib-location>

          </taglib>

          </jsp-config></web-app>

          使用任何庫,你必須在每個JSP文件中的頭部包含<taglib>標(biāo)簽。

          核心標(biāo)簽

          核心標(biāo)簽是最常用的JSTL標(biāo)簽。引用核心標(biāo)簽庫的語法如下:

          <%@ taglib prefix="c"

          uri="http://java.sun.com/jsp/jstl/core" %>

          標(biāo)簽描述
          <c:out>用于在JSP中顯示數(shù)據(jù),就像<%= ... >
          <c:set>用于保存數(shù)據(jù)
          <c:remove>用于刪除數(shù)據(jù)
          <c:catch>用來處理產(chǎn)生錯誤的異常狀況,并且將錯誤信息儲存起來
          <c:if>與我們在一般程序中用的if一樣
          <c:choose>本身只當(dāng)做<c:when>和<c:otherwise>的父標(biāo)簽
          <c:when><c:choose>的子標(biāo)簽,用來判斷條件是否成立
          <c:otherwise><c:choose>的子標(biāo)簽,接在<c:when>標(biāo)簽后,當(dāng)<c:when>標(biāo)簽判斷為false時被執(zhí)行
          <c:import>檢索一個絕對或相對 URL,然后將其內(nèi)容暴露給頁面
          <c:forEach>基礎(chǔ)迭代標(biāo)簽,接受多種集合類型
          <c:forTokens>根據(jù)指定的分隔符來分隔內(nèi)容并迭代輸出
          <c:param>用來給包含或重定向的頁面?zhèn)鬟f參數(shù)
          <c:redirect>重定向至一個新的URL.
          <c:url>使用可選的查詢參數(shù)來創(chuàng)造一個URL

          格式化標(biāo)簽

          JSTL格式化標(biāo)簽用來格式化并輸出文本、日期、時間、數(shù)字。引用格式化標(biāo)簽庫的語法如下:

          <%@ taglib prefix="fmt"

          uri="http://java.sun.com/jsp/jstl/fmt" %>

          標(biāo)簽描述
          <fmt:formatNumber>使用指定的格式或精度格式化數(shù)字
          <fmt:parseNumber>解析一個代表著數(shù)字,貨幣或百分比的字符串
          <fmt:formatDate>使用指定的風(fēng)格或模式格式化日期和時間
          <fmt:parseDate>解析一個代表著日期或時間的字符串
          <fmt:bundle>綁定資源
          <fmt:setLocale>指定地區(qū)
          <fmt:setBundle>綁定資源
          <fmt:timeZone>指定時區(qū)
          <fmt:setTimeZone>指定時區(qū)
          <fmt:message>顯示資源配置文件信息
          <fmt:requestEncoding>設(shè)置request的字符編碼

          SQL標(biāo)簽

          JSTL SQL標(biāo)簽庫提供了與關(guān)系型數(shù)據(jù)庫(Oracle,MySQL,SQL Server等等)進(jìn)行交互的標(biāo)簽。引用SQL標(biāo)簽庫的語法如下:

          <%@ taglib prefix="sql"

          uri="http://java.sun.com/jsp/jstl/sql" %>

          標(biāo)簽描述
          <sql:setDataSource>指定數(shù)據(jù)源
          <sql:query>運行SQL查詢語句
          <sql:update>運行SQL更新語句
          <sql:param>將SQL語句中的參數(shù)設(shè)為指定值
          <sql:dateParam>將SQL語句中的日期參數(shù)設(shè)為指定的java.util.Date 對象值
          <sql:transaction>在共享數(shù)據(jù)庫連接中提供嵌套的數(shù)據(jù)庫行為元素,將所有語句以一個事務(wù)的形式來運行

          XML 標(biāo)簽

          JSTL XML標(biāo)簽庫提供了創(chuàng)建和操作XML文檔的標(biāo)簽。引用XML標(biāo)簽庫的語法如下:

          <%@ taglib prefix="x"

          uri="http://java.sun.com/jsp/jstl/xml" %>

          在使用xml標(biāo)簽前,你必須將XML 和 XPath 的相關(guān)包拷貝至你的<Tomcat 安裝目錄>\lib下:

          • XercesImpl.jar

            下載地址: http://www.apache.org/dist/xerces/j/

          • xalan.jar

            下載地址: http://xml.apache.org/xalan-j/index.html

          標(biāo)簽描述
          <x:out>與<%= ... >,類似,不過只用于XPath表達(dá)式
          <x:parse>解析 XML 數(shù)據(jù)
          <x:set>設(shè)置XPath表達(dá)式
          <x:if>判斷XPath表達(dá)式,若為真,則執(zhí)行本體中的內(nèi)容,否則跳過本體
          <x:forEach>迭代XML文檔中的節(jié)點
          <x:choose><x:when>和<x:otherwise>的父標(biāo)簽
          <x:when><x:choose>的子標(biāo)簽,用來進(jìn)行條件判斷
          <x:otherwise><x:choose>的子標(biāo)簽,當(dāng)<x:when>判斷為false時被執(zhí)行
          <x:transform>將XSL轉(zhuǎn)換應(yīng)用在XML文檔中
          <x:param>與<x:transform>共同使用,用于設(shè)置XSL樣式表

          JSTL函數(shù)

          JSTL包含一系列標(biāo)準(zhǔn)函數(shù),大部分是通用的字符串處理函數(shù)。引用JSTL函數(shù)庫的語法如下:

          <%@ taglib prefix="fn"

          uri="http://java.sun.com/jsp/jstl/functions" %>

          函數(shù)描述
          fn:contains()測試輸入的字符串是否包含指定的子串
          fn:containsIgnoreCase()測試輸入的字符串是否包含指定的子串,大小寫不敏感
          fn:endsWith()測試輸入的字符串是否以指定的后綴結(jié)尾
          fn:escapeXml()跳過可以作為XML標(biāo)記的字符
          fn:indexOf()返回指定字符串在輸入字符串中出現(xiàn)的位置
          fn:join()將數(shù)組中的元素合成一個字符串然后輸出
          fn:length()返回字符串長度
          fn:replace()將輸入字符串中指定的位置替換為指定的字符串然后返回
          fn:split()將字符串用指定的分隔符分隔然后組成一個子字符串?dāng)?shù)組并返回
          fn:startsWith()測試輸入字符串是否以指定的前綴開始
          fn:substring()返回字符串的子集
          fn:substringAfter()返回字符串在指定子串之后的子集
          fn:substringBefore()返回字符串在指定子串之前的子集
          fn:toLowerCase()將字符串中的字符轉(zhuǎn)為小寫
          fn:toUpperCase()將字符串中的字符轉(zhuǎn)為大寫
          fn:trim()移除首位的空白符

          如您還有不明白的可以在下面與我留言或是與我探討QQ群308855039,我們一起飛!

          本系列文章旨在記錄和總結(jié)自己在Java Web開發(fā)之路上的知識點、經(jīng)驗、問題和思考,希望能幫助更多(Java)碼農(nóng)和想成為(Java)碼農(nóng)的人。
          

          1. 介紹
          2. JSTL規(guī)范下載
          3. JSTL包含哪些庫
          4. JSTL如何使用
          5. 租房網(wǎng)應(yīng)用中使用JSTL
          6. JSTL相關(guān)的JAR包
          7. EL表達(dá)式訪問列表的長度
          8. JSTL的forEach標(biāo)簽
          9. 剩下的頁面改造
          10. 總結(jié)

          介紹

          上篇文章我們使用JSP技術(shù)對租房網(wǎng)平臺進(jìn)行了改造,也提到下面這樣的代碼有點奇葩:

          <%for (House house : mockHouses) { 
          	System.out.println(house); %>
          	<li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=<%=house.getId() %>"><%=house.getName() %></a></h2></li>
          <%} %>
          

          像這樣的代碼我們可以使用JSTL技術(shù)來解決。當(dāng)然,JSTL可不僅僅只有這點功能,你還可以定義自己的標(biāo)簽。

          在這篇文章里,我提到過JSTL是JSP相關(guān)的技術(shù),從它的名字全稱(JSP Standard Tag Library,即JSP標(biāo)準(zhǔn)標(biāo)簽庫)就可以看出來。

          在本篇文章里,我們就嘗試初步使用JSTL來進(jìn)一步改造我們的租房網(wǎng)應(yīng)用。

          JSTL規(guī)范下載

          既然稱之為庫,那么它包含哪些庫呢?

          我們可以把JSTL規(guī)范下載下來看一下,當(dāng)然你也可以找本相關(guān)書籍,或者直接在網(wǎng)上搜索一下。

          JSTL規(guī)范的下載類似Servlet規(guī)范的下載(可以參考這篇文章),不過我們在JCP官網(wǎng)(https://jcp.org/en/home/index)中搜索的關(guān)鍵字就變成Tag或Tag Library了。

          我們在搜索結(jié)果中就可以看到:

          點擊 Download page 鏈接可以看到:

          然后繼續(xù)點擊底部的 Maintenance Review 2 of JSR 52 鏈接,跳轉(zhuǎn)到:

          不過,再次點擊DOWNLOAD按鈕時,我這邊出現(xiàn)無法訪問此網(wǎng)站的錯誤。所以我轉(zhuǎn)而點擊底部的 JSR-000052 A Standard Tag Library for JavaServer Pages Detail Page 鏈接:

          從這里我們可以看到JSTL規(guī)范的各個階段,我們選擇 Maintenance Release 2 這個階段,點擊它右邊的 Download page 鏈接:

          然后再點擊紅色箭頭所指的鏈接,跳轉(zhuǎn)到真正的下載頁面:

          后續(xù)操作就跟Servlet規(guī)范的下載類似了。

          JSTL包含哪些庫

          現(xiàn)在,我們可以打開JSTL規(guī)范,可以看到如下描述:

          事實上,JSTL應(yīng)該就只是一個庫,但它根據(jù)不同功能而劃分成了多個庫:

          • 核心:變量支持、流控制、URL管理等等,它的命名空間URI是:http://java.sun.com/jsp/jstl/core,標(biāo)簽前綴通常使用:c
          • XML處理:它的命名空間URI是:http://java.sun.com/jsp/jstl/xml,標(biāo)簽前綴通常使用:x
          • 國際化:語言區(qū)域、消息格式化、數(shù)字和日期格式化等,它的命名空間URI是:http://java.sun.com/jsp/jstl/fmt,標(biāo)簽前綴通常使用:fmt
          • 數(shù)據(jù)庫訪問(SQL):它的命名空間URI是:http://java.sun.com/jsp/jstl/sql,標(biāo)簽前綴通常使用:sql
          • 函數(shù):集合長度、字符串操作等,它的命名空間URI是:http://java.sun.com/jsp/jstl/functions,標(biāo)簽前綴通常使用:fn

          JSTL如何使用

          JSTL的終極目標(biāo)是簡化JSP頁面的開發(fā),所以,它應(yīng)該是在JSP頁面中使用。

          既然是標(biāo)簽,那它的使用是否跟HTML標(biāo)簽、XML標(biāo)簽類似呢?答案是肯定的。

          不過,JSTL標(biāo)簽的使用與XML標(biāo)簽使用時聲明命名空間類似,也需要告訴Servlet/JSP容器該JSP頁面需要引入某個庫(即上述的核心、XML處理、國際化、數(shù)據(jù)庫訪問、函數(shù)等等,以及以后自定義的標(biāo)簽)。

          在JSP頁面中是使用一個JSP指令(即taglib指令,之前我們用過page指令)來聲明的:

          <%@ taglib uri="uri" prefix="prefix" %>
          

          舉個例子,假設(shè)我們要使用JSTL的核心庫,則應(yīng)該在JSP頁面的開頭處這樣聲明:

          <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
          

          然后,就可以使用核心庫的標(biāo)簽,比如out標(biāo)簽:

          <c:out value="value" [escapeXml="{true|false}"] [default="defaultValue"]/>
          <c:out value="value" [escapeXml="{true|false}"]>
           default value
          </c:out>
          

          注意:在標(biāo)簽的語法中,[]表示可選的屬性。如果值帶下劃線,則表示為默認(rèn)值。

          out標(biāo)簽有兩種形式,有屬性和屬性值,也可能有標(biāo)簽內(nèi)容,跟HTML標(biāo)簽和XML標(biāo)簽類似。

          租房網(wǎng)應(yīng)用中使用JSTL

          我們就拿租房網(wǎng)應(yīng)用中的房源列表頁面houses.jsp來使用JSTL改造,因為這里涉及列表數(shù)據(jù)的展示。

          列表數(shù)據(jù)是很常見的,我們經(jīng)常可以看到包含列表數(shù)據(jù)的頁面,比如訂單列表、商品列表等等。

          houses.jsp原來的代碼是這樣的:

          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
          <%@ include file="include.jsp"%>
          <%
          	List<House> mockHouses = (List<House>) request.getAttribute("mockHouses");
          	System.out.println(mockHouses);
          %>
          <h6>共找到你感興趣的房源 <%=mockHouses.size() %> 條</h6>
          <ul>
          <%for (House house : mockHouses) { 
          	System.out.println(house); %>
          	<li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=<%=house.getId() %>"><%=house.getName() %></a></h2></li>
          <%} %>
          </ul>
          </body>
          </html>
          

          首先要引入JSTL中的核心庫(因為我們后面要用到的forEach標(biāo)簽是屬于核心庫的):

          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
          <%@ include file="include.jsp"%>
          <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
          

          遺憾的是,我們添加這句聲明之后,Eclipse就報錯了:

          提示是說找不到這個標(biāo)簽庫的描述符。那就根據(jù)這個提示在網(wǎng)上搜索答案唄。

          答案就是原來我們還需要在我們的工程結(jié)構(gòu)里配置JSTL相關(guān)的JAR包,而Tomcat這個Servlet/JSP容器本身不提供這些JSTL相關(guān)的JAR包,我們需要單獨下載。

          JSTL相關(guān)的JAR包

          那么在哪里下載呢?既然我們是使用Tomcat這個Servlet/JSP容器,那么我們就可以到它的官網(wǎng)(http://tomcat.apache.org/)上看看:

          我們可以看到左側(cè)導(dǎo)航欄中有個Taglibs鏈接,我們點進(jìn)去看看:

          還真就是JSTL相關(guān)JAR包的下載頁面,點擊Download鏈接進(jìn)去,可以找到真正的下載鏈接:

          我們可以看下Binary README文件,里面有該JAR包版本支持的Tomcat和JSP等版本信息,如果我們使用的Tomcat是最新版本(9.0.x),那直接下載下面四個JAR包即可,否則需要點進(jìn)Archives頁面下載歷史版本。

          好,我們把四個JAR包下載下來之后,就可以添加到我們的租房網(wǎng)應(yīng)用的工程里面了,可以參考這篇文章。

          實際上,直接把這四個JAR包拷貝到WebContent/WEB-INF/lib節(jié)點下是最快的。

          現(xiàn)在,我們可以看到上述的Eclipse報錯提示就消失了。

          EL表達(dá)式訪問列表的長度

          首先,我們可以使用EL表達(dá)式來訪問列表的長度:

          <h6>共找到你感興趣的房源 ${mockHouses.size()} 條</h6>
          

          據(jù)說低版本的JSP容器不可以這樣直接用EL表達(dá)式來訪問列表的長度,而應(yīng)該使用JSTL的函數(shù)庫中的length方法:

          ${fn:length(list) }
          

          當(dāng)然,首先需要引入JSTL的函數(shù)庫。讀者朋友可以自行嘗試一下。

          JSTL的forEach標(biāo)簽

          我們可以通過JSTL規(guī)范查看一下這個forEach標(biāo)簽的用法:

          當(dāng)然,可能只看這個語法格式還是不太明白如何使用,那么可以繼續(xù)看規(guī)范中的描述,或者直接網(wǎng)上搜索即可。

          我們需要改造的代碼是這一部分:

          <%for (House house : mockHouses) { 
          	System.out.println(house); %>
          	<li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=<%=house.getId() %>"><%=house.getName() %></a></h2></li>
          <%} %>
          

          我們可以先把它注釋掉(在Eclipse中可以選中這一段,然后鍵入Ctrl + Shift + /),然后敲入開始標(biāo)簽的左尖括號 < ,于是Eclipse會出現(xiàn)智能提示:

          嗯,這個功能還是挺好用的,提高開發(fā)效率。

          閑話不多說了,直接上代碼:

          <c:forEach var="house" items="${mockHouses}">
          	<li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=${house.id}">${house.name}</a></h2></li>
          </c:forEach>
          

          看似跟之前變化不大,但至少沒那么奇葩了,風(fēng)格也與HTML很一致。

          forEach標(biāo)簽遍歷列表數(shù)據(jù)的基本屬性是:

          • var:相當(dāng)于定義一個變量來表示指向列表中的某一項;
          • items:指定需要遍歷哪個列表,需要注意的是其值又是使用EL表達(dá)式來訪問頁面/請求/會話/應(yīng)用中的某個屬性數(shù)據(jù)(即使用setAttribute()添加的對象)

          forEach標(biāo)簽的內(nèi)容就可以是普通的HTML標(biāo)簽了,然后HTML標(biāo)簽里我們就可以使用EL表達(dá)式來訪問列表中每一項數(shù)據(jù)。

          實際上,EL表達(dá)式直接訪問對象的屬性,而非調(diào)用對象的方法,比如:

          ${house.id}
          

          注意,param是EL的隱式對象,它是由Servlet/JSP容器創(chuàng)建并傳進(jìn)來的,它可以直接訪問請求所攜帶的參數(shù)。

          所以,我們實際上可以把原來的這一部分:

          <%
          	List<House> mockHouses = (List<House>) request.getAttribute("mockHouses");
          	System.out.println(mockHouses);
          %>
          

          刪除掉。

          現(xiàn)在houses.jsp的代碼就變成這樣了:

          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
          <%@ include file="include.jsp"%>
          <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
          <h6>共找到你感興趣的房源 ${mockHouses.size()} 條</h6>
          <ul>
          <c:forEach var="house" items="${mockHouses}">
          	<li><h2><a href="house-details.jsp?userName=${param.userName}&houseId=${house.id}">${house.name}</a></h2></li>
          </c:forEach>
          </ul>
          </body>
          </html>
          

          是不是清晰明朗了許多?

          當(dāng)然,JSP頁面的開發(fā)者必須知道傳進(jìn)這個頁面的到底有哪些數(shù)據(jù)對象!

          沒錯,這就相當(dāng)于把數(shù)據(jù)的展示(視圖層)給分離開來,你需要與后端(控制器層和模型層)約定/設(shè)計好每一個JSP頁面都有哪些數(shù)據(jù)對象。

          然后,JSP頁面的開發(fā)者和后端(控制器層和模型層)的開發(fā)者就可以各自獨立去開發(fā)了。

          剩下的頁面改造

          剩下的house-details.jsp和house-form.jsp該如何改造呢?大家可以先思考一下。

          提示:JSP頁面應(yīng)該只關(guān)心取數(shù)據(jù)展示,而不應(yīng)該關(guān)心如何查找到某個數(shù)據(jù)這種邏輯,應(yīng)該把這種邏輯放到后端(控制器層和模型層)。

          我的改造是這樣的,把原來這兩個頁面的如何查找到某個數(shù)據(jù)這種邏輯放到Filter中,前后端約定好這兩個頁面中存在target這個House對象,于是doFilter()方法中在將請求交給下個節(jié)點之前應(yīng)該掛載上target這個House對象:

          		if (userName == null || userName.isEmpty()) {
          			System.out.println("invalid user!");
          			httpServletResponse.sendRedirect("login.html");
          		} else {
          			String houseId = httpServletRequest.getParameter("houseId");
          			if (houseId != null && !houseId.trim().isEmpty()) {
          				House target = findHouseById(houseId);//找不到怎么辦?
          				httpServletRequest.setAttribute("target", target);
          			}
          			chain.doFilter(request, response);
          		}
          

          另外,應(yīng)該把如何查找某個房源的邏輯封裝起來:

          	private House findHouseById(String houseId) {
          		for (House house : mockHouses) {
          			if (houseId.equals(house.getId())) {
          				return house;
          			}
          		}
          		return null;
          	}
          

          然后,這兩個頁面就極其簡單了,house-details.jsp是這樣的:

          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
          <%@ include file="include.jsp"%>
          <h2>${target.name}<a href="house-form.jsp?userName=${param.userName}&houseId=${target.id}">編輯</a></h2>
          <h3>${target.detail}</h3>
          <h4><a href="houses.jsp?userName=${param.userName}">回到列表</a></h4>
          </body>
          </html>
          

          house-form.jsp是這樣的:

          <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
          <%@ include file="include.jsp"%>
          <form action="house-form.servlet" method="post">
          <input type="hidden" name="userName" value="${param.userName}"/>
          <input type="hidden" name="houseId" value="${target.id}"/>
          <label for="house_name">房源名字:</label><input type="text" id="house_name" name="houseName" value="${target.name}" />
          <label for="house_detail">房源詳細(xì)信息:</label><input type="text" id="house_detail" name="houseDetail" value="${target.detail}" />
          <input type="submit" value="提交" />
          </form>
          </body>
          </html>
          

          可以看到,這兩個頁面只是取數(shù)據(jù)(target這個House對象)展示而已。

          總結(jié)

          • JSTL的終極目標(biāo)是簡化JSP開發(fā);
          • JSTL的使用需要先聲明某個庫;
          • JSTL的標(biāo)簽使用類似HTML標(biāo)簽和XML標(biāo)簽,語法規(guī)則可以查看JSTL規(guī)范;
          • JSP頁面使用JSTL和EL表達(dá)式基本可以實現(xiàn)大部分功能;
          • EL表達(dá)式能夠直接訪問頁面/請求/會話/應(yīng)用這幾個對象中掛載(即setAttribute()方法)的數(shù)據(jù)對象;
          • EL表達(dá)式使用 ${ }
          • EL中存在隱式對象,以后再介紹;
          • 列表數(shù)據(jù)很常見很重要;
          • 列表數(shù)據(jù)采用JSTL的forEach標(biāo)簽來遍歷(實際上也可以采用EL表達(dá)式,比如${mockHouses[i].id});
          • 前后端開發(fā)的分離:前端只關(guān)心取數(shù)據(jù)如何展示;后端關(guān)心如何取數(shù)據(jù)并掛載到頁面/請求/會話/應(yīng)用這幾個對象中;
          • 前后端需約定/設(shè)計好數(shù)據(jù);

          然JSTL提供了很多豐富的標(biāo)簽,但是在某些情況下,這些標(biāo)簽還是不能夠滿足我們的業(yè)務(wù)需求,所以sun公司也提供了自定義標(biāo)簽的功能,可以根據(jù)實際業(yè)務(wù)需求創(chuàng)建相應(yīng)的標(biāo)簽。自定義標(biāo)簽在一些很老的項目中會經(jīng)常見到,因為那個時候基本上是基于Servlet和JSP進(jìn)行項目的開發(fā),為了應(yīng)對自身的項目需求,每個公司都會自己創(chuàng)建自己的標(biāo)簽庫,從而簡化開發(fā),提高開發(fā)效率。

          自定義JSTL標(biāo)簽只需要下面幾個步驟即可:

          1. 第一步:創(chuàng)建一個類,繼承自SimpleTagSupport類。
          2. 第二步:重寫doTag()方法,在這個方法中實現(xiàn)自定義標(biāo)簽的處理邏輯。
          3. 第三步:在WEB-INF目錄下面,創(chuàng)建對應(yīng)標(biāo)簽的tld描述文件。
          4. 第四步:在JSP頁面中,通過<%@taglib%>指令自定義標(biāo)簽即可。

          1.1、繼承SimpleTagSupport

          創(chuàng)建一個CustomTag類,繼承自SimpleTagSupport類,重寫doTag()方法。

          package com.gitcode.tag;
          
          import javax.servlet.jsp.JspException;
          import javax.servlet.jsp.JspWriter;
          import javax.servlet.jsp.tagext.JspFragment;
          import javax.servlet.jsp.tagext.SimpleTagSupport;
          import java.io.IOException;
          import java.io.StringWriter;
          
          /**
           * 自定義JSTL標(biāo)簽
           */
          public class CustomTag extends SimpleTagSupport {
              /**
               * 自定義標(biāo)簽屬性
               */
              private String content;
              /**
               * 標(biāo)簽體內(nèi)容
               */
              private StringWriter body = new StringWriter();
          
              public void setContent(String content) {
                  this.content = content;
              }
          
              @Override
              public void doTag() throws JspException, IOException {
                  // 1、獲取輸出流對象
                  JspWriter writer = this.getJspContext().getOut();
                  if (content == null) {
                      // 屬性等于空,則直接獲取標(biāo)簽之間的body內(nèi)容
                      JspFragment jspBody = this.getJspBody();
                      // 調(diào)用方法
                      jspBody.invoke(body);
                      // 輸出內(nèi)容
                      writer.println(body.toString());
                  } else {
                      // 如果屬性名稱不為空,則輸出屬性名稱的內(nèi)容
                      writer.println(content);
                  }
              }
          }

          1.2、創(chuàng)建tld描述文件

          在WEB-INF目錄下,我們創(chuàng)建一個tld目錄,用于保存我們自定義JSTL標(biāo)簽的tld描述文件,tld描述文件中,需要編寫如下內(nèi)容:

          <?xml version="1.0" encoding="UTF-8" ?>
          
          <taglib xmlns="http://java.sun.com/xml/ns/j2ee"
                  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd"
                  version="2.0">
          
              <tlib-version>1.1</tlib-version>
              <short-name>custom_tag</short-name>
          
              <tag>
                  <description>自定義JSTL標(biāo)簽的描述內(nèi)容</description>
                  <name>custom_tag</name>
                  <tag-class>com.gitcode.tag.CustomTag</tag-class>
                  <!-- 標(biāo)簽之間的內(nèi)容是腳本 -->
                  <body-content>scriptless</body-content>
                  <attribute>
                      <description>屬性的描述內(nèi)容</description>
                      <name>content</name>
                      <required>false</required>
                      <rtexprvalue>true</rtexprvalue>
                  </attribute>
              </tag>
          </taglib>

          如下圖所示:

          1.3、使用自定義標(biāo)簽

          新建一個custom.jsp頁面,使用<%@taglib%>指令引入自定義標(biāo)簽,如下所示:

          <%@ page contentType="text/html;charset=UTF-8" language="java" %>
          <%-- 引入標(biāo)簽庫 --%>
          <%@ taglib prefix="custom_tag" uri="WEB-INF/tld/custom_tag.tld" %>
          <html>
          <head>
              <title>JSTL標(biāo)簽庫之自定義標(biāo)簽</title>
          </head>
          <body>
              <h3>JSTL標(biāo)簽庫之自定義標(biāo)簽</h3>
              <custom_tag:custom_tag content="content屬性內(nèi)容"></custom_tag:custom_tag>
          
              <h3>JSTL標(biāo)簽庫之自定義標(biāo)簽</h3>
              <custom_tag:custom_tag>
                  <ul>
                      <li>第一行</li>
                      <li>第二行</li>
                      <li>第三行</li>
                  </ul>
              </custom_tag:custom_tag>
          </body>
          </html>

          運行結(jié)果如下所示:

          需要注意的是,prefix屬性值必須和custom_tag.tld描述文件中的<short-name>標(biāo)簽值保持一致,否則無法引用自定義標(biāo)簽

          以上,就是JSTL自定義標(biāo)簽的使用,創(chuàng)建自定義標(biāo)簽可以將公用的代碼封裝起來,后續(xù)要使用的時候,可以減少代碼的開發(fā),從而提高開發(fā)效率。

          今天就到這里,未完待續(xù)~~


          主站蜘蛛池模板: 精品久久国产一区二区三区香蕉| 精品91一区二区三区| 久久久人妻精品无码一区| 国产一区二区三区乱码| 亚洲一区二区三区电影| 亚洲AV无码片一区二区三区| 国产一区二区精品久久凹凸 | 日本精品一区二区在线播放| 国产视频一区在线观看| 精品一区二区三区在线观看l| aⅴ一区二区三区无卡无码| 亚洲国产精品综合一区在线 | 自慰无码一区二区三区| 亚洲AV无码一区二区三区电影| 无码午夜人妻一区二区三区不卡视频| 国产成人一区二区在线不卡| 国产大秀视频在线一区二区| 精品日韩在线视频一区二区三区 | 一区二区高清在线观看| 日本在线视频一区二区三区| 亚洲一区二区三区高清不卡| 精品久久一区二区| 成人精品视频一区二区三区| 高清一区高清二区视频| 精品无码综合一区二区三区| 国产日韩一区二区三区| 亚洲伦理一区二区| 国产一区二区三区在线| 亚洲一区二区三区乱码在线欧洲| 无码精品国产一区二区三区免费| 国产人妖在线观看一区二区| 国产亚洲一区二区三区在线不卡| 亚洲AV日韩AV一区二区三曲| 国产伦精品一区二区三区不卡| 一区二区三区免费视频观看| 日韩精品中文字幕无码一区| 国产精品男男视频一区二区三区| 成人在线一区二区| 国产伦精品一区二区免费| 国产AV国片精品一区二区| 精品国产日韩亚洲一区|