Можно ли изменить разделитель идентификатора элемента в JSF?

Например, следующий фрагмент:

<h:form id="levelone">
    <h:inputText id="leveltwo" value="Test" />
</h:form>

генерирует следующую разметку:

<form id="levelone" name="levelone" method="post" action="/test/testPage.html" 
      enctype="application/x-www-form-urlencoded">
   <input id="levelone:leveltwo" type="text" name="levelone:leveltwo" 
          value="Test" />
</form>

Можно ли изменить автоматически созданные идентификаторы для использования другого разделителя, чем двоеточие?

Например, я хотел бы изменить

levelone:leveltwo

to

levelone-leveltwo

Фон

Мы используем Mojo фреймворк JavaScript-приложения в нашем webapp, и ему, похоже, не нравятся двоеточия в id.

Ответ 1

Это невозможно в JSF 1.x, но с JSF 2.x вы можете определить его в web.xml как init-param из javax.faces.SEPARATOR_CHAR.

Тем не менее, я думаю, вы просто хотели изменить его, потому что хотите, чтобы ваш CSS работал, не так ли? Двоеточие : является особым символом в CSS-идентификаторах, он представляет псевдоселектор. Если эта причина верна для вас, тогда было бы хорошо знать, что вы можете избежать специальных символов в CSS обычным способом с помощью \.

Таким образом, например,

#levelone\:leveltwo {
    color: blue;
}

должен работать для обычных браузеров (для IE6/7 вам нужно #levelone\3A leveltwo).

То же самое происходит, когда вы намереваетесь использовать его с jQuery или любой другой инфраструктурой JavaScript, которая выбирает элементы с помощью Селектора CSS:

var leveltwo = $('#levelone\\:leveltwo');


В качестве альтернативы вы также можете просто указать styleClass, который, в свою очередь, может коррелировать с классом CSS. Таким образом, например,

<h:inputText styleClass="myinput" />

который генерирует

<input type="text" class="myinput" />

можно создать с помощью

.myinput {
    color: blue;
}

См. также

Ответ 2

В более старых версиях нет, это невозможно. Это жестко закодированная константа. В 2.0 вы можете изменить его. См. этот пост в блоге.

Ответ 3

Tomahawk имеет расширенные компоненты, такие как <t:inputText>, которые имеют атрибут forceId. Там вам нужно установить его как <t:inputText forceId="levelone-leveltwo" /> - то есть вы не сможете использовать имя сгенерированного автоматического контейнера.

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