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