javascript
jsf集成spring_Spring和JSF集成:导航
jsf集成spring
我希望這是有關(guān)我在Spring和JavaServer Faces之間提供深度集成的努力的一系列博客中的第一篇。 這里提到的所有內(nèi)容都是“正在進(jìn)行中的工作”,因此,如果您簽出代碼,請(qǐng)注意它是一個(gè)不斷變化的目標(biāo)。 期待一些粗糙的邊緣,如果有時(shí)會(huì)斷裂,不要感到驚訝。您已經(jīng)可以很輕松地將Spring與JSF結(jié)合使用,Spring可以管理bean,而JSF可以處理屏幕。 Spring Web Flow中還對(duì)JSF提供了一些非常好的支持,如果您正在做任何基于流的應(yīng)用程序,那么您確實(shí)應(yīng)該使用Web Flow。 Web Flow還提供org.springframework.faces.mvc. JsfView類(lèi),使您可以從Spring MVC呈現(xiàn)JSF頁(yè)面。 不幸的是, JsfView僅呈現(xiàn)瞬態(tài)(無(wú)狀態(tài))視圖,如果您想處理回發(fā),則JsfView走運(yùn)。
允許Spring MVC渲染可以處理回發(fā)的JSF視圖一直是我啟動(dòng)該項(xiàng)目的主要?jiǎng)恿Α?得益于MVC和JSF的靈活性,完全可以集成這些技術(shù)(盡管關(guān)于如何最好地保存其他帖子的確切細(xì)節(jié))。 我想在本文的其余部分中討論如何創(chuàng)建非常好的JSF導(dǎo)航。
如果您使用了標(biāo)準(zhǔn)的JSF導(dǎo)航,則可能已經(jīng)習(xí)慣了faces-config.xml的以下類(lèi)型的事情:
<navigation-rule><from-view-id>/pages/list.xhtml</from-view-id><navigation-case><from-outcome>select</from-outcome><to-view-id>/pages/details.xhtml</to-view-id><redirect/></navigation-case> </navigation-rule>雖然很容易理解,但是對(duì)于標(biāo)準(zhǔn)方法來(lái)說(shuō),標(biāo)準(zhǔn)方法存在一些明顯的缺點(diǎn),因?yàn)樗浅H唛L(zhǎng)。 大多數(shù)時(shí)候,我想重定向我的用戶,而不是讓他們對(duì)URL為什么顯示與當(dāng)前頁(yè)面不同的東西感到困惑。 實(shí)際上在每個(gè)元素上都需要<redirect/>確實(shí)很煩人。 XML的數(shù)量顯然使JSF的開(kāi)發(fā)人員感到不安,幸運(yùn)的是,JSF 2.0引入了隱式導(dǎo)航的概念。 這是我們稍后將使用的東西。 如果您想閱讀有關(guān)JSF導(dǎo)航的非常好的文章,請(qǐng)使用Dan Allen撰寫(xiě)的JSF 2中的Fluent Navigation 。
導(dǎo)航實(shí)際上與目的地有關(guān),將某人重定向到404 page not found錯(cuò)誤沒(méi)有多大意義。 對(duì)于JSF而言,創(chuàng)建漂亮的可讀URL目標(biāo)始終是一件艱苦的事情。 現(xiàn)在,在不開(kāi)發(fā)自己的代碼的情況下,創(chuàng)建可讀URL的最佳選擇可能是使用PrettyFaces 。 當(dāng)然,通過(guò)將JSF和Spring很好地集成在一起,您無(wú)需使用@RequestMapping注釋以外的任何其他方法來(lái)創(chuàng)建可讀的URL。 下面的示例演示如何映射一個(gè)可讀的URL,以顯示ID中的酒店詳細(xì)信息。
@Controller public class HotelsController {@RequestMapping(value = "/hotels/{id}", method = RequestMethod.GET)public String show(@PathVariable Long id, Model model) {model.addAttribute(bookingService.findHotelById(id));return "hotels/show";} }有了@RequestMapping批注,我們可以再次考慮導(dǎo)航。 通常, <h:commandButton> , <h:button> , <h:commandLink>或<h:link>組件將用于觸發(fā)導(dǎo)航,例如:
<h:commandButton value="Go" action="select">在此,當(dāng)用戶單擊"Go"按鈕時(shí), "select"動(dòng)作開(kāi)始,并且導(dǎo)航規(guī)則用于查找目的地。 當(dāng)我們要遠(yuǎn)離定義導(dǎo)航XML時(shí),我們需要一種替代方法來(lái)查找MVC目標(biāo)。 稍微顛覆JSF對(duì)隱式導(dǎo)航的支持為我們提供了一種很好的方法。 通過(guò)一些集成代碼,我們可以支持特殊的"spring:"前綴,該前綴告訴JSF使用Spring MVC解析目標(biāo)。
<h:commandButton value="Go" action="spring:redirect:/spring/hotels/123"/> 上面的示例將使用在Spring MVC中注冊(cè)的ViewResolver來(lái)解析"redirect:/spring/hotel/123" 。 在這種情況下, UrlBasedViewResolver將選擇"redirect:"并將使用RedirectView 。 
 很好,但是將酒店ID "123"硬編碼到視圖名稱中并不實(shí)際。 幸運(yùn)的是有一個(gè)答案: 
commandButton所有<f:param>子標(biāo)記將用于構(gòu)造MVC視圖的模型。 在這種情況下,我們得到一個(gè)包含“ id=#{resultItem.id} ”的模型。 EL值表達(dá)式#{resultItem.id}將在呈現(xiàn)視圖之前解析。 Spring 3.1中的RedirectView類(lèi)將處理URL模板變量,因此“ /spring/hotels/{id} ”將選擇“ id ”以呈現(xiàn)完整的URL。
使用上述方法的一點(diǎn)煩惱是您需要在XHTML文件以及@RequestMapping批注中定義URL。 作為替代方案,您可以使用特殊的“ @bean.method ”符號(hào)表示您要導(dǎo)航到指定控制器bean方法上的@RequestMapping的值:
<h:commandButton value="Go" action="spring:@hotelsController.show"><f:param name="id" value="#{resultItem.id}/> </h:commandButton> 如果在控制器bean上有多個(gè)@RequestMapping方法,則可以使用甚至更短的語(yǔ)法“ @method ”(此處假定該bean是當(dāng)前處理程序)在它們之間進(jìn)行導(dǎo)航。 當(dāng)然,并非每種類(lèi)型的@RequestMapping都可以反向轉(zhuǎn)換為URL,例如,如果您使用通配符,則此操作將無(wú)效。 建議是使您的映射盡可能簡(jiǎn)單。 
 這種方法的最后一個(gè)好處是,我們還可以逆轉(zhuǎn)DataBinder過(guò)程。 例如: 
假設(shè)#{searchCriteria} EL表達(dá)式解析為包含字符串"California"的SearchCriteria對(duì)象,并且所構(gòu)建的URL的整數(shù)10將為"/spring/hotels?searchString=California&page=10" 。
如果您想查看該項(xiàng)目的代碼,可以在http://github.com/philwebb/springfaces上找到它。 如文章頂部所述,此代碼尚在開(kāi)發(fā)中,因此請(qǐng)注意一些問(wèn)題。 路線圖上的下一個(gè)任務(wù)是支持@NavigationMapping批注,該批注將允許以編程方式進(jìn)行導(dǎo)航。
參考: 集成Spring和JavaServer Faces: JCG合作伙伴 Phillip Webb的 導(dǎo)航 ? 在Phil Webb的Blog上 。
翻譯自: https://www.javacodegeeks.com/2012/03/spring-jsf-integration-navigation.html
jsf集成spring
總結(jié)
以上是生活随笔為你收集整理的jsf集成spring_Spring和JSF集成:导航的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
 
                            
                        