如何重定向到JSF中的锚点?

blu*_*oot 8 anchor redirect accessibility jsf-2

假设我在JSF Managed Bean中有这个动作:

public String doSomething() {
    FacesContext.getCurrentInstance().getExternalContext().getFlash().put("msg", "Something was done successfully");
    return "view?faces-redirect=true";
}
Run Code Online (Sandbox Code Playgroud)

view有一个带有id的锚元素msg.我希望网址有这个锚点(对于可访问性问题),例如:

view.jsf#msg
Run Code Online (Sandbox Code Playgroud)

或者是我的FacesServlet过滤器模式.

return "view#msg?faces-redirect=true";显然不会起作用,因为JSF(至少是mojarra)会尝试view#msg作为一个视图进行评估.

所以我的问题是如何让JSF #msg最终重定向到一个URL .

Bal*_*usC 10

因为JSF(至少是mojarra)会尝试评估view#msg视图

哦,那太讨厌了.这绝对值得JSF/Mojarra男孩的增强请求.

您最好的选择是在帮助下手动发送重定向ExternalContext#redirect().

public void doSomething() throws IOException {
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.getFlash().put("msg", "Something was done successfully");
    ec.redirect("view.xhtml#msg");
}
Run Code Online (Sandbox Code Playgroud)

(假设FacesServlet已映射*.xhtml)

或者,您可以有条件地渲染一块JS来代替它.

<ui:fragment rendered="#{not empty flash.msg}">
    <script>window.location.hash = 'msg';</script>
</ui:fragment>
Run Code Online (Sandbox Code Playgroud)