选择项:自定义值

   |       Seam
<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的核心组件!


返回顶部