对UISelectMany进行子类化以创建自定义JSF组件

时间:2012-01-06 17:53:27

标签: java jsf jsf-2

我需要使用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。有谁知道这是如何工作的?

由于 扬

2 个答案:

答案 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
}

}