`
tapestry
  • 浏览: 188695 次
社区版块
存档分类
最新评论

在Tapestry中通用的property selection model

阅读更多

     Tapestry中构建选择列表需要使用IPropertySelectionModelModel可以映射选择列表中的LabelOptionTapestry中已经提供一个常用的StringSelectonModel,具体组件使用如下:<o:p></o:p>

Html代码<o:p></o:p>

 

Java代码

java 代码
 
  1. public abstract class DetailsPage extends BasePage {  
  2.   
  3.   public static final IPropertySelectionModel GENDER_MODEL =  
  4.   
  5.       new StringPropertySelectionModel(new String[] { "Unspecified""Female""Male" });  
  6.   
  7.    
  8.   
  9.   public abstract String getGender();  
  10.   
  11.    
  12.   
  13.   public void formSubmit(IRequestCycle cycle) {  
  14.   
  15.       // Process form submission  
  16.   
  17.       String genderSelection = getGender();  
  18.   
  19.       ...  
  20.   
  21.   }  
  22.   
  23. }  

      开发中比较常见的选择列表就是类别的选择,,一般是新建一个类别的SelectionModel,例如如下代码

java 代码
 
  1. public class TypeSelectionModel implements IPropertySelectionModel, Serializable {  
  2.   
  3.   private List TypeList;  
  4.   
  5.    
  6.   
  7.   public ItemSelectionModel(List typeList) {  
  8.   
  9.       this. typeList = typeList;  
  10.   
  11.   }  
  12.   
  13.    
  14.   
  15.   public int getOptionCount() { return typeList.size(); }  
  16.   
  17.    
  18.   
  19.   public Object getOption(int index) {  
  20.   
  21.       return ((Type)typeList.get(index)).getId();  
  22.   
  23.   }  
  24.   
  25.    
  26.   
  27.   public String getLabel(int index) {  
  28.   
  29.       return ((Type) typeList.get(index)).getName();  
  30.   
  31.   }  
  32.   
  33.    
  34.   
  35.   public String getValue(int index) { return Integer.toString(index); }  
  36.   
  37.    
  38.   
  39.   public Object translateValue(String value) {  
  40.   
  41.       return getOption(Integer.parseInt(value));  
  42.   
  43.   }  
  44.   
  45. }  

这只是传统方法,开发中的类别如果多了,每一个都要新建一个SelectionModel

下面是在Tapestry JumpStart里看到的通用的SelectionModel,感觉比较不错,现介绍给大家,具体代码如下:

java 代码
 
  1. package com.javaeye.tapestrying.selectionModel;  
  2.   
  3. import java.lang.reflect.InvocationTargetException;   
  4. import java.lang.reflect.Method;  
  5. import java.util.ArrayList;  
  6. import java.util.List;  
  7. import org.apache.tapestry.form.IPropertySelectionModel;  
  8.     
  9. public class ObjectPropertySelectionModel implements IPropertySelectionModel {  
  10.   
  11.        private List _list;  
  12.   
  13.        private Method _methodToGetLabel = null;  
  14.   
  15.        private Method _methodToGetOption = null;  
  16.   
  17.        private boolean _allowNoSelection = false;  
  18.   
  19.        private String _noSelectionMessage = null;  
  20.   
  21.        private int _offset = 0;  
  22.  
  23.        public ObjectPropertySelectionModel() {  
  24.   
  25.               _list = new ArrayList();  
  26.   
  27.               throw new UnsupportedOperationException("Do not use the default constructor.");  
  28.   
  29.        }  
  30.        /** 
  31.  
  32.         * 
  33.  
  34.         * @param list 
  35.  
  36.         *            the list of objects to represent in a PropertySelection 
  37.  
  38.         *            component. WARNING: The objects in the list MUST implement 
  39.  
  40.         *            equals(Object obj) and hashCode(), and if they are EJB3 
  41.  
  42.         *            Entities those methods MUST return the same thing for 
  43.  
  44.         *            different instances of the same detached entity (eg. by 
  45.  
  46.         *            matching on Id only). 
  47.  
  48.         * @param clazz 
  49.  
  50.         *            the class of objects in the list. 
  51.  
  52.         * @param nameOfMethodToGetLabel 
  53.  
  54.         *            the name of the method that PropertySelection must invoke on 
  55.  
  56.         *            each object in the list to get its label to display in the 
  57.  
  58.         *            list on the page. For example, the method name might be 
  59.  
  60.         *            "getShortName". 
  61.  
  62.         * @param nameOfMethodToGetOption 
  63.  
  64.         *            the name of the method that PropertySelection must invoke on 
  65.  
  66.         *            an object when it has been selected. The result is put into 
  67.  
  68.         *            the property named in the "value" parameter of the 
  69.  
  70.         *            PropertySelection. For example, the method name might be 
  71.  
  72.         *            "getKey". If you want the result to be the the whole object 
  73.  
  74.         *            then set this argument to null. 
  75.  
  76.         * 
  77.  
  78.         */  
  79.   
  80.        public ObjectPropertySelectionModel(Listextends Object> list, Class clazz, String nameOfMethodToGetLabel,  
  81.   
  82.                      String nameOfMethodToGetOption) {              this(list, clazz, nameOfMethodToGetLabel, nameOfMethodToGetOption, falsenull);  
  83.   
  84.        }  
  85.        /** 
  86.  
  87.         * 
  88.  
  89.         * @param list 
  90.  
  91.         *            the list of objects to represent in a PropertySelection 
  92.  
  93.         *            component. WARNING: The objects in the list MUST implement 
  94.  
  95.         *            equals(Object obj) and hashCode(), and if they are EJB3 
  96.  
  97.         *            Entities those methods MUST return the same thing for 
  98.  
  99.         *            different instances of the same detached entity (eg. by 
  100.  
  101.         *            matching on Id only). 
  102.  
  103.         * @param clazz 
  104.  
  105.         *            the class of objects in the list. 
  106.  
  107.         * @param nameOfMethodToGetLabel 
  108.  
  109.         *            the name of the method that PropertySelection must invoke on 
  110.  
  111.         *            each object in the list to get its label to display in the 
  112.  
  113.         *            list on the page. For example, the method name might be 
  114.  
  115.         *            "getShortName". 
  116.  
  117.         * @param nameOfMethodToGetOption 
  118.  
  119.         *            the name of the method that PropertySelection must invoke on 
  120.  
  121.         *            an object when it has been selected. The result is put into 
  122.  
  123.         *            the property named in the "value" parameter of the 
  124.  
  125.         *            PropertySelection. For example, the method name might be 
  126.  
  127.         *            "getKey". If you want the result to be the the whole object 
  128.  
  129.         *            then set this argument to null. 
  130.  
  131.         * @param allowNoSelection 
  132.  
  133.         *            If true then adds an element to the start of the list. Its 
  134.  
  135.         *            option is null. 
  136.  
  137.         * @param noSelectionLabel 
  138.  
  139.         *            If null then no label. A typical label might be "Select...". 
  140.  
  141.         * 
  142.  
  143.         */  
  144.        public ObjectPropertySelectionModel(Listextends Object> list, Class clazz, String nameOfMethodToGetLabel,  
  145.   
  146.                      String nameOfMethodToGetOption, boolean allowNoSelection, String noSelectionLabel) {  
  147.               try {  
  148.                      _list = list;  
  149.   
  150.                      _methodToGetLabel = clazz.getMethod(nameOfMethodToGetLabel, (Class[]) null);  
  151.   
  152.                      if (nameOfMethodToGetOption != null) {  
  153.   
  154.                             _methodToGetOption = clazz.getMethod(nameOfMethodToGetOption, (Class[]) null);  
  155.                      }  
  156.                      _allowNoSelection = allowNoSelection;  

  157.                      if (_allowNoSelection) {  
  158.                             _noSelectionMessage = noSelectionLabel; 
  1.                        _offset = 1;  
  2.   
  3.                      }  
  4.               }   
  5.               catch (SecurityException e) {   
  6.                      throw new IllegalStateException(e);  
  7.               }  
  8.               catch (NoSuchMethodException e) {   
  9.                     throw new IllegalArgumentException("Given nameOfMethodToGetLabel=\"" + nameOfMethodToGetLabel + "\", nameOfMethodToGetOption=\""  
  10.   
  11.                             + nameOfMethodToGetOption + "\", class=\"" + clazz + "\".", e);  
  12.               }  
  13.        }  
  14.        public int getOptionCount() {    
  15.               return _list.size() + _offset;  
  16.        }    
  17.        public Object getOption(int index) {   
  18.               if (_allowNoSelection) {  
  19.                      if (index < _offset) {  
  20.                             return null;   
  21.                      }    
  22.               }  
  23.               Object o = _list.get(index - _offset);  
  24.               if (_methodToGetOption == null) {  
  25.                      return o;  
  26.               }  
  27.               else {  
  28.                      try {  
  29.                             Object option = _methodToGetOption.invoke(o, (Object[]) null);  
  30.                             return option;  
  31.                      }  
  32.                      catch (IllegalArgumentException e) {    
  33.                             throw new IllegalStateException("Problem with the given methodToGetOption \"" + _methodToGetOption + "\": ", e);  
  34.                      }  
  35.                      catch (IllegalAccessException e) {  
  36.                             throw new IllegalStateException("Problem with the given methodToGetOption \"" + _methodToGetOption + "\": ", e);  
  37.                      }  
  38.                      catch (InvocationTargetException e) {  
  39.                             throw new IllegalStateException("Problem with the given methodToGetOption \"" + _methodToGetOption + "\": ", e);  
  40.                      }  
  41.               }  
  42.        }
  43.        public String getLabel(int index) {  
  44.               if (_allowNoSelection) {  
  45.                      if (index < _offset) {  
  46.                             return _noSelectionMessage;
  47.                      }  
  48.               }  
  49.               Object o = _list.get(index - _offset);  
  50.               try {  
  51.                      String label = _methodToGetLabel.invoke(o, (Object[]) null).toString();  
  52.                      return label;  
  53.               }  
  54.               catch (IllegalArgumentException e) {  
  55.                      throw new IllegalStateException("Problem with the given methodToGetLabel \"" + _methodToGetOption + "\": ", e);  
  56.               }  
  57.                 catch (IllegalAccessException e) {   
  58.                      throw new IllegalStateException("Problem with the given methodToGetLabel \"" + _methodToGetOption + "\": ", e);    
  59.               }  
  60.               catch (InvocationTargetException e) {  
  61.                      throw new IllegalStateException   ("Problem with the given methodToGetLabel \"" + _methodToGetOption + "\": ", e);   
  62.               }    
  63.        }    
  64.       public String getValue(int index) {   
  65.               return Integer.toString(index);    
  66.        }    
  67.        public Object translateValue(String value) {    
  68.               return value == null ? null : getOption(Integer.parseInt(value));   
  69.        }    
  70. }  

具体使用如下,假如现在有一个配件类型的类

java 代码
  1. public class FittingType {   
  2.     private Long id;  
  3.     private String name;  
  4.     private Set<fitting></fitting> fittings = new HashSet<fitting></fitting>();    
  5. //getter and setter 
  6. }  

<o:p></o:p>

创建配件类时,需要选择配件类型

java 代码
  1. private IPropertySelectionModel fittingTypeSelectionModel;  
  2.   
  3. public IPropertySelectionModel getFittingTypeSelectionModel() {  
  4.   
  5.        if (fittingTypeSelectionModel == null) {  
  6.   
  7.            List<fittingtype></fittingtype> fittingTypes = getFittingTypeService().findAll();  
  8.   
  9.            fittingTypeSelectionModel = new ObjectPropertySelectionModel(  
  10.   
  11.                   fittingTypes, FittingType.class"getName""getId"true,  
  12.   
  13.                   "选择分类");   
  14.        }   
  15.        return fittingTypeSelectionModel;  
  16.     }  
  17. public abstract Long getFittingTypeId();  
  18. public ILink onSave() {   
  19.        //其他   
  20.        if (getFittingTypeId() != null) {  
  21.   
  22.            fitting.setType(getFittingTypeService()  
  23.   
  24.                   .findByID(getFittingTypeId()));  
  25.   
  26.        }  
  27.  
  28.        //其他    
  29.     }  

Html中定义组件<o:p></o:p>


java 代码
  1. "type@PropertySelection" model="ognl:fittingTypeSelectionModel" value="ognl:fittingTypeId" displayName="配件类型"/>  

<o:p> </o:p>

具体定义中

fittingTypeSelectionModel = new ObjectPropertySelectionModel(<o:p></o:p>

                  fittingTypes, FittingType.class, "getName", "getId", true,<o:p></o:p>

                  "选择分类");<o:p></o:p>

       }<o:p></o:p>

参数1:候选的List

参数2:类别

参数3labelgetter方法

参数4optiongetter方法

参数5:是否允许没有选项

参数6:没有选项时的label

<o:p> </o:p>

好了,项目中又多了个通用的东西,开发时又可以happy了。

java 代码
 
  1. "@PropertySelection" model="ognl:@com.myexample.DetailsPage@GENDER_MODEL" value="ognl:gender"/>  

分享到:
评论
4 楼 cgc520 2007-06-19  
错是不错,可是我总觉得效率还是太低了,因为它用到了java的一些反射机制.页面刷新的时候可能会慢点吧!
3 楼 wrong1111 2006-12-15  
这个不错!!!顶一下,建议加精!!!
2 楼 zhangqidi 2006-12-07  
very good
1 楼 tapestry 2006-12-07  
改了n遍终于提交上来了,请问html代码如何加,加上去之后自动解析,后边的都没有了,上边的是去掉了好多html代码后的,少了一些内容。

相关推荐

    Tapestry通用WEB框架

    6. **切换皮肤**:在Tapestry中,可以轻松实现皮肤的切换,这通常涉及到更换CSS样式表和可能的图片资源。开发者可以通过配置文件或程序逻辑来改变应用的外观,满足不同用户需求。 7. **自主分页**:Tapestry提供了...

    tapestry官方中文文档

    在Tapestry中,大多数的编程都是声明式的,这意味着开发者可以使用XML或注解来定义页面和组件的行为,而不是编写大量的Java代码。这降低了代码的复杂性,提高了可读性和维护性。 4. **页面和组件生命周期**: ...

    tapestry5中文文档

    在Tapestry 5 中,开发者可以通过创建CRUD(创建、读取、更新、删除)功能的应用来了解框架的核心概念。这包括页面导航、依赖注入和资源注入、用户输入验证以及状态管理。Tapestry 还内置了Ajax支持,使得创建Ajax...

    tapestry源码 api等

    3. **Tapestry Hibernate**: 这个库提供了与Hibernate ORM框架的集成,允许开发者方便地在Tapestry应用中使用Hibernate进行数据持久化操作。通过源码,我们可以学习如何在Tapestry中配置和使用Hibernate服务。 4. *...

    tapestry官方中文文档及中文字典

    "tapestry中文字典"可能包含对Tapestry框架中的专有名词、API和概念的中文解释,帮助读者更准确地理解和记忆。它可能是以索引形式存在,方便查找和查阅。 通过学习这些文档,开发者可以全面了解Tapestry 4的架构和...

    Tapestry简单入门.rar_java Tapestry_tapestry

    在"Tapestry入门.docx"中,你将了解到如何设置开发环境,包括安装必要的工具和库,配置IDE(如Eclipse或IntelliJ IDEA),以及创建第一个Tapestry应用。这通常涉及以下几个步骤: 1. **环境配置**:安装Java ...

    Tapestry API

    在Tapestry中,模型、视图和控制器的概念得到了清晰的体现。`Model`代表数据和业务逻辑,`View`负责呈现,而`Controller`则处理用户请求并协调模型和视图。Tapestry API提供了`org.apache.tapestry5.corelib....

    Tapestry中的Table和Tree的完整教程

    在这个完整的教程中,我们将深入探讨Tapestry中的Table和Tree组件,这两种组件在数据展示和交互中扮演着重要角色。 ### Tapestry Table组件 Table组件是Tapestry中用于显示数据列表的关键组件。它允许开发者以表格...

    tapestry教程资料文档合集

    Tapestry5最新中文教程.doc 作者 Renat Zubairov & Igor Drobiazko译者 沙晓兰 发布于 2008年7月2日 下午9时30分 社区 Java 主题 Web框架 ----------------------------------------- Tapestry5.1实例教程.pdf ...

    Tapestry教程

    Tapestry是一个强大的Java web应用程序框架,它融合了MVC(Model-View-Controller)模式和模板技术,为开发者提供了一种高效且优雅的方式来构建动态Web应用。Tapestry的核心理念是将视图逻辑与业务逻辑完全分离,...

    tapestry3开发指南,带tapestry3所有jar包

    3. **声明式编程**:Tapestry 3允许开发者在HTML模板中直接嵌入Java代码,减少了编写繁琐的控制器逻辑的需要。开发者可以通过简单的属性和事件绑定来声明组件的行为。 **二、Tapestry 3 的工作原理** 1. **页面和...

    tapestry4.02中封装ext的GridPanel组件

    在IT行业中,Web开发是一个重要的领域,而Tapestry和ExtJS是两个广泛使用的框架,它们各自在构建动态和交互式的Web应用上有着独特的优点。本文将深入探讨Tapestry 4.02版本中对ExtJS的GridPanel组件进行封装的相关...

    Tapestry5.0.16_API文档

    Tapestry5.0.16文档和大家一起学习

    Tapestry5最新中文教程

    在Tapestry 5 中,应用由组件构建,页面由这些组件组成。这些组件可以独立开发和复用,增强了代码的模块性和可维护性。通过依赖注入(Dependency Injection,DI)和资源注入(Resource Injection),Tapestry 5 可以...

    Tapestry4开发指南

    Tapestry3.1在设计初期即在Hivemind框架下构建,但由于某些原因,没有从Hivemind中独立出来,从而发展成了Tapestry4.0。Tapestry4与Hivemind的结合,虽然在最初可能会引发一些争议,尤其是对于那些习惯于Spring框架...

    Tapestry 4 官方文档中版本

    这个框架在Web应用开发中提供了一种组件化和模板化的编程模型,使得开发者可以更高效地构建动态、交互式的Web页面。以下是对Tapestry 4官方文档中版本的详细解析: 1. **组件化开发**: Tapestry 4的核心特性之一...

    Tapestry5最新中文入门实例教程

    通过本教程的学习,你已经了解了Tapestry 5的基础知识及其在实际开发中的应用。Tapestry 5不仅简化了Web应用程序的开发过程,还为开发者提供了丰富的工具和特性来构建高质量的Web应用。希望本教程能够为你开启...

    tapestry5.3.5 IOC用户登陆权限

    在IT行业中, Tapestry 是一个基于Java的开源Web应用程序框架,它强调组件化、类型安全和高度可测试性。Tapestry 5.3.5是该框架的一个版本,提供了许多增强的功能和改进。在这个场景中,我们关注的是"IOC用户登陆...

Global site tag (gtag.js) - Google Analytics