5

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

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

我知道 f:ajax 强制生成a元素的 href 属性,#并在 onclick 函数中执行所有神奇的发布请求技巧 - 我现在想通过放置一些有意义的内容来为“打开链接...”操作提供后备支持在结果<a>标签的 href 属性中链接。

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

有没有办法做到这一点?或者有人可以指出我在 JSF 生命周期中的正确方向,我可能需要使用相位侦听器来执行此操作?

4

1 回答 1

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 特定的渲染器类。


与具体问题无关,请考虑阅读何时应该使用 h:outputLink 而不是 h:commandLink?

于 2012-09-26T13:37:51.743 回答