我想知道如何在类似于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()
方法,使其返回String
的Object
表示形式,该表示形式可以位于每个技术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>
应该是这样。有关更多的见解,您可能对this或this文章有用。