2008-11-05 3 views

ответ

3

Он генерируется FormID: fieldId

Так что, если вы имели следующий:

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

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

searchForm: searchField

+0

Хотя если бы это было приложение портлета или какой-либо другой контейнер с именами, это могло бы быть чем-то вроде «id12432133: searchForm: searchField» – McDowell 2008-11-05 15:53:21

5

В целом, все компоненты 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

Как указано, атрибуты имени и идентификатора HTML генерируются контейнерами именования на основе пространства имен приложений. Это предотвращает столкновения, когда элементы управления являются дочерними элементами повторяющихся элементов управления (например, 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.

+0

Дополнительная информация о clientId: http://illegalargumentexception.blogspot.com/2009/02/jsf- работоспособного с-компонентной-ids.html – McDowell 2009-04-15 19:28:13

0

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

Входной текст идентификатор клиента будет "MyForm: myInputText".Если у вас есть вложенные в подвид, то это будет первое, что в списке, например:

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

Смежные вопросы