Как уже было сказано, 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.