如何更改h:commandLink的标准href =“#”属性?

时间:2012-09-26 13:30:57

标签: jsf-2 mojarra

我正在维护一个JSF2 Ajax应用程序,我们大量使用h:commandLinksf:ajax标记用于所有操作 - 始终只重新渲染所需的内容。

这当然会在右键单击链接并选择“在新标签页中打开链接”等时打破用户的预期行为。

我理解f:ajax强制生成的a元素的href属性为#,并在onclick函数中执行所有魔术发布请求技巧 - 我现在想要提供后备支持通过在生成的<a>标记的href属性中添加一些有意义的链接来实现“Open Link ...”操作。

这不会破坏“正常”的onclick行为,因为生成的javascript总是以return false;结束,但允许我使用普通的GET请求将我的用户发送到某个页面,以防他们想要打开链接一个新的窗口。

是否有建立方式来做到这一点?或者有人可以指出我在JSF生命周期的哪个方向上正确的方向,我可能会使用阶段监听器来实现这一目标吗?

1 个答案:

答案 0 :(得分:2)

最简单的方法是扩展com.sun.faces.renderkit.html_basic.CommandLinkRenderer并相应地覆盖renderAsActive()方法。 Mojarra是开源的,只需复制方法并编辑writer.write("href", "#", "href")所在的行。根据您的见解替换"#"字符串。

public class MyCommandLinkRenderer extends CommandLinkRenderer {

    @Override
    protected void renderAsActive(FacesContext context, UIComponent command) throws IOException {
        // ...
    }

}

要使其运行,请在faces-config.xml

中按如下方式注册
<render-kit>
    <renderer>
        <component-family>javax.faces.Command</component-family>
        <renderer-type>javax.faces.Link</renderer-type>
        <renderer-class>com.example.MyCommandLinkRenderer</renderer-class>
    </renderer>
</render-kit>

请注意,这会将您的渲染器紧密耦合到Mojarra。要独立于JSF实现,您需要创建一个全新的渲染器,而不是扩展Mojarra特定的渲染器类。


对具体问题

无关,请考虑阅读When should I use h:outputLink instead of h:commandLink?