Forms 为什么在h:消息输出中使用表单id前缀?

Forms 为什么在h:消息输出中使用表单id前缀?,forms,validation,jsf,messages,prefix,Forms,Validation,Jsf,Messages,Prefix,我目前正在尝试使用required=“true”进行简单验证 登录应用程序示例 将字段留空,然后单击登录按钮,这些错误消息将显示在每个字段的右侧: j_idt7:用户ID:验证错误:需要值。 j_idt7:密码:验证错误:需要值 这是我所期望的,但我不想显示'j_idt7:'的表单id前缀。我阅读了一些书籍示例,它们不输出表单id前缀。我想要的是: 用户标识:验证错误:需要值。 密码:验证错误:需要值 我应该做什么来跳过在组件特定消息中显示表单id前缀 我目前正在GlassfishV3中测试

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


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

j_idt7:用户ID:验证错误:需要值。
j_idt7:密码:验证错误:需要值

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

用户标识:验证错误:需要值。
密码:验证错误:需要值

我应该做什么来跳过在组件特定消息中显示表单id前缀


我目前正在GlassfishV3中测试JSF2。

您需要覆盖来自JSF的这些消息

在类路径中可以有messages.properties文件

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>    

如果您想从浏览器中查看HTML源代码,您会发现
输入
字段的
id
+”:“+
,在您的情况下,
j_idt7:UserId:
。试着给你的
一些有意义的
id
,让它有意义。你可以读到。如果您不喜欢它,您可以通过将
表单
标记修改为以下内容来关闭它

<h:form prependId = false> // its true by default.
//默认情况下为true。
但正如本文所指出的,这可能会成为一个问题


此外,您似乎从未亲自配置过任何验证消息。这反过来又以这条信息结束。因此,需要一个
message.properties
文件来控制消息并显示更合适的内容。即使这样,字段名也不应该是消息的一部分,以使这些验证消息通用,避免重复。有关

标签
属性的使用,请参阅消息标签默认为组件的客户端ID,这正是您可以通过右键单击查看源代码在生成的HTML输出中看到的ID。在这种特殊情况下,
j_id7
是父
元素的客户机ID。如果给JSF组件一个固定的ID,比如
,那么标签将分别变成
login:UserId
login:Password

但是,您可以使用输入组件的
标签
属性来完全覆盖它,以便消息标签将完全按照您的意图显示

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

需要注意的是,这样复制标签确实很尴尬:

<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" />

如果使用MyFaces和bean验证框架(JSR303),请尝试使用javax.faces.validator.BeanValidator.MESSAGE键定义MessageBundle

faces-config.xml

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

在编写
required=true
的地方,可以为任何输入类型定义
requiredMessage=“My Message”

e、 g



谢谢大家的建议,使用prependId可以解决我的问题。但是我注意到,重写该必需项的消息属性:“javax.faces.component.UIInput.required={0}:验证错误:Value是必需的。”不会解决问题,因为在我的例子中,{0}的值是j_idt7:UserId。所以我要么按照建议的形式给出一个有意义的id,要么使用prependId解决方案。非常感谢。抱歉,将我的方法更改为使用label属性的新建议。这样,我的错误消息将在错误消息中显示人性化的名称,而不是字段ID。有点晚了:您现在可以使用
requiredMessage
实现此目的。这违反了OP在消息中显示输入字段ID/标签的要求。
<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" />
<o:outputLabel for="userId" value="User ID" ... />
<h:inputText id="userId" ... />

<o:outputLabel for="password" value="Password" ... />
<h:inputSecret id="password" ... />
<application>
    <message-bundle>ApplicationMessages</message-bundle>
</application>
#javax.faces.validator.BeanValidator.MESSAGE={1}: {0}
javax.faces.validator.BeanValidator.MESSAGE={0}
<h:inputText autocomplete="false" id = "CellNumber" label="Cell Number" required="true" requiredMessage="Cell Number Required" maxlength="10" value="#{userManagedBean.cellNumber}" >