Как JSF генерирует имя поля ввода формы? - PullRequest
4 голосов
/ 05 ноября 2008

Есть идеи у кого-нибудь? Возможно ли указать имя поля ввода формы? Как это сделать?

Ответы [ 4 ]

5 голосов
/ 05 ноября 2008

В целом, все компоненты JSF имеют идентификатор. Если вы его не предоставите, JSF создаст автоматический идентификатор в формате j _ idXXX ( XXX - увеличенное число).

Некоторые компоненты реализуют интерфейс javax.faces.component.NamingContainer, в частности <h:form>. Это означает, что все дочерние элементы этого компонента будут иметь префикс ID с идентификатором этого контейнера, разделенный знаком «:». Итак, в примере:

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

действительный идентификатор ввода (т. Е. Идентификатор объекта ввода HTML) будет myForm: myInput .

5 голосов
/ 05 ноября 2008

Как уже было сказано, HTML-атрибуты name и id генерируются контейнерами именования и основаны на пространстве имен приложения. Это предотвращает конфликты, когда элементы управления являются потомками повторяющихся элементов управления (например, UIData) или если JSP отображается дважды на одной странице (как в среде портлета). Идентификатор, отображаемый в HTML: clientId .

Возможно жесткое кодирование или сборку clientId вручную, но это очень хрупкий подход. Лучше использовать метод getClientId (FacesContext) компонента; это то, что используют рендереры.

Бин, который может получить clientId для связанного компонента:

/** 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.

3 голосов
/ 05 ноября 2008

Генерируется как formId: fieldId

Итак, если у вас было следующее:

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

Имя (и HTML ID) поля поиска будет:

searchForm: searchField

0 голосов
/ 05 ноября 2008

Для большинства страниц, которые содержат представление, форму и некоторые компоненты, clientID будет разделенной двоеточием строкой, содержащей form-id и component-id. Пример:

Идентификатор входящего текстового клиента будет «myForm: myInputText». Если вы вложили в подпредставление, то это будет первая вещь в списке, например:

Теперь идентификатор клиента ввода текста будет «mySubview: myForm: myInputText».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...