JSF 2和Post/Redirect/Get?

ber*_*tie 22 jsf post-redirect-get jsf-2

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

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

现在的问题是......

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

return "myview";
Run Code Online (Sandbox Code Playgroud)

Bal*_*usC 27

您可以使用自定义执行此操作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;
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

在以下位置注册faces-config.xml:

<application>
    <navigation-handler>com.example.RedirectNavigationHandler</navigation-handler>
</application>  
Run Code Online (Sandbox Code Playgroud)

  • 嗨,艾伯特.您可以向处理程序添加代码,并检查请求是否是从FaceContext获取PartialViewContext的AJ​​AX请求,然后调用PartialViewContext.isAJAXRequest http://download.oracle.com/javaee/6/api/javax/faces/context/PartialViewContext. HTML#isAjaxRequest%28%29. (2认同)