初學jsf自定義標簽時遇到的問題總結

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

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

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

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

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

          評論

          # re: 初學jsf自定義標簽時遇到的問題總結 2008-01-09 13:48 阿燈

          郁悶,聽不明白。  回復  更多評論   

          # re: 初學jsf自定義標簽時遇到的問題總結 2008-01-23 16:40 javy

          太難了
            回復  更多評論   

          # re: 初學jsf自定義標簽時遇到的問題總結[未登錄] 2008-02-14 12:37 jgao

          不好意思,可能我沒說清楚
          但主要是要懂得jsf而且自己正在學習jsf的自定義標簽
          這樣應該就知道我寫的什么了  回復  更多評論   

          # re: 初學jsf自定義標簽時遇到的問題總結 2008-08-22 09:10 asfd

          有沒有例子?  回復  更多評論   


          只有注冊用戶登錄后才能發表評論。


          網站導航:
           
          <2007年11月>
          28293031123
          45678910
          11121314151617
          18192021222324
          2526272829301
          2345678

          導航

          統計

          常用鏈接

          留言簿(1)

          隨筆檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 吴堡县| 奉化市| 思茅市| 阿荣旗| 定边县| 故城县| 会泽县| 民权县| 宁波市| 定陶县| 屏山县| 潼关县| 科尔| 三都| 巨鹿县| 内丘县| 金昌市| 县级市| 南江县| 应城市| 桃江县| 霞浦县| 隆林| 基隆市| 金川县| 阳高县| 深水埗区| 堆龙德庆县| 潞西市| 呼伦贝尔市| 亚东县| 灵璧县| 敦煌市| 无锡市| 抚宁县| 汨罗市| 高要市| 洱源县| 合川市| 旬阳县| 康乐县|