【问题标题】:How to change the standard href="#" attribute of h:commandLink?如何更改 h:commandLink 的标准 href="#" 属性?
【发布时间】:2012-09-18 03:35:15
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: jsf-2 mojarra


    【解决方案1】:

    最简单的方法是扩展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?

    【讨论】:

    • 感谢 BalusC,扩展 CommandLinkRenderer 完美地实现了预期的结果。
    猜你喜欢
    • 2015-07-16
    • 2014-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-18
    • 1970-01-01
    • 2013-06-13
    相关资源
    最近更新 更多