我的输入字段<f:ajax>附有一个对象,可以通过按TAB进行验证:
<h:inputText id="input2" value="#{bean.property}">
<f:validator validatorId="customValidator" />
<f:ajax execute="@form" render="@this" />
</h:inputText>
Run Code Online (Sandbox Code Playgroud)
如果存在任何验证错误,它们将通过类似的自定义组件显示<h:messages>,输入框将通过自定义设置样式PhaseListener.
我已经实现了一个自定义Faces Validator来跳过验证:
public class CustomValidator {
public void validate(FacesContext context, UIComponent component,
Object value) throws ValidatorException {
if (skipValidation(context)) {
return;
}
//Validation code goes here
}
Run Code Online (Sandbox Code Playgroud)
这使我可以根据某些条件跳过bean验证,例如切换到另一个编辑器视图并在支持bean中保存(可能是错误的)数据.
现在,刷新当前页面时出现问题(通过按F5,点击导航栏中的相同链接或类似链接).支持中明显错误的数据按预期正确显示,但也应标记为无效.因此,我需要一种方法来在每个页面加载时调用验证(目前它<f:ajax>仅通过对象调用).
我试着摆弄这样的东西
<f:ajax event="load" execute="editform" render="editform"/>
Run Code Online (Sandbox Code Playgroud)
附属于<h:body>.这是有效的,但网站被绘制了两次 - 如果由于页面首先被绘制而没有邪恶的闪烁,我将不会真正关心,然后通过ajax请求进行验证和更新.
我已经搜索了几个小时来解决这个问题,也许我只是在错误的方向搜索.对于如何解决这个问题,有任何的建议吗?
不要使用@SessionScopedbean 来支持页面;这是一种 JSF 设计味道(如果有的话)
使用该preRenderView事件来触发(或检查)您在页面加载时选择的任何验证逻辑。作为开始:
<f:event type="preRenderView" listener="#{bean.validate}" rendered="#{facesContext.postBack}" />
Run Code Online (Sandbox Code Playgroud)
<f:event/>标记在您的页面上注册一个事件侦听器。type="preRenderView"属性规定该事件应在页面加载之前执行rendered="#{facesContext.postBack}"将确保仅在刷新同一页面时加载事件,而不是在第一次加载时加载事件listener将引用支持 bean 方法,您可以在其中执行所需的验证。在此侦听器中,您可以抛出一个ValidationException并FacesMessages适当地排队备择方案:
您可以在 a 中引用组件的值viewParam并将相同的验证器附加到该组件:
<f:metadata>
<f:viewParam name="theParam" rendered="#{facesContext.postBack}" value="param['form:input2']" validator="customValidator"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)
这样做的目的是尝试重新提交input2作为视图参数重新提交。视图参数(在此用法中)与UIComponent任何其他参数一样,并且遵循相同的转换/验证语义。
viewParam如果您想要更复杂地处理该组件的内容,您还可以将整个组件作为 的属性传递。首先绑定input2组件绑定到页面范围:
<h:inputText id="input2" binding="#{input2}" value="#{bean.property}">
<f:validator validatorId="customValidator" />
<f:ajax execute="@form" render="@this" />
</h:inputText>
Run Code Online (Sandbox Code Playgroud)
然后将组件作为属性传递:
<f:metadata>
<f:viewParam name="theParam" rendered="#{facesContext.postBack}" validator="customValidator"/>
<f:attribute name="input2" value="#{input2}"/>
</f:metadata>
Run Code Online (Sandbox Code Playgroud)然后您可以在验证器中检索该值:
UIInput input2= (UIInput)component.getAttributes().get("input2");
String input2Value= input2.getSubmittedValue().toString();
Run Code Online (Sandbox Code Playgroud)