`

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
分享到:
评论

相关推荐

    Tapestry In Action

    ### 第一部分:使用基本Tapestry组件 #### 第1章:介绍Tapestry - **Tapestry概述**:介绍了Tapestry框架的基本概念、架构和特点。Tapestry是一个基于Java的Web应用开发框架,它提供了一种构建高度交互式网页的方法...

    tapestry-project-4.1.5

    Tapestry 是一个基于 Java 的开源Web 应用程序框架,它强调组件化开发,提供了一种强大的方式来构建动态、高性能的Web 应用。在"tapestry-project-4.1.5"这个压缩包中,我们有机会深入探索 Tapestry 4.1.5 版本的...

    Tapestry5使用文档

    **自定义组件** 是 Tapestry5 强大的地方之一,下面列举了一些常用的自定义组件: 1. **上传组件 Upload**:支持同步上传。 2. **ajax 上传图片组件 Uploads**:支持异步上传,提高了交互性。 3. **二级省市级联...

    tapestry3文档

    设计Tapestry应用涉及多个步骤,包括确定存储策略、页面流、共享逻辑、引擎服务和常用组件。良好的设计可以提高应用的性能和可维护性。 ### 八、Coding Tapestry Applications 编码Tapestry应用需要掌握一系列技术...

    tapestry5中文文档

    Apache Tapestry 5 是一个基于Java的Web应用开发框架,其设计目的是为了简化Web应用程序的构建,提供组件化的页面构建、输入验证、本地化、状态管理和URL映射等功能。Tapestry 5 强调易用性,不仅对终端用户友好,...

    tapestry 源码

    这些文件通常包含项目使用的开源许可协议信息,比如Apache License 2.0,这是许多开源项目常用的许可协议,允许自由使用、修改和分发代码,但可能需要保留原始作者的版权信息。 1. **tapestry-core**:这是Tapestry...

    Tapestry UsersGuide

    - **Tapestry对象属性**:本节详细列出了Tapestry框架中常用的对象及其属性。这对于理解和使用Tapestry非常有用。 - **Tapestry JAR 文件**:列出了Tapestry框架所需的JAR文件。了解这些文件有助于解决依赖问题。 - ...

    tapestry4.0简易教程

    **4.4 组件使用指定包** - **概念理解:** 指定组件所在的包路径。 - **具体实践:** 在HTML文件中使用`xmlns:t="http://tapestry.apache.org/schema/tapestry-4.xsd"`来声明命名空间。 **4.5 给模板传值** - **...

    Java开发常用的四大框架

    Java开发常用的四大框架是开发Java应用时不可或缺的部分,它们极大地提高了开发效率,简化了代码管理,使得项目构建和维护变得更加规范和便捷。下面我们将详细探讨这四大框架:Spring MVC、MyBatis、Spring框架和...

    Java开源 AJAX框架

    6. **Tacos**:Tacos为Tapestry Web框架提供高性能组件,并为Dojo、Prototype、script.aculo.us和Rico等AJAX框架提供服务端Java支持。 7. **Taconite**:Taconite是一个J2EE框架,包含客户端JavaScript库和一组JSP...

    Java学习的30个目标.txt

    - **Tapestry**:了解Tapestry框架的特点,学会使用组件模型进行Web开发。 - **Cocoon**:掌握Cocoon框架的配置方法,了解其在内容管理中的应用。 #### 九、Web容器 - **Tomcat、Resin、JRun**:熟悉常用的Web...

    Wicket.pdf(Wicket开发指南)

    - **WebMarkupContainer:** 最常用的容器组件,用于容纳其他组件。 - **Panel:** 用于创建可重用的面板组件。 - **Border:** 用于添加装饰效果的容器。 - **Include:** 用于包含其他页面片段。 - **超链接...

    Java程序员培训内容.pdf

    5. **Tapestry**:另一个MVC框架,提供组件化开发和声明式编程。 ### 基于Linux的Java开发 1. **Linux基础**:熟悉Linux操作系统,包括安装、常用命令和Shell脚本编程。 2. **JDK配置**:在Linux环境下配置Java开发...

    Pro Ajax and Java.pdf

    - **Tapestry**:本书还介绍了一种名为Tapestry的Web框架,并讨论了如何在其基础上使用Ajax技术来增强用户体验。 本书《Pro Ajax and Java》不仅详细阐述了Ajax的基础知识和技术细节,还深入探讨了如何在Java环境中...

    EasyJWeb简易教程pdf版

    - **实用组件介绍**:列举了EasyJWeb中常用的实用组件及其功能,这些组件可以帮助开发者更快地实现特定功能。 通过以上内容的学习,开发者不仅能够掌握EasyJWeb框架的基本使用方法,还能深入了解其设计理念和技术...

    Spring中文帮助文档

    8.3.5. 常用注解 8.3.6. JUnit 3.8遗留支持 8.3.7. Spring TestContext Framework 8.3.8. PetClinic示例 8.4. 更多资源 II. 中间层数据访问 9. 事务管理 9.1. 简介 9.2. 动机 9.3. 关键抽象 9.4. 使用资源...

    Spring API

    8.3.5. 常用注解 8.3.6. JUnit 3.8遗留支持 8.3.7. Spring TestContext Framework 8.3.8. PetClinic示例 8.4. 更多资源 II. 中间层数据访问 9. 事务管理 9.1. 简介 9.2. 动机 9.3. 关键抽象 9.4. 使用资源...

    Wade框架的代码规则

    - **构建工具**:`build` 目录存放了构建脚本,目前使用的是`Ant`作为构建工具。 ### 总结 Wade框架通过严格的代码规则和清晰的目录结构,确保了开发过程中的高效率与可维护性。其核心组件提供了强大的缓存管理、...

    javaServer Faces 技术架构与应用.pdf

    - **Jakarta Tapestry**:支持更高级别的组件化开发。 - **Theiternum UI Framework**:提供了丰富的 UI 组件库。 #### 三、JSF 技术架构详解 ##### 3.1 JSF 的 MVC 架构 - **Model**:通常采用 JavaBeans 实现,...

Global site tag (gtag.js) - Google Analytics