我很想知道改变所有生成链接的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>
我现在正在尝试更改生成的内容中生成的href
属性的URL,假设为所有生成的链接添加目录(取决于其内容),以便我获得输出
<div>
<a href="/a-new-location/foo.jsf">a link</a>
...
<a href="/another-new-location/bar.jsf">another link</a>
</div>
有没有快速简便的方法来实现这一点,还是我必须完全自己实现组件和渲染器并复制标准实现使用的逻辑?
答案 0 :(得分:0)
我认为没有使用某些渲染器修改就没有直接的解决方案。
我提出了一个解决方案,当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:link的结果由bean转换。
<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:link中使用表达式,但是对于复合组件,转换的所有逻辑都只在一个位置。
答案 1 :(得分:0)
只是一个简短的提示,通过将标准ViewHandler
替换为覆盖ViewHandler
方法的我自己的getBookmarkableURL
实现并在URL上执行替换,让您知道我解决了问题由父ViewHandler
生成。