当前位置: 首页 > 知识库问答 >
问题:

发生验证错误时,JSF/PrimeFaces不显示用户输入的值

齐财
2023-03-14

使用在WebSphere 8.5.5中运行的PrimeFaces 5.3

我有一个带有两个必填字段的表单,一个inputText和一个selectOneMenu。我在菜单中选择一个有效值(例如无状态),但将文本字段留空,导致错误。然后我更正文本字段,但用户也按下菜单上的“S”键——打算再次选择“无状态”,但结果是“选择国家”,这意味着没有选择任何内容——另一个验证错误。

当用户按下ENTER时,他们会收到另一条selectOneMenu的错误消息,该字段本身被突出显示为错误,但出现了“无状态”的有效值-这让我感到困惑,想象一下用户会如何反应!

是否有办法始终保留用户输入的值?

我附上了证明问题的净化代码。我有列出所有国家/地区(以及美国州、墨西哥州、加拿大省)的菜单,因此不可能为不适用于有效值的默认值分配一个字母。

XHTML

<!DOCTYPE html>
<html   xmlns="http://www.w3.org/1999/xhtml"
        xmlns:h="http://java.sun.com/jsf/html"
        xmlns:ui="http://java.sun.com/jsf/facelets"
        xmlns:f="http://java.sun.com/jsf/core"
        xmlns:p="http://primefaces.org/ui">
    <h:head>
        <!-- IE standards mode override *must* appear first - use resource ordering facet to force this. -->
        <f:facet name="first">
            <meta http-equiv="x-ua-compatible" content="IE=edge" />
            <!-- 
                <meta http-equiv="x-ua-compatible" content="IE=edge" /> 
                ^ Prevents IE from reverting to 'IE7 Standards Mode' when accessing via non-localhost hostname.
                Must appear immediately after <title> element. Note that setting this at the server level (ie: in websphere)
                is considered preferable. See: http://stackoverflow.com/questions/6156639/x-ua-compatible-is-set-to-ie-edge-but-it-still-doesnt-stop-compatibility-mode
            -->
        </f:facet>
    </h:head>
    <h:body>
        <br/>
        <h:form id="dataForm">
            <p:outputLabel for="note" value="Note"/>:
            <p:inputText id="note" size="30" maxlength="50" value="#{Test.note}" required="true" />
            <br />
            <p:outputLabel for="citizenship" value="Citizenship:"/>
            <p:selectOneMenu id="citizenship" value="#{Test.citizenship}" required="true">
                <f:selectItem itemLabel="Select Country..."/>
                <f:selectItem itemValue="1" itemLabel="Canada"/>
                <f:selectItem itemValue="2" itemLabel="United States"/>
                <f:selectItem itemValue="3" itemLabel="Mexico"/>
                <f:selectItem itemValue="-1" itemLabel="Stateless"/>
            </p:selectOneMenu>
            <br />
            <p:commandButton value="Save" type="submit" action="#{Test.save}" ajax="false" />
        </h:form>
    </h:body>
</html>

Java

import javax.inject.Named;

@Named ("Test")
public class Test 
{
    private String note;
    private Integer citizenship;

    public Integer getCitizenship() 
    {
        return citizenship;
    }

    public String getNote() 
    {
        return note;
    }

    public void setNote(String note) 
    {
        this.note = note;
    }

    public void setCitizenship(Integer citizenship) 
    {
        this.citizenship = citizenship;
    }

    public String save()
    {
        System.out.println("Citizenship=" + this.citizenship);

        return "test";
    }
}

编辑

在修改后应用,但根本没有效果。当我按下“S”时,它仍然会选择“选择国家…”选项,如果我点击控件,我仍然可以看到并选择“选择国家…”选项

<p:selectOneMenu id="citizenship" value="#{Test.citizenship}" required="true" hideNoSelectionOption="true">
                <f:selectItem itemValue="#{null}" itemLabel="Select Country..." noSelectionOption="true"/>

在我的浏览器调试器中详细研究这一点时,我注意到了其他一些东西。当我选择不同的选项时,HTML选项元素的选定值不会改变,而标签会改变。实际的HTML select元素位于DIV中,类为“ui helper hidden accessible”。我想知道这是否意味着什么。。。

共有2个答案

燕航
2023-03-14

好的,我找到了一种解决方法——本质上我从PrimeFaces版本切换到普通JSF。即:

<p:selectOneMenu id="citizenship" value="#{Test.citizenship}" required="true" hideNoSelectionOption="true">

<h:selectOneMenu id="citizenship" value="#{Test.citizenship}" required="true" hideNoSelectionOption="true">

我们被允许在WebSphere上使用的PrimeFaces版本似乎有问题——这恰好是我第三次通过切换到纯JSF来“修复”问题。

宦文柏
2023-03-14

因此,它指定“当验证失败时,输入组件将其本地值保持在状态。”这让我相信你这里的问题是选择国家选项缺少itemLabel标签。我通常为它分配itemLabel = ""nullf: selectItem还有一个noSelectionOption选项可能会有所帮助。

这个答案在不久前帮助我解决了一个类似的问题:在JSF中向selectOneMenu添加“nothing selected”选项的最佳方法

 类似资料:
  • 因此,很明显,它识别出输入的名称太短,但我在视图中没有得到任何错误消息,正如这里所预期的:。

  • 我需要创建一个验证指令来自动显示每个输入的所有输入错误。此验证指令应该显示当前时刻的所有错误,错误列表应该在用户键入时自动更新。 链接到JSFiddle,带有一些用于测试的代码。 附言。UI-UTIL也有类似的功能,但它们的指令不能在一个地方设置类似的错误消息。

  • 问题内容: 我正在使用JSF设置表单(这是我的新手),并且在其中一个字段上收到消息。该字段实际上是一个具有自定义转换器的单独对象(如下文所示)。 这是我所拥有的(删除了不相关的代码): 我有一堂课: 我也有一个您在该类中引用的类: 那么对于我的表格,我有: 最后,对于我的转换器,我有: 现在,当我进入表单并提交时,我将获得状态旁边的内容。我在这方面还很新,感谢@BalusC,我一直很远。 任何帮助

  • 我的页面中有h: selectOneMenu组件。用户必须在那里选择“是”或“否”,初始值为null(标记为“未知”)。在bean中它是布尔值,因此可以为null。如果用户选择了有效值,例如“是”,则点击Next,保存在bean中。 现在用户可以返回此页面,并选择“未知”,这不是一个有效的值。当用户现在点击下一步时,会显示错误消息。可以,但值会更改为“是”。它从bean更新。这样它会更改用户输入的

  • 我正在寻找一些库或代码示例,将 FastAPI 验证消息格式化为人类可读的格式。例如,此endpoint: 如果我们缺少<code>name</code>查询参数,将生成下一个json输出: 所以我的问题是,如何: 将其转换为“名称字段是必需的”(对于各种可能的错误)以在 Toast 中显示。 使用它来显示表单验证消息 如果可能,从 api 描述自己生成表单

  • 使用JOptionPane。ShowInputDialog,我需要检查用户是否输入int,否则,JOptionPane应该返回错误消息,并提示用户输入正确的数据类型。 同时,如果用户点击取消节目则应返回主菜单。 对我如何做到这一点有什么建议吗?