【问题标题】:JSF outputlabel clearJSF 输出标签清除
【发布时间】:2013-05-10 21:53:24
【问题描述】:

我有以下问题。我只提供 PIN 时使用表格。我有验证器检查它是否是 4 位数字。然后将提交的操作设置为检查 PIN 是否存在于数据库中的方法。如果不是,则 message = "no PIN";我在表单下方的输出标签中使用了消息。以前它是空的,所以那里没有消息。现在它变为“无 PIN”,但我必须在再次单击提交按钮后将其清除,因为当您输入例如“12as”PIN 并且验证器会处理它时,错误消息不会消失。我应该如何实施这种情况?也许在这种情况下使用输出标签是一个错误的想法?

【问题讨论】:

  • 请发布您的代码(也在这里:)

标签: jsf label output


【解决方案1】:

您不应在操作方法中执行验证。您应该使用真正的验证器。

只需相应地实现Validator 接口即可。例如

@FacesValidator("pinValidator")
public class PinValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        String pin = (String) value;

        if (pin == null || pin.isEmpty()) {
            return; // Let required="true" deal with it if necessary.
        }

        if (!pin.matches("\\d{4}")) {
            throw new ValidatorException(new FacesMessage("PIN must be 4 digits"));
        }

        if (!somePinService.exists(pin)) {
            throw new ValidatorException(new FacesMessage("PIN is unknown"));
        }    
    }

}

如下使用:

<h:outputLabel for="pin" value="PIN" />
<h:inputText id="pin" value="#{bean.pin}" validator="pinValidator" />
<h:message for="pin" />

验证器异常的 faces 消息将在与触发验证器的组件关联的 &lt;h:message&gt; 中结束。

如果您使用 ajax 提交表单,请不要忘记确保在 ajax 渲染时也考虑到该消息。


与具体问题无关,JSF &lt;h:outputLabel&gt; 生成一个 HTML &lt;label&gt; 元素,其意图是 label a form element(例如 &lt;input&gt;&lt;select&gt; 等)。它绝对不打算显示任意文本,例如验证消息。我建议暂时将 JSF 放在一边,然后开始 learning basic HTML。这样,您将更好地了解选择哪些 JSF 组件来获得所需的 HTML 输出。

【讨论】:

  • 但是有一个问题。我的 isCorrectPIN() 方法还从数据库中获取用户名并将其写入 bean。我不能从验证器中写任何东西。我的代码有另一个问题,我在其他主题中发布了代码。这是您可以看到代码时的链接:stackoverflow.com/questions/16490740/…
  • 我在 WaiterBean 中扩展了 Connector 类,所以我不能以静态方式使用该方法。我也不想创建到 sql 查询 - 一个用于名称更新,一个用于 PIN 验证
  • 我使用了 onclick 方法来重置标签,但我不确定是否应该这样做
  • 只在bean的action方法中做业务。如果验证失败,则无论如何都不会调用它。如果你继续这种方式并使用 Ozan 的方法,那么你只是在执行一个糟糕的做法。
【解决方案2】:

您可以在验证器之外使用 JSF 消息组件: 对于您在表单中输入的消息:

 <h:message for="PIN"/> 

在您的托管 bean 中,您可以使用以下方法添加 FacesMessage:

FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_WARN,"No pin summary message","No pin detail message");
FacesContext.getCurrentInstance().addMessage("PIN", message);

这里不需要使用 outputLabel。

【讨论】:

  • 我按照你说的做了,它有效,但它没有出现在消息中。它以橙色显示在下方。也许原因是我对验证器输出使用了相同的消息?
  • 您可以为您的提交按钮添加一条新消息。此外,橙色可能来自 FacesMessage.SEVERITY_WARN,您可以更改严重性。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-01-05
  • 2016-07-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多