我正在维护一个JSF2 Ajax应用程序,我们大量使用h:commandLinks
和f:ajax
标记用于所有操作 - 始终只重新渲染所需的内容。
这当然会在右键单击链接并选择“在新标签页中打开链接”等时打破用户的预期行为。
我理解f:ajax强制生成的a
元素的href属性为#
,并在onclick函数中执行所有魔术发布请求技巧 - 我现在想要提供后备支持通过在生成的<a>
标记的href属性中添加一些有意义的链接来实现“Open Link ...”操作。
这不会破坏“正常”的onclick行为,因为生成的javascript总是以return false;
结束,但允许我使用普通的GET请求将我的用户发送到某个页面,以防他们想要打开链接一个新的窗口。
是否有建立方式来做到这一点?或者有人可以指出我在JSF生命周期的哪个方向上正确的方向,我可能会使用阶段监听器来实现这一目标吗?
答案 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?