等效弹簧自定义集合属性编辑器使用JSF
问题描述:
当我想知道如何在Java服务器使用转换器面临类似的春季系列属性编辑器等效弹簧自定义集合属性编辑器使用JSF
假设下面的模型
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用户属性绑定在组类,我叫
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()
方法,它返回Object
的String
表示,该表示可以在每个技术ID下,例如userId
。然后,为了让JSF在应用请求参数阶段设置正确的Object
,您需要实现getAsObject()
,它返回与给定的String
值相关联的Object
。
基本上是:
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>
谢谢BalusC(+1)。但它是自动映射到用户属性? – 2009-12-17 22:17:40
你不必担心这一点。转换完全透明。只需在'faces-config.xml'中定义一次,你应该没问题。 – BalusC 2009-12-17 22:18:52
不错的文章,你的答案被接受 – 2009-12-17 22:20:49