tapestry常用组件使用

1、For
source:是对应的java类里的List 对象或者是个数组 需要抽象 或者提供set get方法
value:是循环这个source对象代表当前的一个 ,需要在page文件中设置问一个属性,可以不在对应的java类里有这个属性
index:是循环的索引值 同value一样 在page文件中设置一个属性即可 <property name="index"/>
在循环的时候 会自动为vlaue和index赋当前的值
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"/> 
    页面表现时,将会到页面类中寻找getUser().getName()方法获取初值并输出 
    相当于在页面上显示数据.

5、 TextField 组件 
e.g. 
    <input type="text" jwcid="username@TextField" value="ognl:username"/> 
    页面表现时,将会到页面类中寻找getUsername()方法获取初值 
    *如果是修改信息页面,通常初始值要在页面表现之前由setUsername()手动设置从数据库中读取出来的值 
    表单提交时,通过setUsername()写入新值(即用户输入值),在类中通过getUsername()获取新值 
    相当于在修改个人信息时,首先读出用户名赋予文本框(用户名)初值,用户修改时填入新值,后台获取之 
    *Hidden属性区分是普通文本输入框(默认false)和密码输入框(hidden="ognl:true") 
    readonly属性设置只读 readonly="true"为只读(后台可读取) 
    *disabled属性设置是否可写 diabled="true"为不可写(后台也不可读取)

6、 TextArea 组件 
e.g. 
    <textarea jwcid="content@TextArea" value="ognl:content" cols="40" rows="10"></textarea> 
    页面表现时,将会到页面类中寻找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为每一个Radio提供一个唯一的ID。RadioGroup跟踪当前被选中的属性值,并且只有一个Radio能够被选中. 
    页面提交时,RadioGroup组件就利用OGNL表达式向headImage字段写入被选中的Radio组件的value参数值. 
    页面表现时(修改页面),将会到页面类中寻找getHeadImage()方法获取初值,然后寻找@Radio组件中与其相同的组件并勾选上.

8、 PropertySelection 组件 
    使用PropertySelection组件必须要构造一个类来实现IPropertySelectionModel接口,并且重写该接口的5个方法. 
    public int getOptionCount() //提供下拉菜单的长度 
    public Object getOption(int index) //提供select标签的option 
    public String getLabel(int index) //提供select标签的Label值,也就是下拉菜单显示的内容 
    public String getValue(int index) //提供select标签的value值 
    public Object translateValue(String value) //selected后的返回值,value值未必就是我们需要的返回值,可以在这个方法里面对返回的value做对应的转换或修改.
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();   
} 


    存入数据库中"1"代表先生,"0"代表女士,通过translateValue(String value)方法转换 
    页面表现时,通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedGender(). 
    然后通过getGender()方法获取初值,比如获取"0",则在页面显示时寻找value值为"0"的选项即为"女士",并选择之作为初始选择项.

e.g.2. 日志类型下拉框 
    <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) {   
    ...//从数据库载入该用户的日志类型列表   
} 


    页面表现时,通过model属性给出的IPropertySelectionModel获取下拉选项,即getSupportedType(). 
    然后通过value属性给出的初始值即,getLogType()方法获取初值,比如获取"2",则在页面显示时寻找value值为"2"的选项即为"生活感触",并选择之作为初始选择项.

9、 Form组件 
e.g. 
    <form jwcid="logForm@Form"> 
      ... 
    </form> 
    Form的监听(listener)方法可以有两种方式: 
      1. 在Form组件中声明. 
        <form jwcid="logForm@Form" listener="ognl:listener:onLogin"> 
          ... 
        </form> 
      2. 在submit类型组件中声明. 
        <input type="submit" jwcid="onLogin@Submit" listener="listener:onLogin" value="发表"/>或者 
        <span jwcid="@ImageSubmit" image="..." listener="listener:onLogin"><img src="..." width="" height=""/></span> 
      前一种方式当Form中只要有submit就会触发监听方法,后一种方式是Form中有多个submit,各自实现不同的监听方法.

G) Foreach 组件 
e.g. 
    <span jwcid="@Foreach" source="ognl:logList" value="ognl:item"> 
    循环组件,遍历source参数,在表现其内容前更新value参数,将Foreach组件所包含的内容重复表现,其中可以通过value参数获取所需显示内容. 
    本例中,页面表现时通过getLogList()方法获取日志列表,循环取出其中数据更新item(日志对象)并予以显示.其中item需要在页面规范(.page)文件中声明: 
    <property name="item"/> 
    *class参数用来寻找类似CSS的文件对Foreach进行修饰. 
    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参数为true时运行Conditional组件中的HTML模板内容. 
    在Tapestry4.0以后就不支持该组件了, 可以使用其他组件来实现: 
    1. Contrib:Choose和Contrib:When 
    <library id="contrib" specification-path="classpath:/org/apache/tapestry/contrib/Contrib.library"/>(.application文件中引入Contrib类包) 
    <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的函数执行顺序========================================】
对之前的该文章进行了一些修正,主要是针对finishLoad()方法。 
我觉得对初学者会有一些帮助。 
下面这几个函数是我在使用的,它们的执行顺序依次从上到下。 
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中的各字段的值赋给页面类 
5. ...... 赋值 
6.public void submit() // 表单提交等用listenter:调用的方法 
7.protected void prepareForRender(IRequestCycle cycle) {} 
---------------------------------------------------- 
1.protected void finishLoad() {} 
这个函数最先执行,但是它实际上没有什么用处(我感觉)。因为: 
  这个函数只在页面池中没有某一个页面类、需要生成一个新的页面对象时才调用。这里就有一个陷阱:如果你的tomcat启动时使用了-Dorg.apache.tapestry.disable-caching=true(为了调试方便而设),那么你每次刷新页面时,它都会执行(因为每个request都会新生成一个页面类对象),造成了它总是执行的假象。在实际的部署时,会使用caching,则这个函数执行的机会很少。所以要注意。 
  初始化的代码放在4 pageBeginRender()中 
2.public void pageValidate(PageEvent event) {} 
如果实现了PageValidateListener接口,则可以在这里进行验证,比如访问权限等。执行完1后,它就开始执行。 
3.public void activateExternalPage(Object[] parameters, IRequestCycle cycle) {} 
如果实现了IExternalPage接口,则可以从这里取得由外面传过来的参数。执行2后,执行到这里。在这里可以把那些参数取出,赋给页面类。 
4.public void pageBeginRender(PageEvent event) {} 
执行完3后,将执行本函数。但是这时从客户端传过来的参数还没有被赋值(如果提交了表单的话)。这里可以进行一些初始化操作。 
5.执行完4后,如果有表单提交,在这里将会取出那些值,赋给对应的字段。(注意:只是将表单中有的值赋过来) 
6.public void submit() 
如果有表单提交的话,在这里将进行对应的操作。因为此时各字段已经取好值了,所以可以拿来直接用。 
7.protected void prepareForRender(IRequestCycle cycle) {} 
最后才执行这个方法。我们可以在其中进行为了在页面上显示数据而进行的操作,比如取得什么对象什么的,因为这里页面类的属性赋值已经结束,可以直接拿来使用了。 
注意:如果执行了6,则还要执行4,再执行7。如果没有6,4完了就直接是7。 
以上是我所总结的执行顺序,不当之处请指出。      

----------------------------------------------------- 
最开始学tapestry的时候,觉得“怎么有这么多地方需要持久啊”。原来以前只知道pageBeginRender这个函数,什么初始化操作都放在它里面。可是它是在赋值之前执行,所以拿到的字段多都是空的,却都以为是没有持久化的缘故。所以在客户端里放了一大堆的@Hidden,或者session中持久,非常麻烦,,,对tapestry也产生的怀疑。现在才知道那些需要取得客户端传来的参数的代码,最好放在prepareForRender里,很多不必要的持久都可以省掉了

引用于: http://www.blogjava.net/tunaic/archive/2008/09/27/231513.html

猜你喜欢

转载自zhaoxiaoboblogs.iteye.com/blog/2346270
今日推荐