欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

在Tapestry中通用的property selection model

程序员文章站 2022-03-14 09:08:00
...

     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"/>