jsf 1.2 - JSF 1.2 empty <h:selectManyListbox /> validation issue -
i'm kind of new jsf , i'm having trouble understand values jsf renders in form after validation fails. im using websphere 7 , default implementation of jsf, myfaces (i think 2.0).
my xhtml looks this:
<h:form id="form"> <h:inputtext id="text" value="#{backing.text}" required="true"/> <h:message for="text" /> <h:selectmanylistbox id="options" value="#{backing.options}" required="true"> <f:selectitem itemlabel="1" itemvalue="1" /> <f:selectitem itemlabel="2" itemvalue="2" /> <f:selectitem itemlabel="3" itemvalue="3" /> </h:selectmanylistbox> <h:message for="options" /> <h:commandbutton value="save" /> </h:form> and backing bean this:
public class backing { private string text; private string[] options; public string gettext() { return text; } public void settext(string text) { this.text = text; } public string[] getoptions() { return options; } public void setoptions(string[] options) { this.options = options; } } - i fill
<h:inputtext />text. - i select 2 options
<h:selectmanylistbox /> - i press 'save' button
- the form rendered value entered
<h:inputtext />, options selected on<h:selectmanylistbox />(no validation messages shown, expected) - now ...
- i empty
<h:inputtext /> - i deselect 2 options
<h:selectmanylistbox /> - i press 'save' button
- the form renders
<h:inputtext />empty ,<h:selectmanylistbox />previous options had selected (both validation messages shown, expected)
as can see, behaviour when rendering <h:inputtext /> , <h:selectmanylistbox /> different:
<h:inputtext />renders component's submitted value<h:selectmanylistbox />renders bean's value
i've been trying render <h:selectmanylistbox /> no options selected without hacking or messing code, had no luck.
¿is bug? ¿am missing something?
the less hacky solution found copy , re-implement method renderoption, overriding default menurenderer.
the original source had decompile (version 1.2_13). notice i'm pasting lines need changed. if need use solution have copy full contents of method:
public class menurenderer extends htmlbasicinputrenderer { protected void renderoption(facescontext context, uicomponent component, converter converter, selectitem curitem, object currentselections, object[] submittedvalues, htmlbasicrenderer.optioncomponentinfo optioninfo) throws ioexception { (...) object valuesarray; object itemvalue; if (submittedvalues != null) { boolean containsvalue = containsavalue(submittedvalues); if (containsvalue) { valuesarray = submittedvalues; itemvalue = valuestring; } else { valuesarray = currentselections; itemvalue = curitem.getvalue(); } } else { valuesarray = currentselections; itemvalue = curitem.getvalue(); } (...) } } i created customlistboxrenderer (listboxrenderer extends menurenderer) this:
public class customlistboxrenderer extends listboxrenderer { @override protected void renderoption(facescontext context, uicomponent component, converter converter, selectitem curitem, object currentselections, object[] submittedvalues, htmlbasicrenderer.optioncomponentinfo optioninfo) throws ioexception { (...) object valuesarray; object itemvalue; if (submittedvalues != null) { valuesarray = submittedvalues; itemvalue = valuestring; } else { valuesarray = currentselections; itemvalue = curitem.getvalue(); } (...) } } and added in faces-config next lines:
<render-kit> <renderer> <component-family>javax.faces.selectmany</component-family> <renderer-type>javax.faces.listbox</renderer-type> <renderer-class>customlistboxrenderer</renderer-class> </renderer> </render-kit>
Comments
Post a Comment