2013-08-29 31 views
8
從豆在JSF

A可跳轉可以通過如何使用導航規則

externalContext.redirect("foo.xhtml"); 

做才能使重定向,但我想使用的規則,<navigation-rule/>(faces-config.xml中)設置<from-outcome/> & &傳遞命令行參數。

externalContext.redirect("from-outcome?param=bar"); 

不工作。怎麼做?

回答

13

ExternalContext#redirect()takes an URL,而不是導航結果。

您需要從聲明爲返回String的操作方法返回導航結果。

public String submit() { 
    // ... 

    return "from-outcome"; 
} 

您可以將導航案例配置爲通過添加<redirect>來發送重定向。

<navigation-rule> 
    <navigation-case> 
     <from-outcome>from-outcome</from-outcome> 
     <to-view-id>/foo.xhtml</to-view-id> 
     <redirect> 
      <view-param> 
       <name>param</name> 
       <value>bar</value> 
      </view-param> 
     </redirect> 
    </navigation-case> 
</navigation-rule> 

請注意,您也可以只使用JSF的隱式導航,而不需要爲這個XML混亂:

public String submit() { 
    // ... 

    return "/foo.xhtml?faces-redirect=true&param=bar"; 
} 

如果你是一個事件或AJAX監聽器方法內不能返回一個字符串結果,那麼你總是可以抓取NavigationHandler#handleNavigation()來執行所需的導航。

public void someEventListener(SomeEvent event) { // AjaxBehaviorEvent or ComponentSystemEvent or even just argumentless. 
    // ... 

    FacesContext context = FacesContext.getCurrentInstance(); 
    NavigationHandler navigationHandler = context.getApplication().getNavigationHandler(); 
    navigationHandler.handleNavigation(context, null, "from-outcome"); 
} 

非導航案例相當於使用ExternalContext#redirect()

+1

感謝@BalusC,但是如何修改bean的導航規則中的值? – timmornYE

+1

您可以像'#{bean.param}'那樣在''中使用EL。這相當於'return「/foo.xhtml?faces-redirect=true¶m=」+ URLEncoder.encode(param,「UTF-8」);(儘管一些Mojarra版本在使用charset時存在錯誤)。 – BalusC

+0

謝謝,我明白。但回到我的問題:所以沒有辦法使用'navigation-rule'沒有返回一個字符串?因爲在某些情況下這是不可能的。如果我想從Ajax調用重定向,該怎麼辦?在那裏我不能返回導航爲String或者我錯了嗎? – timmornYE