JSF 2。
一个简单的表单,其中包含一个经过验证的输入。使用o:form来尝试解决问题。
<f:view>
<f:metadata>
<f:viewParam name="info2" value="#{myClass.info2}" />
<f:viewParam name="info1" value="#{myClass.info1}" />
<f:event listener="#{myClass.init(}" type="preRenderView" />
</f:metadata>
<o:form includeViewParams="true">
<h:outputText value="Enter some info for #{myClass.info1}" />
<h:inputText id="input" value="#{myClass.info3}"
validator="myValidator" />
<br />
<h:commandButton action="#{myClass.action()}" value="Enter some info" />
<br />
<h:message for="input" />
<br />
<h:outputText value="#{myClass.info2}" />
</o:form>
</f:view>
使用此网址
http://localhost:8080/test/test.xhtml?info1=hello&info2=there
当我在输入字段中放入一个值并且验证失败时,页面会返回 相同的URL,但myClass.info1和myClass.info2都设置为null。太棒了 URL会被保留,但如果这些参数不是很好的话,它就不会有用。被安置在 豆。
为什么会这样,我该如何解决?
答案 0 :(得分:1)
不幸的是,这是预期的行为。如果验证阶段失败,则不会执行更新模型值阶段。这不仅适用于表单的输入字段,还适用于同一请求中涉及的视图参数!显然,您的bean是请求作用域,然后在初始请求期间设置的视图参数确实会丢失。
您最好的选择是将托管bean设为@ViewScoped
,而使用<o:viewParam>
代替仅在初始GET请求期间设置视图参数。 init()
返回Faces#isPostback()
时,您可能只需要更改true
方法即可跳过作业。