action
屬性綁定到支持bean來實現動態導航: <h:commandButton action="#{bean.actionBasedOnAge}"/>
public String actionBasedOnAge() {if(age < 12) {return "fetchadult";} else {return "ok"}
}
上面的示例顯示了十二歲以下的人如何被定向到'fetchadult'
而不是通常的'ok'
。 'fetchadult'
和'ok'
結果都需要在faces-config.xml
定義導航規則,以便JSF知道要顯示的實際頁面。
使用Spring MVC時,將導航邏輯包含在@Controller
bean中通常更為自然。 為了解決這個問題,從MVC渲染JSF時,隱式的'controller'
和'handler'
變量可用。 'controller'
變量提供對映射到原始請求的控制器bean的訪問,并提供對基礎MVC處理程序的'handler'
變量的訪問。 在Spring 3.0中, 'controller'
和'handler'
通常是同一對象。 但是,在Spring 3.1中,底層的MVC體系結構正在發生變化 , 'handler'
通常是org.springframework.web.method.HandlerMethod
實例。
這是一個引用@Controller
的someNavigation()
方法的提交按鈕:
<h:commandButton action="#{controller.someNavigation"/>
雖然訪問控制器bean很有用,但它不是理想的解決方案。 我更喜歡在我的JSF頁面中使用邏輯名并映射那些Java方法。 我還想要一種簡單的方法來從基礎模型中獲取數據。
@NavigationMapping
批注提供了另一種更靈活的導航方法。 它的工作方式與@RequestMappings
非常相似。 注釋可以放在@Controller
任何公共方法上,以將導航結果映射到目的地。
<h:commandButton action="submit"/>
@NavigationMapping
public String onSubmit() {return "redirect:http://www.springsource.org";
}
如果您需要訪問支持bean,則可以使用標準的Spring @Value
注釋。 頁面可以解析的任何EL表達式也可以在導航方法參數上使用。
@NavigationMapping
public String onSubmit(@Value("#{person.age}") int age) {
...
}
訪問模型元素甚至更加容易。 只要您只有一個要在模型中訪問的類型的對象,并且它不是簡單類型(int,String等),就不需要任何注釋:
@NavigationMapping
public String onSubmit(Person p) {
...
}
也可以使用其他參數類型(有關完整列表,請參見JavaDoc)。 例如,這是一個導航映射,處理'submit'
, 'cancel'
和'save'
結果。 注入的參數告訴我們單擊了三個結果中的哪個,并提供了對源UIComponent
訪問。
@NavigationMapping('submit','cancel','save')
public String handleNavigation(String outcome, UIComponent source) {
...
}
返回類型也同樣靈活。 您可以返回視圖名稱作為String
S,你也可以使用相同的"@hotelsController.show"
符號,我以前的博客上講述 。 您也可以直接返回View object
,或者如果要包含隱式模型項,則可以使用NavigationOutcome
。
最后,如果只想呈現即時響應,則可以使用@ResponseBody
批注或返回HttpEntity
。 它的工作方式與Spring完全相同。
參考: 集成Spring和JavaServer Faces:來自Phil Webb博客博客中的JCG合作伙伴 Phillip Webb的動態導航 。
翻譯自: https://www.javacodegeeks.com/2012/05/spring-jsf-integration-dynamic.html