2011-03-04 57 views
0

我很想知道是否可以更改所有生成的链接的href属性。修改JSF h:链接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> 

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

+0

什么版本的JSF使用? – DaTroop 2011-03-04 15:27:40

+0

@DaU:读取标签。 – BalusC 2011-03-04 15:47:30

+0

哎呀!我总是忘记看标签 – DaTroop 2011-03-07 09:53:34

回答

0

只是一个快速的说明,让你知道,我用我自己的ViewHandler实现,覆盖getBookmarkableURL方法,并执行经父ViewHandler生成的URL更换更换标准ViewHandler解决了这个问题。

0

我认为没有使用渲染器修改的直接解决方案。

我提出了一个解决方案,它在href是一个有效的JSF页面时起作用,并且您希望在导航处理程序评估之前对结果进行转换。

首先,成果转化的豆:

@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; 
     } 
    } 

} 

Seccond,使用复合组件,用于包装的链接。 h:链接的结果由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中使用表达式,但对于复合组件,转换的所有逻辑仅在一个地方。