2012-01-06 44 views
0

我需要创建一个带有JSF 2.0(不是复合组件)的自定义组件,该组件与SelectManyCheckbox类似,但具有不同的UI。我尝试通过继承UISelectMany并创建一个新的自定义Renderer来实现此目的。继承UISelectMany以创建自定义JSF组件

我不明白的是,客户端上的输入数据如何通过组件传递到Bean中。必须有一种方法可以从POST中收集http params,将它放入List中并将List设置在Bean中。

编辑

我已经尝试过与此类似:

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正确获取。我也可以看到,我的自定义转换器将在此之后被调用。但是价值观并没有达到比恩。但是我可以在日志中看到一个非特定的验证错误。 在网上阅读了一些教程后,我仍然不明白这是如何工作的。必须有一些胶水代码,它将转换后的值传递给Bean中的setter。有人知道这是如何工作的吗?

感谢 月

回答

1

必须有收集来自POST的HTTP PARAMS的方式,把它放在一个列表,并设置在Bean的列表。

这通常要在Renderer类的decode()方法完成。在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))); 
} 

(当然你需要事先做一些验证;再次,检查原始源代码)

+0

感谢您的提示!我认为验证可能是问题。我实现了一个decode()和getConvertedValue(),我可以在调试模式中看到它们被调用。但在此之后,我在日志中看到验证错误。我没有发现为什么会出现此错误...或验证是如何工作的...... – treeno 2012-01-06 20:32:43

+0

验证错误的消息是什么?臭名昭着的“价值无效”? – BalusC 2012-01-06 20:35:42

+0

是的,确切地说......我正在做一些很好的认识错误? ;-)也许UISelectMany检查是否所有选定的值都是从中选择值的完整值列表的一部分。但目前我只有选定的值。我无法在jsf源文件中看到发生这种情况的原因。 – treeno 2012-01-07 20:57:27

0

创建延伸javax.faces.component.UISelectMany

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 
} 

} 
自己的类