Jsf 验证失败时如何访问POST参数
我需要根据一些输入字段显示响应页面。例如,下面的“授权”选项卡:Jsf 验证失败时如何访问POST参数,jsf,jsf-2,jsf-2.2,Jsf,Jsf 2,Jsf 2.2,我需要根据一些输入字段显示响应页面。例如,下面的“授权”选项卡: #{controllerBean.tabId} ... <h:form id="edit"> <h:inputHidden value="#{controllerBean.tabId}" id="tabid" /> <h:inputText value="#{controllerBean.name}" id="name" /> </h:form> 或使用绑定: #{tabI
#{controllerBean.tabId}
...
<h:form id="edit">
<h:inputHidden value="#{controllerBean.tabId}" id="tabid" />
<h:inputText value="#{controllerBean.name}" id="name" />
</h:form>
或使用绑定:
#{tabId.value}
<h:inputHidden value="#{controllerBean.tabId}" id="tabid" binding="tabId" />
#{tabId.value}
我的问题是,这两种做法中哪一种更好或最好?还是有更好的方法
更新: 注意。在我的特定案例中,tabid由客户端javascript设置
<h:form id="edit">
<h:inputHidden value="#{controllerBean.tabId}" id="tabid" />
<h:inputText value="#{controllerBean.name}" id="name" >
<p:ajax process="tabid" immediate="true" event="keyup" />
</h:inputText>
</h:form>
上面的代码将在用户输入某个值时执行,该值将被处理并设置为managedBean。我想这就是你想要的。实现这一点的另一种非完美方式是将验证逻辑转移到动作方法中。如果验证失败,您只需停止处理(并添加适用的FacesMessage)。您只需要知道,所有的模型值都将被更新,如果需要,您可以清除它们 由于在验证失败时更新模型值与JSF生命周期背道而驰,我认为任何解决方案都有点像黑客。您可以向组件添加一个新的组件并从中选择值。我将推荐
preValidate
侦听器:
<h:form id="edit">
<h:inputHidden value="#{controllerBean.tabId}" id="tabid">
<f:event type="preValidate" listener="#{controller.grabTabId}"/>
</h:inputHidden>
<h:inputText value="#{controllerBean.name}" id="name" />
</h:form>
但是在managedBean中哪里需要它,但是如果发生验证错误,您的managedBean将不会被调用。需要它的不是我的bean,而是我的页面。具体来说,我的页面需要tabid来知道要显示哪个选项卡您是否有机会使用
@ViewScoped
?这将允许您在bean中保留当前选项卡id。该选项卡id由客户端javascript指定,因此原始页面没有它。我认为视图范围也没有帮助(不使用ajax):(用我的具体案例更新了问题。你是否需要tabId
在bean中用于其他目的?或者你是否只有一个属性+getter+setter在bean中其他地方没有使用,例如操作?谢谢你的快速回答。我的controllerBean是requestScope,我认为ajax方式不起作用?@Kai然后使用@ViewScoped
至少是这样。我不建议每个键都使用ajax,文本中每个新字符可能会有很多请求。tabid由客户端javascript指定,而原始页面没有。因此我认为视图范围也没有帮助(不使用ajax):(根据我的具体情况更新了问题。)
<h:form id="edit">
<h:inputHidden value="#{controllerBean.tabId}" id="tabid">
<f:event type="preValidate" listener="#{controller.grabTabId}"/>
</h:inputHidden>
<h:inputText value="#{controllerBean.name}" id="name" />
</h:form>
public void grabTabId(ComponentSystemEvent cse){
//obtain a reference to the component
HtmlInputHidden hiddenElement = (HtmlInputHidden)cse.getComponent();
//get the value from the component.
String hiddenValue = hiddenElement.getValue();
}