4

有人知道吗?是否可以指定表单输入字段的名称?该怎么做呢?

4

4 回答 4

5

如前所述,HTML 名称和 id 属性由命名容器生成并基于应用程序名称空间。当控件是重复控件的子项(例如 a UIData)或 JSP 在一个页面中呈现两次(例如在 portlet 环境中)时,这可以防止冲突。呈现给 HTML 的 id 是clientId

可以手动硬编码或构建clientId,但这是一种非常脆弱的方法。最好使用组件的getClientId(FacesContext)方法;这是渲染器使用的。

一个可以获取clientId绑定组件的 bean:

/** Request scope */
public class IdBean implements Serializable {
  private UIComponent mytext;

  public String getClientId() {
    return mytext.getClientId(FacesContext.getCurrentInstance());
  }

  public UIComponent getMytext() { return mytext; }
  public void setMytext(UIComponent mytext) { this.mytext = mytext; }

  public List<String> getRows() {
    List<String> rows = new ArrayList<String>();
    for (int i = 0; i < 10; i++) {
      rows.add("row" + i);
    }
    return rows;
  }
}

风景:

  <f:view>
    <h:form>
      <h:dataTable value="#{idBean.rows}" var="row">
        <h:column>
          <h:outputLabel value="#{row}" />
          <h:inputText binding="#{idBean.mytext}"
            onclick="foo('#{idBean.clientId}');" />
        </h:column>
      </h:dataTable>
    </h:form>
  </f:view>

  <script type="text/javascript">
    function foo(name) {
        alert('You clicked '+name);
    }
  </script>

mytext控件呈现 10 次,因此任何发出其名称的代码也必须是 dataTable 的子级。

于 2008-11-05T15:50:37.463 回答
5

更一般地说,所有 JSF 组件都有一个 ID。如果您不提供,JSF 将创建一个自动 ID,使用格式 j _idXXX(XXX是一个递增的数字)。

一些组件实现了 javax.faces.component.NamingContainer 接口,特别是<h:form>. 这意味着该组件的所有子组件的 ID 都会以该容器的 ID 为前缀,并以“:”分隔。因此,在示例中:

<h:form id="myForm">
    <h:inputText id="myInput" .../>
</h:form>

输入的真实ID(即 HTML 输入对象的 ID)将是myForm:myInput

于 2008-11-05T14:09:49.757 回答
3

它生成为 formId:fieldId

因此,如果您有以下情况:

<h:form id="searchForm">
   <h:inputText id="searchField" ... />
</h:form>

搜索字段的名称(和 HTML ID)将是:

搜索表单:搜索字段

于 2008-11-05T14:01:31.007 回答
0

对于包含视图、表单和某些组件的大多数页面,clientID 将是包含 form-id 和 component-id 的冒号分隔的字符串。例子:

输入文本客户端 ID 将是“myForm:myInputText”。如果您嵌套在子视图中,那么这将是列表中的第一件事,例如:

现在输入文本客户端 ID 将是“mySubview:myForm:myInputText”。

于 2008-11-05T20:52:44.063 回答