JSF 2 - уникальные идентификаторы на нескольких страницах - PullRequest
1 голос
/ 28 сентября 2011

Я ищу, чтобы создать приложение JSF, в котором есть несколько страниц HTML, отображаемых в разных регионах браузера.Я мог бы сделать это с помощью iframes, но они добавляют дополнительную память, и доступ к объектам через iframes не так уж тривиален.

Я рассматриваю подход, при котором я загружаю различные страницы xhtml на главной странице, используя ajax.Проблема в том, что на главной странице будет много элементов, которые будут иметь одинаковые идентификаторы, поскольку идентификаторы уникальны только в пределах своих соответствующих корней представления.

Я знаю, что одним из решений было бы реализовать некоторую пользовательскую логику на стороне клиента, которая обрабатывает эти дублирующиеся идентификаторы, но было бы лучше вообще не иметь дублирующихся идентификаторов.

Что я могу сделать, чтобырешить проблему?

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

Ответы [ 2 ]

3 голосов
/ 01 октября 2011

Вы можете заменить корень представления на тот, который реализует NamingContainer:

<?xml version='1.0' encoding='UTF-8'?>
<faces-config version="2.0"
    xmlns="http://java.sun.com/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <component>
    <component-type>javax.faces.ViewRoot</component-type>
    <component-class>components.ReplacementRoot</component-class>
  </component>
</faces-config>

В этом примере реализации создается clientId на основе viewId:

public class ReplacementRoot extends UIViewRoot implements NamingContainer {
  @Override
  public String getClientId(FacesContext context) {
    return "jsf" + getViewId().replaceAll("[^\\p{Alnum}]", "_");
  }
}

Это сгенерирует идентификаторы клиента в форме jsf_index_xhtml:foo.

1 голос
/ 28 сентября 2011

Ознакомьтесь с технологией Portlet , поскольку, вероятно, это то, что вам нужно.Проблема в том, что я еще не видел действительно хороших реализаций портлетов, а также в том, что вам нужен мост портлета JSF для обработки жизненного цикла JSF - состояние этого также не известно.

Другой вариантбыло бы создать свой собственный поставщик Facelets, который динамически добавляет любые компоненты, которые вам нужны, поэтому, когда вы перестраиваете дерево компонентов, они внезапно появляются.Я также не мог рассказать вам больше об этом, но я видел, что это было сделано и работает для некоторого подобного вики программного обеспечения, которое редактировало страницы как facelets xhtml.

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