JSP第五篇【JSTL的介紹繁仁、core標簽庫涉馅、fn方法庫、fmt標簽庫】

什么是JSTL

JSTL全稱為 JSP Standard Tag Library 即JSP標準標簽庫黄虱。

JSTL作為最基本的標簽庫稚矿,提供了一系列的JSP標簽,實現(xiàn)了基本的功能:集合的遍歷捻浦、數(shù)據(jù)的輸出晤揣、字符串的處理、數(shù)據(jù)的格式化等等朱灿!

為什么要使用JSTL

  • EL表達式不夠完美昧识,需要JSTL的支持!在JSP中盗扒,我們前面已經(jīng)用到了EL表達式滞诺,體會到了EL表達式的強大功能:使用EL表達式可以很方便地引用一些JavaBean以及其屬性形导,不會拋出NullPointerException之類的錯誤!但是习霹,EL表達式非常有限朵耕,它不能遍歷集合,做邏輯的控制淋叶。這時阎曹,就需要JSTL的支持了
  • Scriptlet的可讀性煞檩,維護性处嫌,重用性都十分差!JSTL與HTML代碼十分類似斟湃,遵循著XML標簽語法熏迹,使用JSTL讓JSP頁面顯得整潔,可讀性非常好凝赛,重用性非常高注暗,可以完成復(fù)雜的功能!
  • 在JSP中不推薦使用scriptlet輸出墓猎,推薦使用JSP標簽捆昏。

使用JSTL標簽庫步驟:

  1. 導入jstl.jar和standard.jar開發(fā)包
  2. 在JSP頁面中用tablib指令引入需要用到的JSTL標簽

core標簽庫

  • core標簽庫是JSTL的核心標簽庫,實現(xiàn)了最基本的功能:流程控制毙沾、迭代輸出等操作骗卜!
  • core標簽庫的前綴一般是c

c:out

image
  • 簡單使用一下

    <%
        session.setAttribute("name", "zhongfucheng");
    %>

    //<c:out/>標簽支持標簽體,default屬性上的數(shù)據(jù)可以寫在標簽體中
    //<c:out value="${name}" escapeXml="true">您要的數(shù)據(jù)找不著</c:out>

    <c:out value="${name}" default="您要的數(shù)據(jù)找不著" escapeXml="true"/>

  • 我們發(fā)現(xiàn)上面的代碼實現(xiàn)的效果和EL表達式是一樣的左胞,它出色的地方就多了兩個屬性,default和escapeXml屬性寇仓。如果我們用到這兩個屬性,我們就使用該標簽烤宙,如果沒有用到這兩個屬性就用EL表達式就可以了焚刺。

c:set

image
  • 該標簽有5個屬性,用起來有稍微有些復(fù)雜了门烂!現(xiàn)在要記住的就是:var屬性操作的是Integer乳愉、Double、Float屯远、String等類型的數(shù)據(jù)蔓姚,target屬性操作的是JavaBean或Map對象的數(shù)據(jù),scope代表的是Web域慨丐,value是值坡脐,property是對象的屬性

使用var屬性

  • 既然var屬性只能操作Integer房揭、Double备闲、String等類型晌端,那么存在var屬性就一定沒有property屬性(property代表的是對象的成員屬性,Integer恬砂、String這些類型哪來的成員變量呀)

  • 下面的代碼流程是這樣的:創(chuàng)建了一個name的變量咧纠,設(shè)置的值為zhongfucheng,范圍是page


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

    ${name}
  • 效果:
image
  • 當然了泻骤,set標簽也支持標簽體漆羔,value的值可以寫在標簽體里邊

    <c:set var="name" scope="page">
        zhongfucheng
    </c:set>
  • 使用var屬性和scope屬性實現(xiàn)計數(shù)器

    <%--由于下面變量需要做加法運算,所以要定義出來狱掂,不然服務(wù)器是不知道我的變量是Integer類型的--%>
    <%
        Integer sessionCount = 0;
        Integer applicationCount = 0;
    %>
    <c:set var="sessionCount" value="${sessionCount+1}" scope="session"/>

    <c:set var="applicationCount" value="${applicationCount+1}" scope="application"/>
  • 效果:
image

使用target屬性

  • 使用target屬性與之配對的是property屬性演痒,target屬性只能操作JavaBean或Map對象,property就是對應(yīng)的成員變量或key了趋惨。鸟顺。
  • 既然target屬性操作的是JavaBean或Map對象,那么一定是通過EL表達式來獲取到對象了器虾。taget屬性如果獲取不到數(shù)據(jù)會拋出異常讯嫂!使用target屬性就一定沒有scope屬性(scope屬性代表的是保存范圍,target的值都是獲取來的曾撤,難道你還能改變?nèi)思业姆秶艘Γ浚?/strong>

    <%--創(chuàng)建出JavaBean對象晕粪,設(shè)置為session范圍的屬性--%>
    <jsp:useBean id="person" class="domain.Person" scope="session"/>

    <%--獲取到person對象挤悉,設(shè)置age屬性的值為32--%>
    <c:set target="${person}" property="age" value="32"/>

    ${person.age}
  • 效果:
image

c:remove

remove標簽就相當簡單了,只有var和scope屬性巫湘,代表的是刪除域范圍的屬性

  • 下面簡單來測試一下吧:

    <%--創(chuàng)建出JavaBean對象装悲,設(shè)置為session范圍的屬性--%>
    <jsp:useBean id="person" class="domain.Person" scope="session"/>

    <%--獲取到person對象,設(shè)置age屬性的值為32--%>
    <c:set target="${person}" property="age" value="32"/>

    ${person.age}
    <br>

    <%--刪除session屬性--%>
    <c:remove var="person" scope="session"></c:remove>
    ${person.age==null?"存在session的person對象被刪除了尚氛!":"我還在呢诀诊!"}

  • 效果:
image

c:catch

該標簽主要用來處理程序中產(chǎn)生的異常。

catch標簽也十分簡單阅嘶,只有一個var屬性属瓣,var屬性封裝了異常的信息!


    <%--創(chuàng)建出JavaBean對象讯柔,設(shè)置為session范圍的屬性--%>
    <jsp:useBean id="person" class="domain.Person" scope="session"/>

    <c:catch var="message">

        <%--target屬性只能是EL表達式抡蛙,現(xiàn)在我是字符串,獲取不到對象魂迄,肯定會拋出異常的粗截!--%>
        <c:set target="person" property="age" value="32"/>

    </c:catch>

    ${message}
  • 效果:
image

c:if

image

JSTL提供了if標簽完成分支語句的實現(xiàn),test屬性是不可或缺的捣炬。

var和scope屬性我看來好像沒什么用的(保存執(zhí)行結(jié)果有什么用熊昌?)

  • 根據(jù)傳遞過來的參數(shù)的不同顯示不同的頁面绽榛!

    <%--如果帶過來的名字是zhongfucheng,那么可以登陸--%>
    <c:if test="${param.name=='zhongfucheng'}">
        用戶名:<input type="text" name="username"><br>
        密碼:<input type="password" name="password"><br>
        <input type="submit" value="登陸">
    </c:if>

    <%--如果帶過來的名字是ouzicheng婿屹,那么就是注冊--%>
    <c:if test="${param.name=='ouzicheng'}">
        用戶名:<input type="text" name="username"><br>
        密碼:<input type="password" name="password"><br>
        <input type="submit" value="注冊">
    </c:if>
  • 注意地址欄的參數(shù)灭美!
image
image

c:choose

if標簽沒有else的功能,如果需要類似于java中的if else流程就需要使用choose標簽选泻。

choose標簽需要聯(lián)合when和otherwise標簽一起使用冲粤!


    <c:choose>
        <c:when test="${param.name=='zhongfucheng'}">
            你好啊,zhongfucheng
        </c:when>
        <c:when test="${param.name=='ouzicheng'}">
            你好啊页眯,ouzicheng
        </c:when>
        <c:otherwise>
            你是誰疤莶丁?別隨便過來窝撵!
        </c:otherwise>
    </c:choose>
  • 效果:
image
image

c:forEach

image

forEach為循環(huán)標簽傀顾,相當于Java中的while和for

  • 之前我們在使用EL表達式獲取到集合的數(shù)據(jù),遍歷集合都是用scriptlet代碼循環(huán)碌奉,現(xiàn)在我們學了forEach標簽就可以舍棄scriptlet代碼了短曾。

  • 向Session中設(shè)置屬性,屬性的類型是List集合


    <%
        List list = new ArrayList<>();
        list.add("zhongfucheng");
        list.add("ouzicheng");
        list.add("xiaoming");

        session.setAttribute("list", list);
    %>
  • 遍歷session屬性中的List集合,items:即將要迭代的集合赐劣。var:當前迭代到的元素

    <c:forEach  var="list" items="${list}" >
        ${list}<br>
    </c:forEach>
  • 效果:
image
  • 遍歷Map對象有稍微地不一樣嫉拐,我們來看一下,var屬性保存的不是每個迭代的對象魁兼,而是Map.Entry婉徘。

    <%
        Map map = new HashMap();
        map.put("1", "zhongfucheng");
        map.put("2", "xiaohong");
        map.put("3", "xiaoming");

        session.setAttribute("map",map);
    %>

    <c:forEach  var="me" items="${map}" >

        ${me.key}  ${me.value}<br>

    </c:forEach>
image
  • begin默認從0開始、end默認為集合的最后一個元素咐汞、step默認為1

  • varStatus代表著當前對象被迭代的信息盖呼,它有以下的屬性凉敲。

    • index【返回當前是第幾個對象涕刚,從0開始計數(shù)】
    • count【已經(jīng)遍歷多少個對象了,從1開始計數(shù)】
    • first【是否是第一個】
    • last【是否是最后一個】
    • current【當前被迭代的對象】
    • begin【開始的位置】
    • end【最后的位置】
    • step【步長】

    <c:forEach  var="list" items="${list}" varStatus="varStatus" >

        ${list}您的下標是:${varStatus.index}<br>

    </c:forEach>
  • 效果:
image

c:forTokens

該標簽類似于String類的split()和for循環(huán)的一種集合

它與forEach標簽非常相似禽炬,都有begin植阴、end蟹瘾、step、items掠手、var憾朴、varStatus屬性,不同的是forTokens標簽的items屬性里面是字符串惨撇,這個字符串會被delims屬性的內(nèi)容分割成多個字符串伊脓!


    <c:forTokens items="zhongfucheng,ouzicheng,xiaoming,xiaohong" var="name" delims="," >
        ${name}
    </c:forTokens>
  • 效果圖:
image

c:import

import標簽類似于JSP行為<jsp:include/>和JSP指令<%include>

import標簽的屬性:

  1. url【指定要包含的路徑,Internet所有的url都可以】
  2. context【訪問同一個web容器的其他資源,以"/"開頭】
  3. var【保存導入的文件的內(nèi)容报腔,以String類型存儲】
  4. socpe【保存的范圍株搔,默認是page】
  5. charEncoding【字符編碼】
  6. varReader【保存導入文件的內(nèi)容,以Reader類型存儲】

當然了纯蛾,import標簽功能更加更大纤房!強大在哪里呢?import標簽可以引入Internet網(wǎng)頁上的內(nèi)容翻诉,也就是說炮姨,csdn也可以引入進來!

  • 我們來用一下把碰煌!

    <c:import url="http://www.csdn.net" charEncoding="UTF-8" />
  • 我們一看舒岸,是沒有樣式的
image
  • 打印csdn的源代碼

    <c:import url="http://www.csdn.net" charEncoding="UTF-8" var="net"/>

    CSDN的源碼是:<br><br><br><br><br>
    <c:out value="${net}" escapeXml="true"></c:out>
  • 效果:
image

c:param

  • 在JSP頁面進行URL的相關(guān)操作時,經(jīng)常要在URL地址后面附加一些參數(shù)芦圾。

c:url

url標簽十分實用蛾派!在瀏覽器禁用Cookie的時候,我們之前學Servlet時解決辦法是:response.encodeURL()个少。url標簽也可以實現(xiàn)這樣的功能洪乍,再配合param標簽使用,就十分實用了夜焦!

image
  • 我們配合param標簽來使用一下吧壳澳!

    <c:url value="2.jsp" var="url">
        <c:param name="name" value="中國!">
        </c:param>
    </c:url>

    <a href="${url}">我經(jīng)過了URL地址重寫茫经!</a>

  • 效果:
image

c:redirect

redirect標簽用于實現(xiàn)Redirect功能巷波,當然了,此標簽也能夠配合param標簽使用科平!

image
  • 簡單使用一下褥紫,重定向到2.jsp姜性,帶了一個參數(shù)

    <c:redirect url="2.jsp" >
        <c:param name="name" value="zhongfucheng">
        </c:param>
    </c:redirect>
  • 在2.jsp中獲取到參數(shù)
image

fmt標簽庫

fmt標簽庫也叫做國際化標簽庫瞪慧。這里就不詳細說明了,等我講到Web 國際化的時候才講吧部念!

fn方法庫

fn方法庫也叫做EL函數(shù)庫弃酌、fn標簽庫。這個在講解EL表達式的時候有詳細的說明儡炼,可轉(zhuǎn)移到我EL表達式的博文中妓湘!

如果文章有錯的地方歡迎指正,大家互相交流乌询。習慣在微信看技術(shù)文章的同學榜贴,可以關(guān)注微信公眾號:Java3y

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市妹田,隨后出現(xiàn)的幾起案子唬党,更是在濱河造成了極大的恐慌鹃共,老刑警劉巖,帶你破解...
    沈念sama閱讀 217,734評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件驶拱,死亡現(xiàn)場離奇詭異霜浴,居然都是意外死亡,警方通過查閱死者的電腦和手機蓝纲,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,931評論 3 394
  • 文/潘曉璐 我一進店門阴孟,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人税迷,你說我怎么就攤上這事永丝。” “怎么了箭养?”我有些...
    開封第一講書人閱讀 164,133評論 0 354
  • 文/不壞的土叔 我叫張陵类溢,是天一觀的道長。 經(jīng)常有香客問我露懒,道長闯冷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,532評論 1 293
  • 正文 為了忘掉前任懈词,我火速辦了婚禮蛇耀,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘坎弯。我一直安慰自己纺涤,他們只是感情好,可當我...
    茶點故事閱讀 67,585評論 6 392
  • 文/花漫 我一把揭開白布抠忘。 她就那樣靜靜地躺著撩炊,像睡著了一般。 火紅的嫁衣襯著肌膚如雪崎脉。 梳的紋絲不亂的頭發(fā)上拧咳,一...
    開封第一講書人閱讀 51,462評論 1 302
  • 那天,我揣著相機與錄音囚灼,去河邊找鬼骆膝。 笑死,一個胖子當著我的面吹牛灶体,可吹牛的內(nèi)容都是我干的阅签。 我是一名探鬼主播,決...
    沈念sama閱讀 40,262評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼蝎抽,長吁一口氣:“原來是場噩夢啊……” “哼政钟!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,153評論 0 276
  • 序言:老撾萬榮一對情侶失蹤养交,失蹤者是張志新(化名)和其女友劉穎衷戈,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體层坠,經(jīng)...
    沈念sama閱讀 45,587評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡殖妇,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,792評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了破花。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片谦趣。...
    茶點故事閱讀 39,919評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖座每,靈堂內(nèi)的尸體忽然破棺而出前鹅,到底是詐尸還是另有隱情,我是刑警寧澤峭梳,帶...
    沈念sama閱讀 35,635評論 5 345
  • 正文 年R本政府宣布舰绘,位于F島的核電站,受9級特大地震影響葱椭,放射性物質(zhì)發(fā)生泄漏捂寿。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,237評論 3 329
  • 文/蒙蒙 一孵运、第九天 我趴在偏房一處隱蔽的房頂上張望秦陋。 院中可真熱鬧,春花似錦治笨、人聲如沸驳概。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,855評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽顺又。三九已至,卻和暖如春等孵,著一層夾襖步出監(jiān)牢的瞬間稚照,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 32,983評論 1 269
  • 我被黑心中介騙來泰國打工流济, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留锐锣,地道東北人腌闯。 一個月前我還...
    沈念sama閱讀 48,048評論 3 370
  • 正文 我出身青樓绳瘟,卻偏偏與公主長得像,于是被迫代替她去往敵國和親姿骏。 傳聞我的和親對象是個殘疾皇子糖声,可洞房花燭夜當晚...
    茶點故事閱讀 44,864評論 2 354

推薦閱讀更多精彩內(nèi)容