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

如何在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接口

  • 常常它是有用的能够接受附加的回调为了切割关注点穿过一些不同的重试 为了这个目的Spring Batch 提供了RetryListene 接口,RetryTemplate 允许使用者注册RetryListene,并且他们将发送回调随从RetryContext和Throwable,在迭代期间可用。 这个接口看起来像这样: public interface RetryListener { voi