2011-03-24 61 views
20

如果我錯了,請糾正我,但我想我的所有非AJAX提交都應該使用Post/Redirect/Get(PRG)方式,因爲GET應該用於刷新/查詢數據,並且在我的情況,我能想到的應用程序頁面實際上只是對數據進行更新,然後刷新頁面,所以我認爲PRG適合這裏。JSF 2和Post/Redirect/Get?

我相信我能使用的面孔,config.way,在這裏我利用<redirect/>的做到這一點,或者我可以使用return "myview.xhtml?faces-redirect=true";

現在的問題是..

有什麼辦法我可以在全球配置此,對於非AJAX調用/提交,自動使用面孔重定向=真正的,讓我的來源是如此簡單:

return "myview"; 
+0

@romaintaz:謝謝你,忘了引用重定向代碼,哈哈 – bertie 2011-03-25 07:50:41

回答

24

你可以使用自定義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> 
+1

哇,優雅!謝謝 ! – bertie 2011-03-25 03:43:19

+0

不客氣。 – BalusC 2011-03-25 03:45:36

+0

當action方法返回void(留在同一頁面上)''時,可以使這個處理程序工作嗎? – marioosh 2011-08-08 07:34:45