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

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

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

    Believe it,do it!

    Ideal is the beacon. Without ideal, there is no secure direction; without direction ,there is no life.
    理想是指路明燈。沒(méi)有理想,就沒(méi)有堅(jiān)定的方向;沒(méi)有方向,就沒(méi)有生活。
    CTRL+T eclipse
    posts - 35, comments - 3, trackbacks - 0, articles - 0
      BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

    Tapestry 各種組件使用

    Posted on 2008-09-27 15:29 三羽 閱讀(3441) 評(píng)論(1)  編輯  收藏 所屬分類(lèi): 收 藏 夾
    說(shuō)明:只是說(shuō)明一些需要注意的東西,更多的學(xué)習(xí)參考Tapestry官方文檔
    1、For
    source:是對(duì)應(yīng)的java類(lèi)里的List 對(duì)象或者是個(gè)數(shù)組 需要抽象 或者提供set get方法
    value:是循環(huán)這個(gè)source對(duì)象代表當(dāng)前的一個(gè) ,需要在page文件中設(shè)置問(wèn)一個(gè)屬性,可以不在對(duì)應(yīng)的java類(lèi)里有這個(gè)屬性
    index:是循環(huán)的索引值 同value一樣 在page文件中設(shè)置一個(gè)屬性即可 <property name="index"/>
    在循環(huán)的時(shí)候 會(huì)自動(dòng)為vlaue和index賦當(dāng)前的值

    2、Foreach 和For一樣使用

    3、Hidden組件 總是多余S的處理
     <input jwcid="@Hidden" type="hidden" value="ognl:blahblah" encode="false"/>


    4、 Insert 組件
    e.g.
        <input type="text" jwcid="name@Insert" value="ognl:user.name"/>
        頁(yè)面表現(xiàn)時(shí),將會(huì)到頁(yè)面類(lèi)中尋找getUser().getName()方法獲取初值并輸出
        相當(dāng)于在頁(yè)面上顯示數(shù)據(jù).

    5、 TextField 組件
    e.g.
        <input type="text" jwcid="username@TextField" value="ognl:username"/>
        頁(yè)面表現(xiàn)時(shí),將會(huì)到頁(yè)面類(lèi)中尋找getUsername()方法獲取初值
        *如果是修改信息頁(yè)面,通常初始值要在頁(yè)面表現(xiàn)之前由setUsername()手動(dòng)設(shè)置從數(shù)據(jù)庫(kù)中讀取出來(lái)的值
        表單提交時(shí),通過(guò)setUsername()寫(xiě)入新值(即用戶(hù)輸入值),在類(lèi)中通過(guò)getUsername()獲取新值
        相當(dāng)于在修改個(gè)人信息時(shí),首先讀出用戶(hù)名賦予文本框(用戶(hù)名)初值,用戶(hù)修改時(shí)填入新值,后臺(tái)獲取之
        *Hidden屬性區(qū)分是普通文本輸入框(默認(rèn)false)和密碼輸入框(hidden="ognl:true")
        readonly屬性設(shè)置只讀 readonly="true"為只讀(后臺(tái)可讀取)
        *disabled屬性設(shè)置是否可寫(xiě) diabled="true"為不可寫(xiě)(后臺(tái)也不可讀取)

    6、 TextArea 組件
    e.g.
        <textarea jwcid="content@TextArea" value="ognl:content" cols="40" rows="10"></textarea>
        頁(yè)面表現(xiàn)時(shí),將會(huì)到頁(yè)面類(lèi)中尋找getContent()方法獲取初值
        工作原理同TextField

    7、 RadioGroup/Radio 組件
    e.g.
        <span jwcid="headImage@RadioGroup" selected="ognl:headImage">
          <input jwcid="@Radio" type="radio" value="1"/>頭像1
          <input jwcid="@Radio" type="radio" value="2"/>頭像2
          <input jwcid="@Radio" type="radio" value="3"/>頭像3
          <input jwcid="@Radio" type="radio" value="4"/>頭像4
          <input jwcid="@Radio" type="radio" value="5"/>頭像5
          <input jwcid="@Radio" type="radio" value="6"/>頭像6
        </span>
        RadioGroup為每一個(gè)Radio提供一個(gè)唯一的ID。RadioGroup跟蹤當(dāng)前被選中的屬性值,并且只有一個(gè)Radio能夠被選中.
        頁(yè)面提交時(shí),RadioGroup組件就利用OGNL表達(dá)式向headImage字段寫(xiě)入被選中的Radio組件的value參數(shù)值.
        頁(yè)面表現(xiàn)時(shí)(修改頁(yè)面),將會(huì)到頁(yè)面類(lèi)中尋找getHeadImage()方法獲取初值,然后尋找@Radio組件中與其相同的組件并勾選上.

    8、 PropertySelection 組件
        使用PropertySelection組件必須要構(gòu)造一個(gè)類(lèi)來(lái)實(shí)現(xiàn)IPropertySelectionModel接口,并且重寫(xiě)該接口的5個(gè)方法.
        public int getOptionCount() //提供下拉菜單的長(zhǎng)度
        public Object getOption(int index) //提供select標(biāo)簽的option
        public String getLabel(int index) //提供select標(biāo)簽的Label值,也就是下拉菜單顯示的內(nèi)容
        public String getValue(int index) //提供select標(biāo)簽的value值
        public Object translateValue(String value) //selected后的返回值,value值未必就是我們需要的返回值,可以在這個(gè)方法里面對(duì)返回的value做對(duì)應(yīng)的轉(zhuǎn)換或修改.
    e.g.1. 性別下拉框
        <select jwcid="gender@ProPertySelection" name="genderSelect" value="ognl:gender" model="supportedGender">
          <option selected>先生</option>
          <option>女士</option>
        </select>


    代碼
    GenderSelectionModel.java  
    public class GenderSelectionModel implements IPropertySelectionModel {  
     
        public static final String male = "先生";  
     
        public static final String female = "女士";  
     
        public static final String[] genderOptions = { male, female };  
     
        public int getOptionCount() {  
            return genderOptions.length;  
        }  
     
        public Object getOption(int index) {  
            return this.translateValue(genderOptions[index]);  
        }  
     
        public String getLabel(int index) {  
            return genderOptions[index].toString();  
        }  
     
        public String getValue(int index) {  
            return genderOptions[index];  
        }  
     
        public Object translateValue(String value) {  
            if (value.equals("先生")) {  
                return "1";  
            } else {  
                return "0";  
            }  
        }  

     

    代碼
    ModUserInfo.java  
    public IPropertySelectionModel getSupportedGender() {  
        return new GenderSelectionModel();  


        存入數(shù)據(jù)庫(kù)中"1"代表先生,"0"代表女士,通過(guò)translateValue(String value)方法轉(zhuǎn)換
        頁(yè)面表現(xiàn)時(shí),通過(guò)model屬性給出的IPropertySelectionModel獲取下拉選項(xiàng),即getSupportedGender().
        然后通過(guò)getGender()方法獲取初值,比如獲取"0",則在頁(yè)面顯示時(shí)尋找value值為"0"的選項(xiàng)即為"女士",并選擇之作為初始選擇項(xiàng).

    e.g.2. 日志類(lèi)型下拉框
        <select jwcid="logType@PropertySelection" name="typeSelect" value="ognl:logType" model="supportedType">
          <option>心情日記</option>
          <option>情感天地</option>
          <option>生活感觸</option>
        </select>


    代碼
    TypeSelectionModel.java  
    public class TypeSelectionModel implements IPropertySelectionModel {  
          
        private List typeList = new ArrayList();  
     
        public TypeSelectionModel(List typeList) {  
            this.typeList = typeList;  
        }  
     
        public int getOptionCount() {  
            return typeList.size();  
        }  
     
        public Object getOption(int index) {  
            return ((LogType)typeList.get(index)).getValue();  
        }  
     
        public String getLabel(int index) {  
            return ((LogType) typeList.get(index)).getName();  
        }  
     
        public String getValue(int index) {  
            return ((LogType) typeList.get(index)).getValue();  
        }  
     
        public Object translateValue(String value) {  
            return value;  
        }  

     

    代碼
    ModLog.java  
    public IPropertySelectionModel getSupportedType() {  
        TypeSelectionModel typeSelectionModel =   
                               new TypeSelectionModel(loadType(getUser().getUserId()));  
        return typeSelectionModel;  
    }  
     
    private List loadType(int userid) {  
        ...//從數(shù)據(jù)庫(kù)載入該用戶(hù)的日志類(lèi)型列表  


        頁(yè)面表現(xiàn)時(shí),通過(guò)model屬性給出的IPropertySelectionModel獲取下拉選項(xiàng),即getSupportedType().
        然后通過(guò)value屬性給出的初始值即,getLogType()方法獲取初值,比如獲取"2",則在頁(yè)面顯示時(shí)尋找value值為"2"的選項(xiàng)即為"生活感觸",并選擇之作為初始選擇項(xiàng).

    9、 Form組件
    e.g.
        <form jwcid="logForm@Form">
          ...
        </form>
        Form的監(jiān)聽(tīng)(listener)方法可以有兩種方式:
          1. 在Form組件中聲明.
            <form jwcid="logForm@Form" listener="ognl:listener:onLogin">
              ...
            </form>
          2. 在submit類(lèi)型組件中聲明.
            <input type="submit" jwcid="onLogin@Submit" listener="listener:onLogin" value="發(fā)表"/>或者
            <span jwcid="@ImageSubmit" image="..." listener="listener:onLogin"><img src="..." width="" height=""/></span>
          前一種方式當(dāng)Form中只要有submit就會(huì)觸發(fā)監(jiān)聽(tīng)方法,后一種方式是Form中有多個(gè)submit,各自實(shí)現(xiàn)不同的監(jiān)聽(tīng)方法.

    G) Foreach 組件
    e.g.
        <span jwcid="@Foreach" source="ognl:logList" value="ognl:item">
        循環(huán)組件,遍歷source參數(shù),在表現(xiàn)其內(nèi)容前更新value參數(shù),將Foreach組件所包含的內(nèi)容重復(fù)表現(xiàn),其中可以通過(guò)value參數(shù)獲取所需顯示內(nèi)容.
        本例中,頁(yè)面表現(xiàn)時(shí)通過(guò)getLogList()方法獲取日志列表,循環(huán)取出其中數(shù)據(jù)更新item(日志對(duì)象)并予以顯示.其中item需要在頁(yè)面規(guī)范(.page)文件中聲明:
        <property name="item"/>
        *class參數(shù)用來(lái)尋找類(lèi)似CSS的文件對(duì)Foreach進(jìn)行修飾.
        Foreach組件: class="ognl:beans.evenOdd.next"
        Page文件: <bean name="evenOdd" class="org.apache.tapestry.bean.EvenOdd"/>
        CSS文件: tr.odd{background-color: #ffffff;}tr.even{background-color: #eeeeee;}

    10、 Conditional 組件
    e.g.
        <span jwcid="@Conditional" condition='ognl:item.sex.equals("1")'>先生</span>
        <span jwcid="@Conditional" condition='ognl:item.sex.equals("0")'>女士</span>
        conditional參數(shù)為true時(shí)運(yùn)行Conditional組件中的HTML模板內(nèi)容.
        在Tapestry4.0以后就不支持該組件了, 可以使用其他組件來(lái)實(shí)現(xiàn):
        1. Contrib:Choose和Contrib:When
        <library id="contrib" specification-path="classpath:/org/apache/tapestry/contrib/Contrib.library"/>(.application文件中引入Contrib類(lèi)包)
        <span jwcid="@contrib:Choose">
          <span jwcid="@contrib:When" condition='ognl:user.gender.equals("1")'>先生</span>
          <span jwcid="@contrib:When" condition='ognl:user.gender.equals("0")'>女士</span>
        </span>
        2. If組件
        <span jwcid="@If" condition='ognl:item.sex.equals("1")'>先生</span>
        <span jwcid="@If" condition='ognl:item.sex.equals("0")'>女士</span>
        3. Else組件
        <span jwcid="@Else">man</span>

    【============================ts的函數(shù)執(zhí)行順序========================================】
    對(duì)之前的該文章進(jìn)行了一些修正,主要是針對(duì)finishLoad()方法。
    我覺(jué)得對(duì)初學(xué)者會(huì)有一些幫助。
    下面這幾個(gè)函數(shù)是我在使用的,它們的執(zhí)行順序依次從上到下。
    1.protected void finishLoad() {} ***
    2.public void pageValidate(PageEvent event) {}
    3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {}
    4.public void pageBeginRender(PageEvent event) {}
    // 如果有表單提交,則將form中的各字段的值賦給頁(yè)面類(lèi)
    5. ...... 賦值
    6.public void submit() // 表單提交等用listenter:調(diào)用的方法
    7.protected void prepareForRender(IRequestCycle cycle) {}
    ----------------------------------------------------
    1.protected void finishLoad() {}
    這個(gè)函數(shù)最先執(zhí)行,但是它實(shí)際上沒(méi)有什么用處(我感覺(jué))。因?yàn)椋?
      這個(gè)函數(shù)只在頁(yè)面池中沒(méi)有某一個(gè)頁(yè)面類(lèi)、需要生成一個(gè)新的頁(yè)面對(duì)象時(shí)才調(diào)用。這里就有一個(gè)陷阱:如果你的tomcat啟動(dòng)時(shí)使用了-Dorg.apache.tapestry.disable-caching=true(為了調(diào)試方便而設(shè)),那么你每次刷新頁(yè)面時(shí),它都會(huì)執(zhí)行(因?yàn)槊總€(gè)request都會(huì)新生成一個(gè)頁(yè)面類(lèi)對(duì)象),造成了它總是執(zhí)行的假象。在實(shí)際的部署時(shí),會(huì)使用caching,則這個(gè)函數(shù)執(zhí)行的機(jī)會(huì)很少。所以要注意。
      初始化的代碼放在4 pageBeginRender()中
    2.public void pageValidate(PageEvent event) {}
    如果實(shí)現(xiàn)了PageValidateListener接口,則可以在這里進(jìn)行驗(yàn)證,比如訪問(wèn)權(quán)限等。執(zhí)行完1后,它就開(kāi)始執(zhí)行。
    3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {}
    如果實(shí)現(xiàn)了IExternalPage接口,則可以從這里取得由外面?zhèn)鬟^(guò)來(lái)的參數(shù)。執(zhí)行2后,執(zhí)行到這里。在這里可以把那些參數(shù)取出,賦給頁(yè)面類(lèi)。
    4.public void pageBeginRender(PageEvent event) {}
    執(zhí)行完3后,將執(zhí)行本函數(shù)。但是這時(shí)從客戶(hù)端傳過(guò)來(lái)的參數(shù)還沒(méi)有被賦值(如果提交了表單的話)。這里可以進(jìn)行一些初始化操作。
    5.執(zhí)行完4后,如果有表單提交,在這里將會(huì)取出那些值,賦給對(duì)應(yīng)的字段。(注意:只是將表單中有的值賦過(guò)來(lái))
    6.public void submit()
    如果有表單提交的話,在這里將進(jìn)行對(duì)應(yīng)的操作。因?yàn)榇藭r(shí)各字段已經(jīng)取好值了,所以可以拿來(lái)直接用。
    7.protected void prepareForRender(IRequestCycle cycle) {}
    最后才執(zhí)行這個(gè)方法。我們可以在其中進(jìn)行為了在頁(yè)面上顯示數(shù)據(jù)而進(jìn)行的操作,比如取得什么對(duì)象什么的,因?yàn)檫@里頁(yè)面類(lèi)的屬性賦值已經(jīng)結(jié)束,可以直接拿來(lái)使用了。
    注意:如果執(zhí)行了6,則還要執(zhí)行4,再執(zhí)行7。如果沒(méi)有6,4完了就直接是7。
    以上是我所總結(jié)的執(zhí)行順序,不當(dāng)之處請(qǐng)指出。      

    -----------------------------------------------------
    最開(kāi)始學(xué)tapestry的時(shí)候,覺(jué)得“怎么有這么多地方需要持久啊”。原來(lái)以前只知道pageBeginRender這個(gè)函數(shù),什么初始化操作都放在它里面。可是它是在賦值之前執(zhí)行,所以拿到的字段多都是空的,卻都以為是沒(méi)有持久化的緣故。所以在客戶(hù)端里放了一大堆的@Hidden,或者session中持久,非常麻煩,,,對(duì)tapestry也產(chǎn)生的懷疑。現(xiàn)在才知道那些需要取得客戶(hù)端傳來(lái)的參數(shù)的代碼,最好放在prepareForRender里,很多不必要的持久都可以省掉了


    評(píng)論

    # re: Tapestry 各種組件使用  回復(fù)  更多評(píng)論   

    2015-07-10 16:21 by
    請(qǐng)問(wèn)請(qǐng)問(wèn)
    主站蜘蛛池模板: 毛片视频免费观看| 亚洲性猛交xx乱| 尤物永久免费AV无码网站| 亚洲av不卡一区二区三区 | 亚洲AV永久无码精品一百度影院| 处破痛哭A√18成年片免费| 亚洲精品乱码久久久久久蜜桃图片 | 嫩草视频在线免费观看| 一区二区三区观看免费中文视频在线播放 | 好湿好大好紧好爽免费视频| 亚洲爆乳大丰满无码专区| 亚洲欧洲日韩在线电影| 亚洲成在人天堂一区二区| 亚洲欧洲国产精品香蕉网| 一区二区三区亚洲视频| 日韩免费无码一区二区视频| 噼里啪啦免费观看高清动漫4| 久久久免费的精品| 曰批全过程免费视频在线观看无码 | 一级中文字幕免费乱码专区| 亚洲AV成人片无码网站| 亚洲精品无码av人在线观看 | 精品国产亚洲AV麻豆| 亚洲成AV人片在线观看ww| 亚洲男女内射在线播放| 亚洲国产午夜福利在线播放| 国产精品无码一二区免费| 永久免费视频v片www| 免费黄色app网站| 日韩在线看片免费人成视频播放| 妞干网免费视频观看| 最近中文字幕mv免费高清电影| 免费在线观看视频网站| 精品香蕉在线观看免费| 成人毛片100免费观看| 久久成人永久免费播放| 大地资源网高清在线观看免费| 成人免费区一区二区三区| 性无码免费一区二区三区在线| 久久久久久一品道精品免费看| 免费无码又爽又刺激高潮视频|