当前位置: 首页 > 知识库问答 >
问题:

如何在JSF ajax监听器方法中导航/重定向

毕霖
2023-03-14

我有这个可选择的PrimeFaces树,在我的索引中选择Ajax侦听器.xhtml:

<p:tree value="#{seccionesArbolView.root}" var="node" selectionMode="single" >
    <p:treeNode>
        <h:outputText value="#{node.nombre}" />
    </p:treeNode>
    <p:ajax event="select" listener="#{seccionesArbolView.onNodeSelect}"></p:ajax>
</p:tree>                    

侦听器方法位于名为 bean 的会话范围内,并且应重定向到具有一些 GET 参数的另一个页面 (grupal.xhtml)。我试过这个:

public String onNodeSelect(NodeSelectEvent event) throws IOException {
    Seccion sec = (Seccion) event.getTreeNode().getData();
    String enlace = "grupal.xhtml?faces-redirect=true&id=" + sec.getId() + "&nombre=" + sec.getNombre();
    return enlace;
}

但是什么都没有发生。我在另一个问题中读到这可能是因为Ajax请愿书,所以我尝试了ExteralContext:

public String onNodeSelect(NodeSelectEvent event) throws IOException {
    Seccion sec = (Seccion) event.getTreeNode().getData();
    FacesContext context = FacesContext.getCurrentInstance();
    String enlace = "faces/grupal.xhtml?id=" + sec.getId() + "&nombre=" + sec.getNombre();
    context.getExternalContext().redirect(enlace);
    context.responseComplete();
}

这种方法的问题在于链接的构造。它的工作方式(带有“face”前缀)是有效的,但是每次单击树时,URL都会不断变大,并且添加了另一个“face/”(例如http://localhost:8080/MyApp/faces/faces/faces/grupal.xhtml?...),并且Glassfish发出警告请求路径“/face/face/grupal.xhtml”以一个或多个FacesServlet前缀路径映射“/faces”的出现开始

如果链接的构造不带“faces/”前缀:

String enlace = "grupal.xhtml?id=" + sec.getId() + "&nombre=" + sec.getNombre();

如果通过URL http://localhost:8080/MyApp/faces/index . XHTML访问index.xhtml,它就可以工作。但是当通过基本URL http://localhost:8080/MyApp/访问index.xhtml时,显然无法找到grupal.xhtml。

我不确定在这种情况下什么是最好的解决方案。

有没有办法用JSF 2.0导航(第一种方法,我无法开始工作)来做到这一点?

有没有办法获取整个基本URL以使用绝对路径进行重定向?

有没有办法告诉Glassfish将基本URLhttp://localhost:8080/MyApp/重定向到http://localhost:8080/MyApp/faces/index.xhtml?

共有1个答案

东门文斌
2023-03-14

我试过这个:

return enlace;

但什么也没发生。

您确实不能从listener/actionListener方法导航。您只能从action方法导航。

  • 操作和操作Listener之间的差异

< br >

有没有办法用JSF 2.0导航(第一种方法,我无法开始工作)来做到这一点?

您可以使用导航处理程序#handleNavigation()以编程方式执行导航。

public void onNodeSelect(NodeSelectEvent event) {
    // ...
    String outcome = "grupal.xhtml?faces-redirect=true&id=" + sec.getId() + "&nombre=" + sec.getNombre();
    FacesContext context = FacesContext.getCurrentInstance();
    context.getApplication().getNavigationHandler().handleNavigation(context, null, outcome);
}
  • 如何使用导航规则进行重定向

< br >

有没有办法获取整个基本URL以使用绝对路径进行重定向?

您可以使用ExteralContext#getRequest estContextPath()以编程方式获取上下文路径。

public void onNodeSelect(NodeSelectEvent event) throws IOException {
    // ...
    String uri = "/faces/grupal.xhtml?id=" + sec.getId() + "&nombre=" + sec.getNombre();
    ExternalContext ec = FacesContext.getCurrentInstance().getExternalContext();
    ec.redirect(ec.getRequestContextPath() + uri);
}
  • ExternalContext#redirect() 不重定向到父目录

< br >

有没有办法告诉Glassfish将基本URLhttp://localhost:8080/MyApp/重定向到http://localhost:8080/MyApp/faces/index.xhtml?

使用<代码>

  • 无法识别 JSF 欢迎文件
  • 有时我看到JSF URL是*.jsf,有时是*.xhtml,有时是/faces/*。为什么?
 类似资料:
  • 在http://www.gebish.org/manual/current/API/geb/navigator/navigator.html中,我对navigator API使用的语言有点困惑 在particualr中,我对.isShopping方法感到困惑。 方法文档声明:“如果显示唯一上下文元素,则返回true;对于空导航器,则返回false。不能在多元素导航器上调用。” 问题是,如果我在空导

  • 我有一个基本回收适配器,如下所示: : 基本视图保持架为: 假设ViewHolder有两个视图,一个TextView和一个ImageView。如何对ViewHolder的itemview中的所有项目实现ClickListener

  • 我试图用我的键控制火箭动画,并尝试使用KeyListener方法,然而,我的程序对我的按键没有反应。我尝试将keylistener添加到我的JFrame,但它没有调用它,因为JFrame是一个单独的静态方法。如果你运行它,你将没有图像,但是,如果你运行,请替换为矩形。你能说出我的错误吗。提前谢了。 下面是我的代码:

  • 我正在处理一些奇怪的遗留代码。他们有一个实现JPanel的自定义对象。这个< code>JPanel对象是主应用程序中的第二个弹出屏幕。我遇到的问题是检测辅助弹出屏幕何时关闭。 我尝试为该类实现一个,但是当我尝试添加它时,没有与此对象关联的。我假设这是因为他们正在使用一个自定义对象,它是一个嵌入式弹出屏幕。 我尝试使用以下命令检索: 这在上失败。我不知道为什么在这个页面上检测右上角的“x”关闭按钮

  • 本文向大家介绍SpringBoot定义过滤器、监听器、拦截器的方法,包括了SpringBoot定义过滤器、监听器、拦截器的方法的使用技巧和注意事项,需要的朋友参考一下 一、自定义过滤器 创建一个过滤器,实现javax.servlet.Filter接口,并重写其中的init、doFilter、destory方法。 二、自定义监听器 创建一个过滤器,实现ServletContextListener接口

  • 问题:自定义的MyRetryListener,想在@Retryable中指定使用,现在却变成了不指定也会调用 显现:现在直接写@Retryable不声明listeners 也会走到MyRetryListener中去 希望结果,只在注解中指定了listeners = {"myRetryListener"}的时候调用MyRetryListener中的方法