页面刷新验证

INK*_*INK 5 java ajax jsf

我的输入字段<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请求进行验证和更新.

我已经搜索了几个小时来解决这个问题,也许我只是在错误的方向搜索.对于如何解决这个问题,有任何的建议吗?

kol*_*sus 3

不要使用@SessionScopedbean 来支持页面;这是一种 JSF 设计味道(如果有的话)


使用该preRenderView事件来触发(或检查)您在页面加载时选择的任何验证逻辑。作为开始:

<f:event type="preRenderView" listener="#{bean.validate}" rendered="#{facesContext.postBack}" />
Run Code Online (Sandbox Code Playgroud)
  1. <f:event/>标记在您的页面上注册一个事件侦听器。
  2. type="preRenderView"属性规定该事件应在页面加载之前执行
  3. rendered="#{facesContext.postBack}"将确保仅在刷新同一页面时加载事件,而不是在第一次加载时加载事件
  4. listener将引用支持 bean 方法,您可以在其中执行所需的验证。在此侦听器中,您可以抛出一个ValidationExceptionFacesMessages适当地排队

备择方案:

  1. 您可以在 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任何其他参数一样,并且遵循相同的转换/验证语义。

  2. 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)