JSF如何生成表单输入字段的名称?

4 java jsf

任何想法的人?我们是否可以指定表单输入字段的名称?怎么去那样做?

Rom*_*las 5

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

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

<h:form id="myForm">
    <h:inputText id="myInput" .../>
</h:form>
Run Code Online (Sandbox Code Playgroud)

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


McD*_*ell 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;
  }
}
Run Code Online (Sandbox Code Playgroud)

风景:

  <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>
Run Code Online (Sandbox Code Playgroud)

mytext的控件呈现10倍,所以发射它的名称的任何代码也必须是DataTable的一个孩子.