例如,假设我想运行一些逻辑,然后点击 /page.html#elementid
<h:commandLink action="#{myBean.action}" value="Go"/>
和
public String action()
{
// Some logic here
return "/page.xhtml#elementid";
}
我找不到任何关于此的示例,想知道是否有解决方案?
#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";
}
在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>
.