Изменить JSF h: ссылка href результат - PullRequest
0 голосов
/ 04 марта 2011

Мне любопытно, что можно изменить href атрибуты всех сгенерированных ссылок.

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

<div>
  <h:link outcome="/foo.xhtml" value="a link" />
  ...
  <h:link outcome="/bar.xhtml" value="another link" />
</div>

Полученный результат будет выглядеть примерно так:

<div>
  <a href="/foo.jsf">a link</a>
  ...
  <a href="/bar.jsf">another link</a>
</div>

Сейчас я пытаюсь изменить URL-адрес, сгенерированный как атрибут href, в сгенерированном контенте, и, скажем, добавить каталог ко всем сгенерированным ссылкам (в зависимости отих содержимое), так что я получаю вывод

<div>
  <a href="/a-new-location/foo.jsf">a link</a>
  ...
  <a href="/another-new-location/bar.jsf">another link</a>
</div>

Существует ли быстрый и простой способ добиться этого или я должен полностью реализовать компонент и средство визуализации и скопировать логику, используемуюстандартная реализация?

Ответы [ 2 ]

0 голосов
/ 08 марта 2011

просто краткое замечание, чтобы сообщить вам, что я решил проблему, заменив стандарт ViewHandler своей собственной реализацией ViewHandler, которая переопределяет метод getBookmarkableURL и выполняет замену URL-адреса, созданного родительским * 1004.*.

0 голосов
/ 07 марта 2011

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

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

Во-первых, bean-компонент для преобразования результата:

@ManagedBean
@ApplicationScoped
public class OutcomeTransformer {

    public String getNewOutcome(String outcome){
        if(outcome.equals("/page.xhtml")){
            return "/directory/"+outcome;
        }else if(outcome.equals("/anotherPage.xhtml")){
            return "/anotherDirectory/"+outcome;
        }else{
            return outcome;
        }
    }

}

Секунда, используйте составной компонент для переноса ссылки.Результат ссылки h: преобразуется компонентом.

<cc:interface>
    <cc:attribute name="outcome"/>
    <cc:attribute name="value"/>
</cc:interface>

<cc:implementation>
    <h:link outcome="#{outcomeTransformer.getNewOutcome(cc.attrs.outcome)}" value="#{cc.attrs.value}"/>
</cc:implementation>

И, наконец, здесь используется страница.

<ez:myLink outcome="page.xhtml" value="A page"/>
<br/>
<ez:myLink outcome="anotherPage.xhtml" value="Another page"/>

Конечно, вы можете использовать выражение непосредственно вссылка h: но с составным компонентом вся логика преобразования находится только в одном месте.

...