<s:selectItems />和<s:convertEntity />输出基于数值序列的键到页面。我如何让它输出有意义的内容(例如,实体的自然ID)?
你为什么要这样做?也许你想使用JavaScript在客户端进行一些操作。
在Seam 2.0.1中,我添加了两种机制来完成这个任务。你需要根据你的需求选择其中之一。
默认情况下<s:selectItems value="#{people}"/>使用其itemValue(它作为<option />) 的值。也许你想使用关联的对象(例如,#{person.employeeNumber}
<h:selectOneMenu value="#{project.teamLeadEmployeeNumber}"> <s:selectItems value="#{people}" var="person" label="#{person.name}" itemValue="#{person.employeeNumber}" /> </h:selectOneMenu>
)。在这种情况下,它就像这样简单<s:convertEntity />但是,如果你想要使用itemValue(它与这种方法不兼容),原因是什么?因为value属性引用的值传递给<s:convertEntity />.
所以,如果你想要使用带有自定义键的<s:convertEntity />,你需要提供一个将实体标识符转换为输出值并返回的策略。
首先,覆盖org.jboss.seam.ui.entityIdentifierStore组件
@Name("org.jboss.seam.ui.entityIdentifierStore") @Scope(PAGE) public class MyEntityIdentifierStore extends EntityIdentifierStore {
然后,覆盖public String put(Identifier identifier, Object entity)方法
public String put(Identifier identifier, Object entity) { if (entity instanceof Person) { Person person = (Person) entity; return "person:" + person.getEmployeeNumber(); } else { return super.put(identifier, entity); } }
最后,覆盖public Identifier get(String key):
public Identifier get(String key) { if (key.startsWith("person")) { String id = key.substring(6, key.length()); return new EntityIdentifier(Person.class, new Long(id)); } else { return super.get(key); } } }
我已经使用了EntityIdentifier因为我正在使用JPA,但当然,如果你使用纯Hibernate,你也可以使用HibernateEntityIdentifier。
我希望你已经通过这个教程学会了如何自定义<s:selectItems />,但我还希望它能够突出我认为Seam最强大的功能之一——你可以轻松地覆盖Seam的核心组件!