<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    posts - 78, comments - 34, trackbacks - 0, articles - 1
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

             除了JavaMail今日是JavaWeb部分的最后一天了,還有三天的時(shí)間是做個(gè)小項(xiàng)目。將之前學(xué)習(xí)的所有知識(shí)串起來(lái),準(zhǔn)備迎接高級(jí)部分。嘿嘿!終于到了高級(jí)部分!

             今日主要內(nèi)容是JSP自定義標(biāo)簽與JSTL,之前有使用過(guò)JSTL,十分的方便,還有EL。也有學(xué)過(guò)自定義EL函數(shù),但個(gè)人感覺(jué)EL自定義函數(shù)沒(méi)有JSP的自定義標(biāo)簽有趣。

    一、JSP自定義標(biāo)簽

    我們知道,JSP在被訪問(wèn)時(shí)會(huì)被JSP引擎翻譯為Servlet程序,即JSP就是Servlet程序。我們可以在JSP中插入Java代碼,但是在JSP頁(yè)面中使用<%...%>嵌入JAVA代碼,使用頁(yè)面編寫(xiě)起來(lái)十分混亂,更不利于以后的維護(hù)。因?yàn)椋?/span>JSP自定義標(biāo)簽可以優(yōu)雅的解決這一問(wèn)題。JSTL也正是SUN為些開(kāi)發(fā)的一個(gè)標(biāo)簽庫(kù),接下來(lái)讓我們來(lái)編寫(xiě)自己的自定義標(biāo)簽。

    定義JSP自定義標(biāo)簽,需要四個(gè)步驟:

    1.        編寫(xiě)一個(gè)實(shí)現(xiàn)Tag接口的Java類(標(biāo)簽處理器類),覆蓋其中的doStartTag方法,在doStartTag方法中編寫(xiě)標(biāo)簽的功能代碼。

    2.        編寫(xiě)標(biāo)簽庫(kù)描述符(tld)文件,在tld文件中對(duì)自定義標(biāo)簽進(jìn)行描述。

    3.        WEB應(yīng)用中部署和安裝自定義標(biāo)簽庫(kù)。

    4.        JSP頁(yè)面中導(dǎo)入和使用自定義標(biāo)簽。

    在以前的JSP頁(yè)面編寫(xiě)中,我們有使用過(guò)“<cc:if test=”邏輯表達(dá)方式”>”和<cc:froEach var=”變量” items=”集合、列表、數(shù)組”>。下面我們就來(lái)實(shí)現(xiàn)與這兩個(gè)JSP標(biāo)簽類似功能的自定義JSP標(biāo)簽。

    1.編寫(xiě)<cc:if test=”…”>…</cc:forEach>自定義標(biāo)簽:

    IfTag.java,標(biāo)簽處理器:

    import javax.servlet.jsp.*;

    import javax.servlet.jsp.tagext.Tag;

     

    public class IfTag implements Tag {

        private boolean test;

        public void setTest(boolean test) {

           this.test = test;

        }  

        public int doStartTag() throws JspException {

           if(this.test)

               return Tag.EVAL_BODY_INCLUDE;

           return Tag.SKIP_BODY;

        }

        public int doEndTag() throws JspException {

           // TODO Auto-generated method stub

           return 0;

        }

        public Tag getParent() {

           // TODO Auto-generated method stub

           return null;

        }

        public void release() {

           // TODO Auto-generated method stub

        }

        public void setPageContext(PageContext arg0) {

           // TODO Auto-generated method stub

        }

        public void setParent(Tag arg0) {

           // TODO Auto-generated method stub

        }

    }

    1.        private boolean test;”,這個(gè)成員名稱必須與JSP中自定義標(biāo)簽的屬性名稱相同,JSP引擎會(huì)通過(guò)“setTest”方法,將屬性值傳遞過(guò)來(lái)。

    2.        doStartTag()”當(dāng)自定義標(biāo)簽開(kāi)始被執(zhí)行時(shí),JSP引擎會(huì)調(diào)此方法。在此方法中可以“Tag.EVAL_BODY_INCLUDE”告訴JSP引擎繼續(xù)向下執(zhí)行標(biāo)簽體中的內(nèi)容,如果返回“Tag.SKIP_BODYJSP引擎將不執(zhí)行標(biāo)簽體中的內(nèi)容。

    3.        doEndTag()”當(dāng)標(biāo)簽體被執(zhí)行完成后,會(huì)調(diào)用些方法。

    4.        getParent()”返回父標(biāo)簽。

    5.        release()”,當(dāng)標(biāo)簽處理器被銷毀前會(huì)調(diào)用此方法,可以在此方法中釋放。但這個(gè)處理器被JSP引擎實(shí)例化后,一般不會(huì)被釋放而是保存在內(nèi)存中,留以后用。服務(wù)器被關(guān)閉時(shí),會(huì)被釋放。

    6.        setPageContext(PageContext arg0)”,JSP引擎將JSP頁(yè)面的運(yùn)行環(huán)境,通過(guò)此方法傳遞給自定義標(biāo)簽處理器。

    7.        setParent(Tag arg0)”,如果標(biāo)簽有父標(biāo)簽時(shí),JSP引擎會(huì)將父標(biāo)簽對(duì)象傳遞進(jìn)來(lái)。

     

    MyEl.tld,自定義標(biāo)簽描述文件。

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

    <taglib version="2.0" 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">

        <tlib-version>1.0</tlib-version>

        <short-name>SimpleTagLibrary</short-name>

        <uri>/SimpleTagLibrary</uri>

       

        <tag>

           <name>myIf</name>

           <tag-class>cn.itcast.cc.jsptag.IfTag</tag-class>

           <body-content>JSP</body-content>

           <attribute>

               <name>test</name>

               <required>true</required>

               <rtexprvalue>true</rtexprvalue>

           </attribute>

        </tag>

    </taglib>

    1.        tld文件在工程中的存放位置,與web.xml存位置相同。

    2.        <uri>”設(shè)置tld描述文件的URIURI用于在JSP頁(yè)面中引入此tld文件。

    3.        <tag>”定義一個(gè)自定義標(biāo)簽。

    4.        <name>”自定義標(biāo)簽名。

    5.        <tag-class>”自定義標(biāo)簽處理器類,就是上邊編寫(xiě)的類。

    6.        <body-content>”自定義標(biāo)簽的標(biāo)簽體內(nèi)容。(也可以設(shè)置為“empty”等)

    7.        <attribute>”為自定義標(biāo)簽添加一個(gè)屬性。

    8.        <name>”自定義標(biāo)簽屬性名。

    9.        <required>true為必須指定此屬性,false此屬性可為空。

    10.     <rtexprvalue>”設(shè)置屬性為靜態(tài)的或是動(dòng)態(tài)的。如果為false即靜態(tài)的,靜態(tài)的屬性值JSP引擎會(huì)將它自動(dòng)轉(zhuǎn)換(必須是java8種基本數(shù)據(jù)類型),比如<cc:MyIf test=”122”>JSP引擎會(huì)自動(dòng)將“123”轉(zhuǎn)換為整數(shù)型,所以處理器的類成員可以定義為int型。如果為true即動(dòng)態(tài)的,如果設(shè)置為將類型設(shè)置為Object可以接收任意數(shù)據(jù)類型的屬性。

     

    Index.jsp,在JSP頁(yè)面中引入自定義標(biāo)簽,并調(diào)用自定義標(biāo)簽:

    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>

    <%@taglib prefix="cc" uri="/SimpleTagLibrary" %>

    <html>

      <head>

      </head>

     

      <body>

        <cc:myIf test="${2>1}">

           自定義邏輯判斷標(biāo)簽!

        </cc:myIf>

      </body>

    </html>

     

    2.編寫(xiě)<cc:foEach var=”temp” items=”list”>…</cc:forEach>自定義標(biāo)簽:

    forEahTag.java,繼承自SimpleTagSupport,這個(gè)簡(jiǎn)單簡(jiǎn)化了Tag接口的操作。

    import java.io.IOException;

    import java.util.*;

    import javax.servlet.jsp.JspException;

    import javax.servlet.jsp.tagext.SimpleTagSupport;

     

    public class forEahTag extends SimpleTagSupport {

     

        // 記錄 items="xxx" 中的list對(duì)象

        private List items;

        // 記錄 var="xxx"中的變量名稱

        private String var;

     

        public void setItems(List items) {

           this.items = items;

        }

     

        public void setVar(String var) {

           this.var = var;

        }

        // SimpleTagSupport簡(jiǎn)化了Tag接口的操作,在此只需要覆蓋doTag方法即可實(shí)現(xiàn)forEach

        @Override

        public void doTag() throws JspException, IOException {

           Iterator iter = this.items.iterator();

           while (iter.hasNext()) {

               // 將單個(gè)對(duì)象設(shè)置到Context域中,在JSP頁(yè)面中可以使用${var}獲取對(duì)象。

               this.getJspContext()

                      .setAttribute(this.var, iter.next());

               // 調(diào)用執(zhí)行標(biāo)簽體,需要一個(gè)輸出流參數(shù),

               // 設(shè)置為null時(shí)JSP引擎自動(dòng)將其替換為this.getJspContext().getOut()

               this.getJspBody().invoke(null);

           }

        }

    }

     

    this.getJspBody()”返回JspFragment對(duì)象,JspFragment代表一個(gè)標(biāo)簽體。JspFragment中不能包含JSP腳本元素。JspFragment.invoke就是調(diào)用標(biāo)簽體。如果不調(diào)用此方法,就是忽略標(biāo)簽體。

    forEach也可以使用實(shí)現(xiàn)TagSupport接口實(shí)現(xiàn),當(dāng)標(biāo)簽體被調(diào)用時(shí),首先會(huì)調(diào)用“doStartTag”方法(只會(huì)調(diào)用一次),可以在這個(gè)方法里先輸出第一個(gè)成員。然后執(zhí)行標(biāo)簽體,最后調(diào)用“doAfterBody”方法,它是重點(diǎn)。在這個(gè)方法里再輸出下一個(gè)成員然后判斷是不是到了list尾,如果到了list結(jié)尾則返回IterationTag. SKIP_BODY;。如果沒(méi)有到list結(jié)尾則返回IterationTag. EVAL_BODY_AGAIN;,繼續(xù)重復(fù)執(zhí)行標(biāo)簽體,實(shí)現(xiàn)對(duì)list的遍歷!

    MyEl.tld,添加如下內(nèi)容:

        <tag>

           <name>myForEach</name>

           <tag-class>cn.itcast.cc.jsptag.forEahTag</tag-class>

           <body-content>scriptless</body-content>

           <attribute>

               <name>var</name>

               <required>true</required>

               <rtexprvalue>true</rtexprvalue>

           </attribute>

           <attribute>

               <name>items</name>

               <required>true</required>

               <rtexprvalue>true</rtexprvalue>

           </attribute>

        </tag>

             <body-content>scriptless</body-content>”指定標(biāo)簽體內(nèi)為非腳本代碼。

     

    Index.jsp添加如下內(nèi)容:

    <%

           List list = new ArrayList();

           list.add("");

           list.add("");

           list.add("");

           this.getServletContext().setAttribute("list",list);

         %>

        <cc:myForEach items="${list}" var="temp">

           ${temp }

        </cc:myForEach>

             JSP頁(yè)面插入的代碼,是向List對(duì)象中插入成員,然后添加到ServletContext域中,${list}ServletContext域中獲取list對(duì)象。

     

             3.JSP自定義標(biāo)簽高級(jí)部分:

    修改標(biāo)簽內(nèi)容的標(biāo)簽<cc:htmlFilter><cc:readFile>兩個(gè)標(biāo)簽配合使用。

    ReadFileTag.java

    public class ReadFileTag extends SimpleTagSupport {

        // 記錄文件路徑

        private String src;

          

        public void setSrc(String src) {

           this.src = src;

        }

     

        @Override

        public void doTag() throws JspException, IOException {

           // 獲取到文件的全路徑

           PageContext pc = (PageContext) this.getJspContext();

           ServletContext sc = pc.getServletContext();

           String file = sc.getRealPath(src);

           // 使用字符緩沖流讀取文件

           BufferedReader reader = new BufferedReader(new FileReader(file));

           String line = null;

           while((line = reader.readLine()) != null){

               // 寫(xiě)到輸出流

               this.getJspContext().getOut().write(line + "\r\n");

           }     

        }

    }

             注意代碼中的寫(xiě)到輸出流,這個(gè)輸出流是父標(biāo)簽傳遞進(jìn)來(lái)的輸出流。

     

    HtmlFilter.java

    public class HtmlFilter extends SimpleTagSupport {

     

        @Override

        public void doTag() throws JspException, IOException {

           // 調(diào)用子標(biāo)簽,并將輸出流傳遞進(jìn)去。

           CharArrayWriter caw = new CharArrayWriter(); 

           this.getJspBody().invoke(caw);

           //這里之所以要寫(xiě)義一個(gè)輸出流,是為了實(shí)現(xiàn)Html字符的轉(zhuǎn)換

           this.getJspContext().getOut().write(filter(caw.toString()));

           System.out.println(caw.toString());

        }

       

        // Html字符轉(zhuǎn)換

        public static String filter(String message) {

     

            if (message == null)

                return (null);

     

            char content[] = new char[message.length()];

            message.getChars(0, message.length(), content, 0);

            StringBuffer result = new StringBuffer(content.length + 50);

            for (int i = 0; i < content.length; i++) {

                switch (content[i]) {

                case '<':

                    result.append("&lt;");

                    break;

                case '>':

                    result.append("&gt;");

                    break;

                case '&':

                    result.append("&amp;");

                    break;

                case '"':

                    result.append("&quot;");

                    break;

                default:

                    result.append(content[i]);

                }

            }

            return (result.toString());

        }

    }

             調(diào)用標(biāo)簽體時(shí),之所以傳遞一個(gè)自定義的輸出流。是因?yàn)椋褂眠@個(gè)輸出流,獲取讀到的html文件的內(nèi)容。然后將流中的html字符轉(zhuǎn)換后,再輸出到JSP頁(yè)面。

             二、JSTL標(biāo)簽

             1.jstl標(biāo)簽分為:

             核心標(biāo)簽庫(kù)

    國(guó)際化標(biāo)簽

    數(shù)據(jù)庫(kù)標(biāo)簽

    XML標(biāo)簽

    JSTL函數(shù)

             因?yàn)樵?/span>JSP頁(yè)面中最好不要訪問(wèn)數(shù)據(jù)庫(kù)和XML文件,這樣太不安全了而且程序邏輯混亂,所以就沒(méi)有講解這方面的使用。

     

             2.jstl常用的標(biāo)簽:

             (1).<c:out>標(biāo)簽:用于輸出一段文本內(nèi)容到pageContext對(duì)象當(dāng)前保存的“out”對(duì)象中。

             (2). <c:set>標(biāo)簽:用于設(shè)置各種Web域中的屬性,或者設(shè)置Web域中的java.util.Map類型的屬性對(duì)象或JavaBean類型的屬性對(duì)象的屬性。

             (3). <c:remove>標(biāo)簽:用于刪除各種Web域中的屬性。

             (4). <c:catch>標(biāo)簽:用于捕獲嵌套在標(biāo)簽體中的內(nèi)容拋出的異常。

             (5). <c:if test=“”>標(biāo)簽:可以構(gòu)造簡(jiǎn)單的“if-then”結(jié)構(gòu)的條件表達(dá)式。

             (6). <c:choose>標(biāo)簽:用于指定多個(gè)條件選擇的組合邊界,它必須與<c:when><c:otherwise>標(biāo)簽一起使用。

             (7). <c:forEach>標(biāo)簽:用于對(duì)一個(gè)集合對(duì)象中的元素進(jìn)行循環(huán)迭代操作,或者按指定的次數(shù)重復(fù)迭代執(zhí)行標(biāo)簽體中的內(nèi)容。

             (8). <c:param>標(biāo)簽:它可以嵌套在<c:import><c:url><c:redirect>標(biāo)簽內(nèi),為這些標(biāo)簽所使用的URL地址附加參數(shù)。此標(biāo)簽自動(dòng)進(jìn)行URL編碼。

             (9). <c:url>標(biāo)簽:用于在JSP頁(yè)面中構(gòu)造一個(gè)URL地址,其主要目的是實(shí)現(xiàn)URL重寫(xiě)。還記得URL重寫(xiě)是什么嗎?當(dāng)session被禁用時(shí),URL重寫(xiě)就是為解決這一問(wèn)題的!

             (10). <c:redirect>標(biāo)簽:用于將當(dāng)前的訪問(wèn)請(qǐng)求轉(zhuǎn)發(fā)或重定向到其他資源。

          

             OK,上面是常用的標(biāo)簽,使用方法去查手冊(cè)吧!東西太多了。老方今天特別提到一個(gè)標(biāo)簽,是佟老師特別指出的。它在Structs中使用較多——C:check permission

     

             比如,一個(gè)管理頁(yè)面,有好多管理選項(xiàng)。但管理選項(xiàng)需要根據(jù)用戶的權(quán)限進(jìn)行顯示,此時(shí)自定義一個(gè)檢查標(biāo)簽,將User做為參數(shù)傳遞給標(biāo)簽處理器。標(biāo)簽處理器查看User的權(quán)限,然后確定是否執(zhí)行標(biāo)簽體。(標(biāo)簽體中的內(nèi)容為顯示相應(yīng)的管理選項(xiàng))

     

             OK,明天就要老方就開(kāi)始編寫(xiě)一個(gè)將JavaSeb基礎(chǔ)部分的所有內(nèi)容融會(huì)到一起的WEB應(yīng)用用例。估計(jì)使用1天多點(diǎn)的時(shí)間。然后同學(xué)們有近兩天的個(gè)人實(shí)現(xiàn)時(shí)間。大家對(duì)此都十分期待!終于應(yīng)用這段時(shí)間所學(xué)的知識(shí),寫(xiě)個(gè)像樣的東西出來(lái)。

     

             加油!


    只有注冊(cè)用戶登錄后才能發(fā)表評(píng)論。


    網(wǎng)站導(dǎo)航:
     
    主站蜘蛛池模板: 人禽伦免费交视频播放| 亚洲av无码国产精品色午夜字幕| 亚洲国产精品成人精品无码区| 日日摸夜夜添夜夜免费视频| 国产无遮挡吃胸膜奶免费看| 亚洲国产精品成人精品软件| 人人揉揉香蕉大免费不卡| 亚洲国产精品狼友中文久久久| 精品无码专区亚洲| 亚洲国产aⅴ综合网| 国产精品免费观看视频| 国产亚洲精品福利在线无卡一| a级毛片免费观看网站| 中文字幕第一页亚洲| 两性色午夜视频免费网| 亚洲VA中文字幕无码一二三区 | 亚洲情A成黄在线观看动漫软件 | 国产无限免费观看黄网站| 国产亚洲精午夜久久久久久| 中文字幕成人免费高清在线视频 | 国产亚洲美女精品久久久久| 免费欧洲毛片A级视频无风险| 精品韩国亚洲av无码不卡区| mm1313亚洲国产精品美女| 亚洲高清免费视频| 亚洲第一成年男人的天堂| 99在线热视频只有精品免费| 亚洲最新在线视频| 四虎永久免费网站免费观看| 香蕉视频在线观看免费| 国产免费直播在线观看视频| caoporm超免费公开视频| 久久精品亚洲一区二区三区浴池| 国产成人精品免费视| 亚洲AV成人无码网天堂| 亚洲精品乱码久久久久66| 国产免费女女脚奴视频网| 国产亚洲综合一区二区三区| 久久亚洲国产欧洲精品一| 一二三四在线观看免费高清中文在线观看 | 亚洲天堂视频在线观看|