为什么 h:message 输出中存在表单 id 前缀?

问题描述 投票:0回答:5

我目前正在尝试使用 required="true" 进行简单验证

    <h:form>
        <h:messages globalOnly="true"/>
        <h:panelGrid>
            <h:panelGrid columns="3">
                <f:facet name="header">
                    Login Application Sample
                </f:facet>

                <h:outputLabel for="UserId" value="User Id" />
                <h:inputText id="UserId" value="#{userBean.userId}" required="true" />
                <h:message for="UserId"/>

                <h:outputLabel for="Password" value="Password" />
                <h:inputSecret id="Password" value="#{userBean.password}" required="true" />
                <h:message for="Password" />

                <f:facet name="footer">
                    <h:commandButton value="Login" action="#{userBean.login}"/>
                    <h:commandButton type="reset" value="Reset"/>
                </f:facet>
            </h:panelGrid>
        </h:panelGrid>
    </h:form>

将字段留空,然后单击登录按钮,这些错误消息将显示在每个字段的右侧:

j_idt7:UserId:验证错误:值是必需的。
j_idt7:密码:验证错误:值是必需的。

这是我所期望的,但我不想显示'j_idt7:'的表单id前缀。我读过书籍示例,它们不输出表单 id 前缀。我想要的是:

UserId:验证错误:值是必需的。
密码:验证错误:值是必需的。

我应该怎么做才能跳过在组件特定消息中显示表单 ID 前缀?

我目前正在 glassfish v3 中测试 JSF 2。

forms validation jsf message prefix
5个回答
13
投票

消息标签默认为组件的客户端 ID,与您通过右键单击“查看源代码”在生成的 HTML 输出中看到的完全相同。在这种特殊情况下, j_id7 是父

<form>
元素的客户端 ID。如果您为 JSF 组件提供固定 ID(如
<h:form id="login">
),那么标签将分别变为
login:UserId
login:Password
但是,您可以使用输入组件的 

label

属性来完全覆盖它,以便消息标签将完全按照您的意图显示。

<h:inputText ... label="User ID" />
<h:inputSecret ... label="Password" />

如果输入组件的 
label

属性存在,则将使用该属性代替客户端 ID。按照其他答案的建议使用

prependId="false"
缺点
。不要这样做。 一个完全不同的替代方案是使用

requiredMessage

(或

converterMessage
validatorMessage
)属性来实现此目的,但这不允许参数化消息,因此您必须对标签等进行硬编码。
<h:inputText ... requiredMessage="User ID is required." />
<h:inputSecret ... requiredMessage="Password is required." />

另请参阅:

    将默认消息“验证错误:需要值”更改为“需要值”
  • 获取错误验证消息上的组件id
  • 如何在复合组件中参数化requiredMessage属性?
需要注意的是,像这样重复标签确实很尴尬:

<h:outputLabel for="userId" value="User ID" ... /> <h:inputText id="userId" ... label="User ID" /> <h:outputLabel for="password" value="Password" ... /> <h:inputSecret id="password" ... label="Password" />

如果您碰巧使用 JSF 实用程序库 
OmniFaces

,那么您可以使用 <o:outputLabel>

 让 JSF 透明地设置关联组件的 
label 属性:
<o:outputLabel for="userId" value="User ID" ... />
<h:inputText id="userId" ... />

<o:outputLabel for="password" value="Password" ... />
<h:inputSecret id="password" ... />



5
投票

faces-config.xml

<application> <message-bundle>ApplicationMessages</message-bundle> </application>

ApplicationMessages.properties

#javax.faces.validator.BeanValidator.MESSAGE={1}: {0} javax.faces.validator.BeanValidator.MESSAGE={0}

详情


2
投票

您的类路径中可以有一个 messages.properties 文件

消息.属性

javax.faces.component.UIInput.REQUIRED=Field must be entered.

Faces-config.xml 

<application> <message-bundle>Messages</message-bundle> <locale-config> <default-locale>en</default-locale> </locale-config> </application>

看看这篇文章


1
投票
id

字段的

input
<form-id>+":"+<input-field-id>
,在您的情况下是
j_idt7:UserId:
。尝试给你的
<h:form>
一些有意义的
id
,以便从中理解。您可以在此处阅读有关
JSF ID 的信息
。如果您不喜欢它,可以通过将 form 标签修改为类似以下内容来关闭它,

<h:form prependId = false> // its true by default.

但这可能会产生问题,正如 
BalusC

所指出的那样。 此外,您似乎从未自己配置过任何验证消息。这又以这条消息结束。因此,需要一个

message.properties

文件来控制消息并显示更合适的内容。即使这样,字段名称也不应该成为消息的一部分,以使这些验证消息通用以避免重复。有关在

label
中使用 <h:inputText> 属性的信息,请参阅
BalusC 的回答
    


1
投票
required = true

的地方,您可以为任何输入类型定义

requiredMessage = "My Message"

例如

<h:inputText autocomplete="false" id = "CellNumber" label="Cell Number" required="true" requiredMessage="Cell Number Required" maxlength="10" value="#{userManagedBean.cellNumber}" >

	
© www.soinside.com 2019 - 2024. All rights reserved.