我想知道如何在类似于Spring集合属性编辑器的Java Server Faces中使用Converters

假设以下模型

public class Group {

    private String name;

    List<User> users = new ArrayList<User>();

    // getter's and setter's
}


和等效形式

<form ...>
    <h1>Group form</h1>
    <label for="name">Enter name</label>
    <input type="text" name="name"/>

    <label for="users">Select users</label>
    <!--value attribute stores userId-->
    <input type="checkbox" value="1" name="users"/> User 1
    <input type="checkbox" value="2" name="users"/> User 2
    <input type="checkbox" value="3" name="users"/> User 3
</form>


如果我使用Spring来绑定Group类中的users属性,我会打电话给

binder.registerCustomEditor(List.class, new CustomCollectionEditor() {
    protected Object convertElement(Object userId)  {
        return new User((Integer) userId);
    }
});


使用Java Server Faces时如何获得相同的效果?

问候,

最佳答案

为此,您可以实现javax.faces.convert.Converter。其API非常易于解释:相应地编写getAsString()方法,使其返回StringObject表示形式,该表示形式可以位于每个技术ID(例如userId)下。然后,要使JSF在应用请求参数阶段设置正确的Object,您需要实现getAsObject(),使其返回与给定的Object值关联的String

基本上:

public class UserConverter implements Converter {

    private UserDAO userDAO = SomeDAOManager.getUserDAO();

    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return String.valueOf(((User) value).getId());
    }

    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return userDAO.find(Long.valueOf(value));
    }

}


如下所示在faces-config.xml中注册它:

<converter>
    <converter-for-class>com.example.model.User</converter-for-class>
    <converter-class>com.example.converter.UserConverter</converter-class>
</converter>


应该是这样。有关更多的见解,您可能对thisthis文章有用。

09-30 14:36
查看更多