初學(xué)jsf自定義標(biāo)簽時(shí)遇到的問題總結(jié)

          1.定義一個(gè)標(biāo)簽要用到兩個(gè)java類,這個(gè)跟jsp的自定義標(biāo)簽有點(diǎn)不一樣
            第一個(gè)類繼承UIComponentTag, 用于定義標(biāo)簽的屬性和設(shè)置標(biāo)簽的所有屬性值到控件的map屬性attributes或valueBinding中
            第二個(gè)類繼承UIInput或者UIOutput,用于渲染標(biāo)簽的內(nèi)容,真正打印標(biāo)簽內(nèi)容的地方就在這里
             
          2.這兩個(gè)類是怎么聯(lián)系的
           我們需要像定義jsf的bean的影射文件一樣,在faces-config.xml或者自己定義的xml文件里面定義第二個(gè)類
           如:
           
          <faces-config>
            
          <!--分頁標(biāo)簽-->
            
          <component>
              
          <component-type>pageTag</component-type>
              
          <component-class>com.jsf.PageComponent</component-class>
            
          </component>
            
            
          </faces-config>
            然后第一個(gè)類要實(shí)現(xiàn)父類的一個(gè)方法 public String getComponentType();從這里返回一個(gè)字符串pageTag,這樣就跟第二個(gè)類聯(lián)系起來了

          3.標(biāo)簽屬性的定義
            標(biāo)簽屬性的定義一般都是可轉(zhuǎn)化為字符串的類型的,除非你還是用
          <%=rowList%>這種jsp賦值的方式
            別以為你定義的一個(gè)List類型的屬性可以用jsf的EL表達(dá)式可以直接賦值進(jìn)來,EL表達(dá)式傳進(jìn)來以后屬性接收的就是這一串EL表達(dá)式
            所以就是說你的屬性就是要字符串類型的

          4.那么jsf自定義標(biāo)簽是怎么接收EL表達(dá)式綁定的列表的
           先通過父類的isValueReference(屬性值),來判斷該屬性的值是否是一個(gè)EL的表達(dá)式
           如果是則通過獲取綁定值得方式把真正的屬性的值設(shè)置到標(biāo)簽父類的valueBinding對(duì)像中
           否則直接把屬性的值添加到標(biāo)簽父類的attributes對(duì)像中
            if (isValueReference(屬性值)) {
              javax.faces.el.ValueBinding vb = Util.getValueBinding(value.toString());
              component.setValueBinding(name, vb); //component就是標(biāo)簽對(duì)像,name就是標(biāo)簽的屬性名稱
           } else {
              component.getAttributes().put(name, 屬性值);
           }

           這就是個(gè)設(shè)置屬性值的過程,可以在第1點(diǎn)說的第一個(gè)類里面的protected void setProperties(UIComponent component)方法
          5.現(xiàn)在知道標(biāo)簽屬性值的作用了嗎
           是的標(biāo)簽屬性值只不過是起個(gè)作用而已,而不是我們真正所要的值
           也就是說我們是不能從這些屬性中直接取值的
           
          6.那么我們?cè)趺慈傩缘恼嬲闹的?br />  可以先從第4點(diǎn)說的標(biāo)簽父類的attributes對(duì)像中取值
           如果取不到值那就到標(biāo)簽父類的valueBinding對(duì)像中取值
           說白了就是,通過第4步我們屬性的真正的值不是放在attributes就是在valueBinding中
           Object obj = component.getAttributes().get(name); //component就是標(biāo)簽對(duì)像,name就是標(biāo)簽的屬性名稱
           if (obj == null) {
             ValueBinding vb = component.getValueBinding(name);
             if (vb != null) {
              return vb.getValue(context);
             } else {
              return null;
             }
           }
           這個(gè)過程就是取屬性值的過程,在第1點(diǎn)說的第二個(gè)類里面進(jìn)行
           
          7.現(xiàn)在屬性值也可以取到了,那么我們要怎么打印標(biāo)簽的內(nèi)容呢
            我們可以在第二個(gè)類的encodeBegin或者encodeEnd中進(jìn)行
            public void encodeBegin(FacesContext context) throws IOException
            public void encodeEnd(FacesContext context) throws IOException
           
            取屬性值的過程也可以在這里進(jìn)行,取完值后就是把值組裝到標(biāo)簽內(nèi)容的相應(yīng)位置中就完了
            
            基本上就是這幾點(diǎn)

          posted on 2007-11-21 19:21 JGAO編程隨筆 閱讀(2153) 評(píng)論(4)  編輯  收藏

          評(píng)論

          # re: 初學(xué)jsf自定義標(biāo)簽時(shí)遇到的問題總結(jié) 2008-01-09 13:48 阿燈

          郁悶,聽不明白。  回復(fù)  更多評(píng)論   

          # re: 初學(xué)jsf自定義標(biāo)簽時(shí)遇到的問題總結(jié) 2008-01-23 16:40 javy

          太難了
            回復(fù)  更多評(píng)論   

          # re: 初學(xué)jsf自定義標(biāo)簽時(shí)遇到的問題總結(jié)[未登錄] 2008-02-14 12:37 jgao

          不好意思,可能我沒說清楚
          但主要是要懂得jsf而且自己正在學(xué)習(xí)jsf的自定義標(biāo)簽
          這樣應(yīng)該就知道我寫的什么了  回復(fù)  更多評(píng)論   

          # re: 初學(xué)jsf自定義標(biāo)簽時(shí)遇到的問題總結(jié) 2008-08-22 09:10 asfd

          有沒有例子?  回復(fù)  更多評(píng)論   


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


          網(wǎng)站導(dǎo)航:
           
          <2007年11月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          導(dǎo)航

          統(tǒng)計(jì)

          常用鏈接

          留言簿(1)

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 古交市| 民县| 酒泉市| 五台县| 嘉荫县| 日土县| 陆良县| 博客| 永胜县| 二连浩特市| 望江县| 玉田县| 锡林郭勒盟| 安吉县| 长顺县| 卢龙县| 石狮市| 合肥市| 太仓市| 沙河市| 盐边县| 中山市| 江永县| 新沂市| 千阳县| 祁阳县| 汪清县| 吉木乃县| 织金县| 涟源市| 永和县| 宝兴县| 孙吴县| 田林县| 闻喜县| 永丰县| 黑水县| 高台县| 陇西县| 白城市| 星子县|