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

bxr*_*bxr 5 jsf-2 mojarra

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

当然,当执行右键单击链接并选择"在新标签中打开链接"等时,这会打破用户的预期行为.

我理解f:ajax强制生成的a元素的href属性#并且在onclick函数中执行所有魔术发布请求技巧 - 我现在想通过放置一些有意义的内容为"Open Link ..."操作提供后备支持链接在结果<a>标记的href属性中.

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

有没有建立方式来做到这一点?或者有人可以指出我在JSF生命周期的哪个方向上正确的方向我可能会使用阶段监听器来进行此操作?

Bal*_*usC 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 {
        // ...
    }

}
Run Code Online (Sandbox Code Playgroud)

要使其运行,请按以下方式注册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>
Run Code Online (Sandbox Code Playgroud)

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


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