浏览 3490 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2006-04-12
public interface NameAdaptable<T> { public String getName(T obj);; } The IPropertySelectionModel impl class: public class PropertySelectionModel<T> implements IPropertySelectionModel { private final NameAdaptable<T> nameAdapter; private final List<T> items; public PropertySelectionModel(NameAdaptable<T> nameAdaptable,Collection<T> items);{ this.nameAdapter = nameAdaptable; this.items= new ArrayList<T>(items.size(););; this.items.addAll(items);; } public int getOptionCount(); { return items.size();; } public Object getOption(int index); { return getItem(index);; } public String getLabel(int index); { T item = getItem(index);; return nameAdapter.getName(item);; } public String getValue(int index); { return String.valueOf(index);; } public Object translateValue(String value); { return getOption(Integer.parseInt(value););; } public T getFirstItem();{ return getItem(0);; } private T getItem(int index);{ if(index>items.size();); index = items.size();; return items.get(index);; } } Try User it: Collection<Pojo> pojos= service.getPojos(...);; return new PropertySelectionModel<Pojo>(new NameAdaptable<Pojo>();{...},pojos);; Any ideas? 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2006-04-13
假如T 有 getLabel().之类的字段就比较好了. 在NameAdaptable直接return T.getLabel()就行. 假如在这里我要自己定义Label就不太方便了. 还有你这里的value是整个object, 假如定义成table 的 id会不会更好. Tapestry就不必在url上传输一大堆的字符串了.
org.apache.tapestry.vlib.EntitySelectionModel 对Entity比较不错. |
|
返回顶楼 | |
发表时间:2006-04-13
dengyin2000 写道 假如T 有 getLabel().之类的字段就比较好了. 在NameAdaptable直接return T.getLabel()就行. 假如在这里我要自己定义Label就不太方便了.
这个里T没有限制和指定任何特定的接口和方法,反而更好,因为没有任何限制,反而更灵活,可以这样灵活的用: public static final class PojoNameAdapter implements NameAdaptable<Pojo>{ public String getName(Pojo pojo);{ return new StringBuffer(pojo.getId(););.append("--");.append(pojo.getName(););; } } dengyin2000 写道 还有你这里的value是整个object, 假如定义成table 的 id会不会更好. Tapestry就不必在url上传输一大堆的字符串了.
这个没有理解,定义为object和定义为原始类型的id,为什么tapestry就需要在url上传输一大堆字符串呢? dengyin2000 写道 org.apache.tapestry.vlib.EntitySelectionModel 对Entity比较不错. 看了一下,这个就是code: public class EntitySelectionModel implements IPropertySelectionModel { private static class Entry { Integer primaryKey; String label; Entry(Integer primaryKey, String label); { this.primaryKey = primaryKey; this.label = label; } } private static final int LIST_SIZE = 20; private List entries = new ArrayList(LIST_SIZE);; public void add(Integer key, String label); { Entry entry; entry = new Entry(key, label);; entries.add(entry);; } public int getOptionCount(); { return entries.size();; } private Entry get(int index); { return (Entry); entries.get(index);; } public Object getOption(int index); { return get(index);.primaryKey; } public String getLabel(int index); { return get(index);.label; } public String getValue(int index); { Integer primaryKey; primaryKey = get(index);.primaryKey; if (primaryKey == null); return ""; return primaryKey.toString();; } public Object translateValue(String value); { if (value.equals("");); return null; try { return new Integer(value);; } catch (NumberFormatException e); { throw new ApplicationRuntimeException("Could not convert '" + value + "' to an Integer.", e);; } } } 这个也挺好的,考虑到通用型,可以把那个Integer类型的id改为Serializable或者T,不过每次增加一个Entry都要同时指定对应的Label,看起来不舒服。另外也可以再增加一个addAll的方法来增加集合。 |
|
返回顶楼 | |
发表时间:2006-04-13
引用 dengyin2000 写道:
还有你这里的value是整个object, 假如定义成table 的 id会不会更好. Tapestry就不必在url上传输一大堆的字符串了. 这个没有理解,定义为object和定义为原始类型的id,为什么tapestry就需要在url上传输一大堆字符串呢? Serializable Object Outbound to an HTML page 1. The data is serialized to a byte stream. 2. The byte stream is Base64 encoded. 3. The Base64 encoded data is sent out the door Serializable Object Inbound from an HTML request 1. The Base64 text is decoded into a byte stream. 2. The byte stream is read using an ObjectInputStream. 3. The object is handed to the application. 我想是不是用直接用ID更好点. |
|
返回顶楼 | |
发表时间:2006-04-13
dengyin2000 写道 Serializable Object Outbound to an HTML page 1. The data is serialized to a byte stream. 2. The byte stream is Base64 encoded. 3. The Base64 encoded data is sent out the door Serializable Object Inbound from an HTML request 1. The Base64 text is decoded into a byte stream. 2. The byte stream is read using an ObjectInputStream. 3. The object is handed to the application. 我想是不是用直接用ID更好点. 噢,原来你是指这个。 不过在这里,并没有把整个Object都Serializable到Html中,可以看这方法: public String getValue(int index); { return String.valueOf(index);; } public Object translateValue(String value); { return getOption(Integer.parseInt(value););; } 这里仅仅把对应的name和index输出到html中而已,而IPropertySelectionModel是在服务器上的。当然这里可以自己根据需要选择IPropertySelectionModel的生命周期,可以是一直都存在,也可以在Page需要的时候构建,在Page返回Pool的时候设置为null |
|
返回顶楼 | |
发表时间:2006-04-13
you are right. 看了 PropertySelection 的实现.
html上面output的只是label 和value. 当form submit的时候才会调用translateValue, 然后set PropertySelection的setValue(getModel().translateValue(value);) int count = model.getOptionCount();; boolean foundSelected = false; Object value = getValue();; for (int i = 0; i < count; i++); { Object option = model.getOption(i);; writer.begin("option");; writer.attribute("value", model.getValue(i););; if (!foundSelected && isEqual(option, value);); { writer.attribute("selected", "selected");; foundSelected = true; } writer.print(model.getLabel(i););; writer.end();; writer.println();; } writer.end();; // <select> String value = cycle.getParameter(getName(););; Object object = getModel();.translateValue(value);; try { getValidatableFieldSupport();.validate(this, writer, cycle, object);; setValue(object);; } catch (ValidatorException e); { getForm();.getDelegate();.record(e);; } |
|
返回顶楼 | |