我需要使用JSF 2.0(非复合组件)创建自定义组件,类似于SelectManyCheckbox,但具有不同的UI。我尝试通过继承UISelectMany并创建一个新的自定义渲染器来实现这一目的。
我不明白的是,客户端上的输入数据如何通过Component传递到Bean中。必须有一种方法从POST中收集http参数,将其放在List中并在Bean中设置List。
编辑
我已经尝试过的与此类似:
public void decode(FacesContext context, UIComponent component) {
if ((context == null) || (component == null)) {
throw new NullPointerException();
}
MapComponent map = (MapComponent) component;
String key = getName(context, map);
String value = (String)context.getExternalContext().
getRequestParameterMap().get(key);
if (value != null)
map.setCurrent(value);
}
}
我可以在调试器中看到,我的http-params被正确获取。我还可以看到,之后会调用我的自定义Converter。但价值观没有达到Bean。但我可以在日志中看到非特定的验证错误。 在网上阅读了一些教程后,我仍然不明白这是如何工作的。必须有一些胶水代码,它接受转换后的值并将其传递给Bean中的setter。有谁知道这是如何工作的?
由于 扬
答案 0 :(得分:1)
必须有办法从POST中收集http参数,将其放入List并在Bean中设置List。
这通常是在decode()
类的Renderer
方法中完成的。在Mojarra的情况下,它是com.sun.faces.renderkit.html_basic.MenuRenderer
类。只需要download来源并查看它是如何完成的。
基本上,您只需获取与组件的客户端ID关联的请求参数值作为参数名称,然后将其设置为UIInput#setSubmittedValue()
的提交值。
public void decode(FacesContext context, UIComponent component) {
((UIInput) component).setSubmittedValue(context.getExternalContext().getRequestParameterValuesMap().get(component.getClientId(context)));
}
(当然你需要事先做一些验证;再次检查原始源代码)
答案 1 :(得分:0)
创建扩展javax.faces.component.UISelectMany
的Own类class MySelectMany extends javax.faces.component.UISelectMany
{
//over-ride methods of javax.faces.component.UISelectMany
// this method is inherited from javax.faces.component.UIComponentBase. You can use this method to set the rendererType
public void setRendererType(java.lang.String rendererType)
{
// custom rendering
}
}