是否可以使用h:commandLink(或类似命令)导航到带有片段的URI?

时间:2012-10-03 09:06:44

标签: jsf jsf-2

例如,假设我想运行一些逻辑,然后点击/page.html#elementid

<h:commandLink action="#{myBean.action}" value="Go"/>

public String action()
{
   // Some logic here
   return "/page.xhtml#elementid";
}

我找不到任何关于此的例子,并想知道是否有解决方案?

1 个答案:

答案 0 :(得分:2)

#elementid URI片段也必须发送到客户端。这不会发生在这里。你基本上是在执行服务器端转发。您应该执行客户端重定向。

public void action() throws IOException {
    // ...

    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.redirect(ec.getRequestContextPath() + "/page.xhtml#elementid");
}

或者,您可以有条件地呈现一些JavaScript来设置URI片段:

public String action() {
    // ...

    hash = "elementid";
    return "/page.xhtml";
}

with page.xhtml

<h:outputScript target="body" rendered="#{not empty bean.hash}">
    location.hash = "#{bean.hash}";
</h:outputScript>

顺便说一句,<h:link>明确支持URI片段。

<h:link value="Go to page" outcome="page" fragment="elementid" />

然而,它会触发GET请求,因此任何预初始化的业务操作都需要在基于(post)构造函数或<f:viewParam>的目标页面关联的bean中执行。