【问题标题】:Redirection via actionListener not working通过 actionListener 重定向不起作用
【发布时间】:2017-05-19 13:12:22
【问题描述】:

我被一个通过 ejb 的 jsf 重定向卡住了,我花了一天时间找到问题,但没有找到问题。

我想在 EJB 中运行一个操作,并根据结果将用户重定向到另一个页面。我确定该功能正常工作,我在调试模式下跟踪结果。

我已经在其他项目中以相同的方式进行了重定向,但在这里不起作用,为了确定,我创建了一个非常基本的函数,我遇到了同样的问题。

只是为了测试功能我做了一个测试ejb:

@Named
@SessionScoped
public class testController implements Serializable{
    public String redirection(){
        return "login.xhtml";
    }   
}

以及我尝试使用该功能的地方:

<html xmlns="http://www.w3.org/1999/xhtml"
      xmlns:h="http://java.sun.com/jsf/html"
      xmlns:f="http://java.sun.com/jsf/core"
      xmlns:ui="http://java.sun.com/jsf/facelets"
      xmlns:p="http://primefaces.org/ui">

    <h:head>
        <f:facet name="first">
            <meta http-equiv="X-UA-Compatible" content="IE=edge" />
            <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
            <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0"/>
            <meta name="apple-mobile-web-app-capable" content="yes" />
        </f:facet>
        <title>PrimeFaces Omega</title>
    </h:head>

    <h:body styleClass="login-body">
        <p:commandButton value="test" actionListener="#{testController.redirection()}"/>
        </h:body>
</html>

这是 web.xml 配置:

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="3.0" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
    <welcome-file-list>
        <welcome-file>login.xhtml</welcome-file>
    </welcome-file-list>
    <context-param>
        <param-name>javax.faces.PROJECT_STAGE</param-name>
        <param-value>Development</param-value>
    </context-param>
    <!-- JSF mapping -->
    <servlet>
        <servlet-name>Faces Servlet</servlet-name>
        <servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <!-- Map these files with JSF -->
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>/faces/*</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.jsf</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.faces</url-pattern>
    </servlet-mapping>
    <servlet-mapping>
        <servlet-name>Faces Servlet</servlet-name>
        <url-pattern>*.xhtml</url-pattern>
    </servlet-mapping>
    <context-param>
        <param-name>primefaces.THEME</param-name>
        <param-value>omega</param-value>
    </context-param>
    <context-param>
        <param-name>primefaces.FONT_AWESOME</param-name>
        <param-value>true</param-value>
    </context-param>
    <mime-mapping>
        <extension>ttf</extension>
        <mime-type>application/font-sfnt</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>woff</extension>
        <mime-type>application/font-woff</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>woff2</extension>
        <mime-type>application/font-woff2</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>eot</extension>
        <mime-type>application/vnd.ms-fontobject</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>eot?#iefix</extension>
        <mime-type>application/vnd.ms-fontobject</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>svg</extension>
        <mime-type>image/svg+xml</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>svg#exosemibold</extension>
        <mime-type>image/svg+xml</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>svg#exobolditalic</extension>
        <mime-type>image/svg+xml</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>svg#exomedium</extension>
        <mime-type>image/svg+xml</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>svg#exoregular</extension>
        <mime-type>image/svg+xml</mime-type>
    </mime-mapping>
    <mime-mapping>
        <extension>svg#fontawesomeregular</extension>
        <mime-type>image/svg+xml</mime-type>
    </mime-mapping>
</web-app>

我查看了日志文件,我的函数正常工作,但我应该重定向到应用程序停留在页面上的索引页面。

有人可以帮忙吗?

【问题讨论】:

标签: jsf primefaces jsf-2


【解决方案1】:

组件p:commandButton 不支持仅使用纯字符串而不显式附加重定向参数的操作重定向。

如果您想使用该操作进行重定向,您必须在字符串中包含 faces-redirect=true 作为 url 参数。

稍微改变你的代码应该可以解决问题:

public String redirection(){
    return "login.xhtml?faces-redirect=true";
}   

【讨论】:

  • 我同意 OP 没有使用最正确的方法来做到这一点,但另一方面,如果我们总是强制要求必须遵循最正确的模式,我们最终会造成太多的复杂性和远初学者的学习曲线更大。我并不是说我们应该对此视而不见,但有时简单的解决方法比复杂的教程更有帮助。
  • 我不反对,这就是为什么我在本教程中说“离题” ;-),但实际上它并不完全正确,因为您在第一行中所说的不是 @987654324 @ 但对于一个h:commandButton 来说。对于p\h:commandLink 等等。通过引用“重复项”,通常可以获得更多信息,并且发布者可以学习而不是提供解决方案(提供鱼而不是学习如何修复)。 (请参阅我将此问题标记为的副本)
  • 感谢您的帮助,它现在可以通过更改操作并添加 ?faces-redirect=true 来工作。我同意术语可以更好,但把它放在英语上不是我的母亲 lang
  • 现在很好用。出于好奇,您的 wuestion 不与“重复”相同(95%)吗?而且你的英语很好。 EJB vs CDI 与此无关。提示:阅读 stackoverflow 中所有获得 50 票或更多票的 Q/A 并记住它们的存在。总是很方便...
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-04
  • 2016-10-16
  • 2018-08-15
  • 1970-01-01
  • 2013-09-08
  • 1970-01-01
  • 2022-10-19
相关资源
最近更新 更多