Я думаю, что нет прямого решения без использования какой-либо модификации рендерера.
Я предлагаю решение, которое работает, когда 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: но с составным компонентом вся логика преобразования находится только в одном месте.