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

你可能感兴趣的:(apache,html,tapestry)