gpt4 book ai didi

java - 页面刷新验证

转载 作者:搜寻专家 更新时间:2023-10-31 20:28:17 24 4
gpt4 key购买 nike

我的输入字段有一个 <f:ajax>附加对象以通过按 TAB 键进行验证:

<h:inputText id="input2" value="#{bean.property}">
<f:validator validatorId="customValidator" />
<f:ajax execute="@form" render="@this" />
</h:inputText>

如果有任何验证错误,它们将通过类似于 <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
}

这让我可以选择根据某些条件跳过 bean 验证,例如切换到另一个编辑器 View 并将(可能是错误的)数据保存在辅助 bean 中。

现在,我的问题出现在刷新当前页面时(通过按 F5、点击导航栏中的相同链接或类似方式)。支持中明显错误的数据按预期正确显示,但也应标记为无效。因此,我需要一种在每次页面加载时调用验证的方法(目前它仅通过 <f:ajax> 对象调用)。

我试过摆弄这样的东西

<f:ajax event="load" execute="editform" render="editform"/>

附加到 <h:body> .这行得通,但是该站点被绘制了两次-我真的不在乎是否由于页面首先被绘制而没有恶意闪烁,然后通过 ajax 请求进行验证和更新。

我已经搜索了好几个小时来寻找这个问题的解决方案,也许我只是在错误的方向上搜索。有关如何解决此问题的任何建议?

最佳答案

不要使用 @SessionScoped返回一个页面的bean;这是一种 JSF 设计味道(如果有的话)


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

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

备选方案:

  1. 您可以在 viewParam 中引用组件的值并将相同的 validator 附加到该组件:

    <f:metadata>
    <f:viewParam name="theParam" rendered="#{facesContext.postBack}" value="param['form:input2']" validator="customValidator"/>
    </f:metadata>

    这样做会尝试重新提交 input2 的值组件作为 View 参数。 View 参数(在此用法中)是 UIComponent与其他任何东西一样,并且受制于相同的转换/验证语义。

  2. 您还可以将整个组件作为属性传递给 viewParam ,如果您想要更复杂地处理该组件的内容。首先绑定(bind)input2页面范围的组件:

     <h:inputText id="input2" binding="#{input2}" value="#{bean.property}">
    <f:validator validatorId="customValidator" />
    <f:ajax execute="@form" render="@this" />
    </h:inputText>

    然后将组件作为属性传递:

      <f:metadata>
    <f:viewParam name="theParam" rendered="#{facesContext.postBack}" validator="customValidator"/>
    <f:attribute name="input2" value="#{input2}"/>
    </f:metadata>

然后您可以在 validator 中检索该值:

      UIInput input2= (UIInput)component.getAttributes().get("input2");

String input2Value= input2.getSubmittedValue().toString();

关于java - 页面刷新验证,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23831706/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com