【问题标题】:JSF 2 and Post/Redirect/Get?JSF 2 和发布/重定向/获取?
【发布时间】:2011-07-21 22:12:45
【问题描述】:

如果我错了,请纠正我,但我认为我所有的非 AJAX 提交都应该使用 Post/Redirect/Get (PRG) 方式,因为 GET 应该用于刷新/查询数据,并且就我而言,我能想到的应用程序页面实际上只更新数据然后刷新页面,所以我认为 PRG 适合这里。

我相信我可以使用 faces-config.way 来做到这一点,我使用 <redirect/>,或者我可以使用 return "myview.xhtml?faces-redirect=true";

现在的问题是..

有没有什么方法可以全局配置非 AJAX 调用/提交,自动使用 faces-redirect=true,这样我的源就这么简单:

return "myview";

【问题讨论】:

  • @romaintaz:谢谢,忘记引用重定向标签了,哈哈

标签: jsf jsf-2 post-redirect-get


【解决方案1】:

您可以使用自定义 ConfigurableNavigationHandler 来完成此操作。这是一个启动示例:

package com.example;

import java.util.Map;
import java.util.Set;

import javax.faces.application.ConfigurableNavigationHandler;
import javax.faces.application.NavigationCase;
import javax.faces.application.NavigationHandler;
import javax.faces.context.FacesContext;

public class RedirectNavigationHandler extends ConfigurableNavigationHandler {

    private NavigationHandler parent;

    public RedirectNavigationHandler(NavigationHandler parent) {
        this.parent = parent;
    }

    @Override
    public void handleNavigation(FacesContext context, String from, String outcome) {
        if (!outcome.endsWith("?faces-redirect=true")) {
            outcome += "?faces-redirect=true";
        }

        parent.handleNavigation(context, from, outcome);        
    }

    @Override
    public NavigationCase getNavigationCase(FacesContext context, String fromAction, String outcome) {
        if (parent instanceof ConfigurableNavigationHandler) {
            return ((ConfigurableNavigationHandler) parent).getNavigationCase(context, fromAction, outcome);
        } else {
            return null;
        }
    }

    @Override
    public Map<String, Set<NavigationCase>> getNavigationCases() {
        if (parent instanceof ConfigurableNavigationHandler) {
            return ((ConfigurableNavigationHandler) parent).getNavigationCases();
        } else {
            return null;
        }
    }

}

faces-config.xml注册如下:

<application>
    <navigation-handler>com.example.RedirectNavigationHandler</navigation-handler>
</application>  

【讨论】:

  • 当操作方法返回 void(保持在同一页面上)&lt;h:commandButton action="#{bean.voidMethod}"/&gt; 时,是否可以使此处理程序工作?
  • 嗨,阿尔伯特。您可以将代码添加到处理程序并检查请求是否是从 FaceContext 获取 PartialViewContext 的 AJAX 请求,然后调用 PartialViewContext.isAJAXRequest download.oracle.com/javaee/6/api/javax/faces/context/…
  • 嗨BalusC:你有理由extends ConfigurableNavigationHandler而不是extends NavigationHandler吗? ConfigurableNavigationHandler 为您提供了更多 NavigationHandler 所没有的功能?
  • @Thang:自 JSF 2.0 起这是必需的。另请参阅类的介绍性文本 javadoc docs.oracle.com/javaee/6/api/javax/faces/application/…
  • 谢谢BalusC:由于某些原因,当我调试时,它没有进入getNavigationCase(...)getNavigationCases()。是不是因为我没有在我的faces-config.xml 中指定任何导航案例。我的 commandButton 只是返回视图 ID。
猜你喜欢
  • 2010-12-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多