2

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

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

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

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

4

1 回答 1

2

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

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";
}

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)constructor 或<f:viewParam>.

于 2012-10-03T11:39:55.020 回答