【问题标题】:Modify JSF h:link href result修改 JSF h:link href 结果
【发布时间】:2011-07-08 21:40:44
【问题描述】:

我很好奇是否可以更改所有生成链接的hrefattributes。

假设我有一个如下所示的网页:

<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>

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

【问题讨论】:

  • 你使用的是什么版本的 JSF?
  • 哎呀!我总是忘记看标签

标签: java jsf components jsf-2 facelets


【解决方案1】:

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

我提出了一个解决方案,该解决方案适用于当 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 中使用表达式,但使用复合组件,所有转换逻辑都只在一个地方。

【讨论】:

    【解决方案2】:

    只是一个简短的说明,让您知道我通过用我自己的 ViewHandler 实现替换标准 ViewHandler 解决了这个问题,该实现覆盖了 getBookmarkableURL 方法并在父 @987654324 生成的 URL 上执行替换@。

    【讨论】:

      猜你喜欢
      • 2011-07-31
      • 1970-01-01
      • 2021-10-24
      • 2012-05-30
      • 2016-06-03
      • 1970-01-01
      • 2010-12-18
      • 1970-01-01
      相关资源
      最近更新 更多