如何在不同的消息元素中显示相同输入字段的 ValidatorException 和 required="true"

2024-06-24

我采取了以下BalusC 启动示例 https://stackoverflow.com/a/7493527/617373并通过添加提交按钮和附加 h:messages 并删除f:ajax来自h:inputSecret's(删除了f:ajax由于某种原因,当我第一次离开时h:inputSecret它立即显示第二个“需要值”错误h:inputSecret- 但用户没有机会输入......???

好吧,长话短说:

我试图弄清楚如何在全局 h:messages 中而不是在密码字段的单独 h:message 中显示有关两个密码字段(密码不相等)的验证错误 我确实希望 required="true" 将显示在<h:message每个领域的...

但现在验证消息(由我的异常引发)和 required="true" 显示在同一个地方

这是代码:

<h:outputLabel for="password" value="Password:" />
<h:inputSecret id="password" value="#{bean.password}" required="true">
    <f:validator validatorId="confirmPasswordValidator" />
    <f:attribute name="confirm" value="#{confirmPassword.submittedValue}" />
</h:inputSecret>
<h:message id="m_password" for="password" />

<h:outputLabel for="confirm" value="Password (again):" />
<h:inputSecret id="confirm" binding="#{confirmPassword}" required="true">
</h:inputSecret>
<h:message id="m_confirm" for="confirm" />

还有额外的h:commandButton with h:messages在该代码下面:

<h:commandButton value="doSomething" action="#{myBean.myAction}">
    <f:ajax execute="password confirm" render="m_password m_confirm"></f:ajax>
</h:commandButton>
<h:messages globalOnly="true" styleClass="validation_value_required"/>
@FacesValidator("confirmPasswordValidator")
public class ConfirmPasswordValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        String password = (String) value;
        String confirm = (String) component.getAttributes().get("confirm");

        if (password == null || confirm == null) {
            return; // Just ignore and let required="true" do its job.
        }

        if (!password.equals(confirm)) {
            throw new ValidatorException(new FacesMessage("Passwords are not equal."));
        }
    }

}

Also

提前谢谢,

解决方案(感谢BalusC)

changed

<f:attribute name="confirm" value="#{confirmPassword.submittedValue}" />

to

<f:attribute name="confirm" value="#{confirmPassword}" />

and

String confirm = (String) component.getAttributes().get("confirm");

into

UIInput confirmPasswordComponent = (UIInput) component.getAttributes().get("confirm");
String confirm = (String) confirmPasswordComponent.getSubmittedValue();

and

throw new ValidatorException(new FacesMessage("Passwords are not equal."));

into

context.addMessage(null, new FacesMessage("Passwords are not equal."));
context.validationFailed();
((UIInput) component).setValid(false);
confirmPasswordComponent.setValid(false);
return;

If a Validator在特定组件上抛出ValidatorException,那么它的FacesMessage将自动与该组件关联Validator被调用。

您需要手动添加FacesMessage on a null客户端 ID,以便它最终出现在<h:messages globalOnly="true">。还需要手动设置validationFailed() on FacesContext这样 JSF 就不会更新模型值也不会调用该操作。如果有必要(尽管建议),您还需要手动将组件标记为无效,以便任何适当的侦听器/树访问者(例如用于突出显示)将考虑到这一点。

if (!password.equals(confirm)) {
    context.addMessage(null, new FacesMessage("Passwords are not equal."));
    context.validationFailed();
    ((UIInput) component).setValid(false);
    confirmPasswordComponent.setValid(false); // You'd need to pass it as component instead of as its submitted value in f:attribute.
}

顺便说一句,OmniFaces http://omnifaces.org项目有一个<o:validateEqual>组件应该可以使这个过程变得不那么乏味。也可以看看展示示例 http://showcase.omnifaces.org/validators/validateEqual.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在不同的消息元素中显示相同输入字段的 ValidatorException 和 required="true" 的相关文章

随机推荐

  • 在 Ansible playbook 中指定多个默认组作为主机

    我正在寻找一种方法来指定多个默认组作为 Ansible 剧本中的主机 我一直在使用这个方法 name Do things on hosts hosts specific hosts default development tasks do
  • Rails 从哈希数组中选择最大值

    我有一个像这样的哈希数组 我想取其中的最大值 data name abc value 10 0 name def value 15 0 name ghi value 20 0 name jkl value 50 0 name mno val
  • 如何在 JSF 中使用 cookie

    我有一个基于 JSF 1 2 会话范围 Bean 的 JSF 表单 我有一个 重置 按钮 它会使会话无效 我尝试使用 cookie 来记住会话之间的会话号 不是 JSF 会话 而是我的私人会话号 但失败了 我的问题 初始化 检索和存储 co
  • 在 Android webview 中访问相机功能?

    我正在构建一个 Native Android WebView App 其代码托管在远程服务器上 使用 HTML 和 Javascript Web App 具有通过 HTML 表单启动手机摄像头的功能 输入请求
  • 为什么使用虚拟基类会改变复制构造函数的行为

    在下面的程序中a当 B 实际上从 A 派生并且复制 C 而不是 B 的实例时 不会复制成员变量 include
  • 何时以及如何使用龙卷风?什么时候没用了?

    好的 Tornado 是无阻塞的并且速度相当快 它可以轻松处理大量长期请求 但我想这不是灵丹妙药 如果我们只是盲目地使用 Tornado 运行基于 Django 的网站或任何其他网站 它不会带来任何性能提升 我找不到对此的全面解释 所以我在
  • 摆脱 Visual Studio 中的[动态] JavaScript 视图

    由于我大约 2 个月前从头开始安装了 Visual Studio 2010 因此在调试 IE 中运行的 JavaScript 代码时 它的行为略有不同 当我设置断点时 它会打开标题中带有术语 dynamic 的视图的副本 并在其中标记断点
  • Hibernate 子查询 detachedCriteria

    如何在具有多个子查询的休眠中编写子查询 例如 select from project dtls where project id in select project id from project users where user id s
  • Java JComboBox 不兼容类型:无法转换为字符串

    当我尝试在 JComboBox 中添加项目时出现此错误 不兼容的类型 ComboBox 无法转换为 String 这是我将数据从数据库加载到 JComboBox 的方法 public final void loadProducts try
  • 大 O 表示法求 c 和 n0

    我刚刚了解了 Big O 表示法 并且有人问了我一些问题 但是我对如何确定的值感到困惑n0 我必须证明这一点3n 3 20n 2 5是 O n 3 到目前为止我有 3n 3 20n 2 5 lt cn 3 3 c n 3 20n 2 5 l
  • 如何处理 __init__ 对 __setattr__ 的调用?

    我编写了一个类 用于以方便的方式存储参数以进行酸洗 它超载 setattr 方便访问 它还使用列表来记住添加属性的顺序 以便迭代顺序是可预测的且恒定的 这里是 class Parameters object def init self se
  • 无法在 Qt Creator 中检索调试输出

    在 Windows 上的 Qt Creator 中 qDebug 语句不起作用 并且输出窗口中出现以下消息 无法检索调试输出 如何解决 如果多个 Qt Creator 实例处于活动状态 则可能会出现此问题 要解决此问题 只需关闭 Qt Cr
  • 运行 docker 容器时出错“NoClassDefFoundError”

    我正在尝试 dockerize 一个使用 Maven 构建的简单 Spring Boot 应用程序 Dockerfile FROM openjdk latest COPY target backend 1 0 SNAPSHOT jar ap
  • 使用 JavaScript 检测 URL

    我使用以下脚本将特定页面 首次加载时 强制加载到 第三方 iFrame 中 澄清一下 这个 嵌入 是由第三方系统自动完成的 但前提是页面刷新一次 出于样式和其他一些原因 我希望它从一开始就在那里 现在 我想知道这个脚本是否可以通过检测其 父
  • 按钮点击事件是否会被点击手势识别器覆盖?

    我有一个按钮 如果点击该按钮以外的任何内容 我想让该按钮消失 所以我为删除按钮设置了 target action self deleteButton addTarget self action selector deleteButtonTa
  • $routeProvider - 为所有路由注入相同的依赖项

    以下代码 routeProvider when page1 控制器 MyController 解析 策略 StrategyOne 在实例化控制器 MyController 之前等待策略依赖关系得到解决 在我的应用程序中 我有一个返回承诺的函
  • SVG 极坐标渐变

    我是 SVG 的初学者 但我想学习一些技术 简而言之 有没有一种简单的方法来创建这样的东西 我正在考虑创建一个极坐标渐变 然后裁剪它 但是如何生成极坐标梯度呢 即使没有本地方法 也许可以用简单的线性渐变然后使用一些直角极坐标变换来实现 有办
  • UIBezierPath 用不同的笔画画圆

    基本上我需要有一个具有不同颜色笔划的圆圈 大小都相同 例如 1 2 为蓝色 1 2 为红色 图片 对不起 图片太糟糕了 我怎样才能画出这样的东西 有很多方法可以做到这一点 但一种是只绘制两条贝塞尔曲线路径 每一侧各一条 void drawR
  • 基于 SQl Server 2008 中的 2 列的唯一键?

    SQL Server 是否可以拥有基于 2 列的唯一键 我可以在两列中都有重复项 但不能同时存在 MfgID CustNum 1 Cust01 1 Cust02 2 Cust02 1 Cust03 3 Cust03 3 Cust04 1 C
  • 如何在不同的消息元素中显示相同输入字段的 ValidatorException 和 required="true"

    我采取了以下BalusC 启动示例 https stackoverflow com a 7493527 617373并通过添加提交按钮和附加 h messages 并删除f ajax来自h inputSecret s 删除了f ajax由于