修改JSF h:link href result

时间:2011-03-04 15:08:07

标签: java jsf components jsf-2 facelets

我很想知道改变所有生成链接的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>

有没有快速简便的方法来实现这一点,还是我必须完全自己实现组件和渲染器并复制标准实现使用的逻辑?

2 个答案:

答案 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生成。