关于jsf:如何在h:inputText中指定名称属性?

How to specify name attribute in h:inputText?

我需要将h:inputText呈现为以下html输出:

1
2
  <input id="yourName" type="text" name="name" />
  <input id="email" type="text" name="email" />

但是h:inputText呈现的name属性与组件的客户端ID相同。 我想自己指定name属性,而不是在其中放置客户端ID,以便输入字段可以显示先前提交的其他站点上相同字段类型值的有意义的自动完成建议。 例如 当我在电子邮件的输入字段中使用name="email"时,系统会向用户显示他之前在其他网站上提交的电子邮件ID的建议。


您无法使用来实现。它的名称由JSF根据客户端ID(后者又基于组件ID及其所有命名容器父对象)自动生成。

无论如何,您基本上有两种选择来实现具体的功能要求:

  • 如果没有其他命名容器父项,请指示父表单不要在其ID之前添加ID:

    1
    <h:form prependId="false">

    但是,这将导致失败。

  • 使用纯HTML元素而不是JSF组件:

    1
    2
    <input name="name" value="#{bean.name}" />
    <input name="email" value="#{bean.email}" />

    您只需要通过@ManagedProperty在请求范围内的bean上自己收集它们:

    1
    2
    3
    4
    5
    @ManagedProperty("#{param.name}")
    private String name;

    @ManagedProperty("#{param.email}")
    private String email;

    而且您会错过JSF内置的验证/转换工具和Ajax Magic。

  • 但是,还有另一种完全不同的选择:使用HTML5 。这样,浏览器将以相同类型的输入自动建议所有先前输入的电子邮件。 本机不支持此功能。但是,您可以使用自定义渲染工具包使其工作,如在Primefaces(3.4)中添加自定义属性(HTML5)支持中所述:

    1
    <h:inputText type="email" ... />

    从JSF 2.2开始更新,您最终可以轻松声明传递属性,而无需自定义渲染工具包。

    1
    2
    3
    <... xmlns:a="http://xmlns.jcp.org/jsf/passthrough">
    ...
    <h:inputText a:type="email" ... />


    您无需指定name属性就可以执行所需的操作。 id属性就足够了。根据示例尝试以下操作:

    1
    2
    3
    4
    5
    6
    < h:inputText id="email" ... />

    ...
    $("#email input").click(function (event) {
    ...
    }

    代替

    1
    $("#email input[name='email']").click(function (event)

    希望这是您正在寻找的:)