Spring和JSF集成:導航

我希望這是有關我在Spring和JavaServer Faces之間提供深度集成的努力的一系列博客中的第一篇。 這里提到的所有內容都是“正在進行中的工作”,因此,如果您簽出代碼,請注意它是一個不斷變化的目標。 期待一些粗糙的邊緣,如果有時會斷裂,不要感到驚訝。

您已經可以很輕松地使用帶有JSF的Spring,Spring可以管理bean和JSF來處理屏幕。 Spring Web Flow中還對JSF提供了一些非常好的支持,如果您正在做任何基于流的應用程序,那么您確實應該使用Web Flow。 Web Flow還提供org.springframework.faces.mvc. JsfView類,使您可以從Spring MVC呈現JSF頁面。 不幸的是, JsfView僅呈現瞬態(無狀態)視圖,如果您想處理回發,則JsfView走運。

允許Spring MVC渲染可以處理回發的JSF視圖一直是我啟動該項目的主要動力。 得益于MVC和JSF的靈活性,完全可以集成這些技術(盡管關于如何最好地保存其他帖子的確切細節)。 我想在本文的其余部分中討論如何創建非常好的JSF導航。

如果您使用了標準的JSF導航,那么您可能已經習慣了faces-config.xml的以下類型的事情:

<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>

雖然很容易理解,但是對于標準方法來說,標準方法存在一些明顯的缺點,因為它非常冗長。 大多數時候,我想重定向我的用戶,而不是讓他們困惑為什么URL顯示與當前頁面不同的內容。 實際上在每個元素上都需要<redirect/>確實很煩人。 XML的數量顯然使JSF的開發人員感到不安,幸運的是,JSF 2.0引入了隱式導航的概念。 這是我們稍后將使用的東西。 如果您想閱讀有關JSF導航的非常好的文章,請使用Dan Allen撰寫的JSF 2中的Fluent Navigation 。

導航實際上是關于目的地的,將某人重定向到404 page not found錯誤沒有多大意義。 對于JSF而言,創建漂亮的可讀URL目標始終是一件艱辛的事情。 現在,在不開發自己的代碼的情況下,創建可讀URL的最佳選擇可能是使用PrettyFaces 。 當然,通過將JSF和Spring很好地集成在一起,您不需要使用@RequestMapping注釋以外的任何其他東西來創建可讀的URL。 下面的示例演示如何映射一個可讀的URL,以顯示ID中的酒店詳細信息。

@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批注,我們可以再次考慮導航。 通常, <h:commandButton><h:button><h:commandLink><h:link>組件將用于觸發導航,例如:

<h:commandButton value="Go" action="select">

在此,當用戶單擊"Go"按鈕時, "select"動作開始,并且導航規則用于查找目的地。 當我們要遠離定義導航XML時,我們需要另一種方法來查找MVC目標。 稍微顛覆JSF對隱式導航的支持為我們提供了一種很好的方法。 通過一些集成代碼,我們可以支持特殊的"spring:"前綴,該前綴告訴JSF使用Spring MVC解析目標。

<h:commandButton value="Go" action="spring:redirect:/spring/hotels/123"/>

上面的示例將使用在Spring MVC中注冊的ViewResolver解析"redirect:/spring/hotel/123" 。 在這種情況下, UrlBasedViewResolver將選擇"redirect:"并將使用RedirectView
很好,但是將酒店ID "123"硬編碼到視圖名稱中并不是很實際。 幸運的是有一個答案:

<h:commandButton value="Go" action="spring:redirect:/spring/hotels/{id}"><f:param name="id" value="#{resultItem.id}/>
</h:commandButton>

commandButton所有<f:param>子標記將用于構造MVC視圖的模型。 在這種情況下,我們得到一個包含“ id=#{resultItem.id} ”的模型。 EL值表達式#{resultItem.id}將在呈現視圖之前解析。 Spring 3.1中的RedirectView類將處理URL模板變量,因此“ /spring/hotels/{id} ”將選擇“ id ”以呈現完整的URL。

使用上述方法的一點煩惱是您需要在XHTML文件以及@RequestMapping批注中定義URL。 作為替代方案,您可以使用特殊的“ @bean.method ”符號表示您要導航至指定控制器bean方法上的@RequestMapping的值:

<h:commandButton value="Go" action="spring:@hotelsController.show"><f:param name="id" value="#{resultItem.id}/>
</h:commandButton>

如果在控制器bean上有多個@RequestMapping方法,則可以使用更短的語法“ @method ”(此處假定該bean是當前處理程序)在它們之間進行導航。 當然,并非每種類型的@RequestMapping都可以反向轉換為URL,例如,如果您使用通配符,則此操作將無效。 建議是使您的映射盡可能簡單。
這種方法的最后一個好處是我們還可以逆轉DataBinder過程。 例如:

public class SearchCriteria implements Serializable {private String searchString;private int page;// ... getters / setters
}
@RequestMapping(value = "/hotels")
public String list(SearchCriteria criteria, Model model) {// ...
}
<h:link outcome="spring:@list"><f:param name="sc" value="#{searchCriteria}"/>
</h:link>

假定#{searchCriteria} EL表達式解析為包含字符串"California"SearchCriteria對象,并且所構建的URL的整數10將為"/spring/hotels?searchString=California&page=10"

如果您想查看該項目的代碼,可以在http://github.com/philwebb/springfaces上找到它。 如文章頂部所述,此代碼尚在開發中,因此請注意一些問題。 路線圖上的下一個任務是支持@NavigationMapping批注,該批注將允許以編程方式進行導航。

參考: 集成Spring和JavaServer Faces: JCG合作伙伴 Phillip Webb的 導航 ? 在Phil Webb的Blog上 。


翻譯自: https://www.javacodegeeks.com/2012/03/spring-jsf-integration-navigation.html

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/373444.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/373444.shtml
英文地址,請注明出處:http://en.pswp.cn/news/373444.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

【CSS3動畫】transform對文字及圖片的旋轉、縮放、傾斜和移動

前言&#xff1a;之前我有寫過CSS3的transform這一這特性&#xff0c;對于它的用法&#xff0c;還不是很透徹&#xff0c;今天補充補充&#xff0c;呵呵 你懂的&#xff0c;小司機準備開車了。 a)再提一提transform的四個屬性 ①旋轉--->rotate(參數a)&#xff0c;單位deg&a…

宏的用法與簡介

預處理指令&#xff1a;例如&#xff1a;#include<stdio.h> #include<stdlib.h> #define MAX 20 ............. 因為他們由預處理器解釋的&#xff0c;所以稱作預處理指令。預處理器讀取源代碼&#xff0c;然后對其修改&#xff0c;并把修改過的…

django 日志寫入mysql_如何將django orm模型 寫入數據庫

1、指定連接pymysql(python3.x)先配置_init_.pyimport pymysqlpymysql.install_as_MySQLdb()2、配置連接mysql文件信息settings.pyDATABASES {default: {ENGINE: django.db.backends.mysql,NAME: django_orm, #你的數據庫名稱USER: root, #你的數據庫用戶名PASSWORD: , #你的數…

ORM的問題第2部分–查詢

在我以前關于對象關系映射工具&#xff08;ORM&#xff09;的帖子中&#xff0c;我討論了在處理當今常見的ORM&#xff08;包括Hibernate&#xff09;時遇到的各種問題。 其中包括與從POJO生成架構有關的問題&#xff0c;實際性能和不斷出現的維護問題。 本質上&#xff0c;結論…

【轉】如何減少接口響應時間

Premature optimization is the root of all evil. — Donald Knuth 對于程序優化&#xff0c;我一直采取保守的態度&#xff0c;除非萬不得已。但是隨著業務的不斷發展&#xff0c;程序越來越復雜&#xff0c;代碼越寫越多&#xff0c;優化似乎是終有一天會到來的事情。 那么對…

數據庫行轉列在現實需求中的用法

select t.客戶姓名,sum(case when t.收款類型首款 then t.金額 else 0 end as 首款),sum(case when t.收款類型尾款 then t.金額 else 0 end as 尾款) from table t group by t.客戶姓名 這段sql的意思 是 查詢出所有客戶收款信息 然后按客戶分組 分組后 然后將這個客戶的所…

mysql生產環境加索引_【生產篇】_MySQL環境下如何查看基于表的索引定義

【引言】今天中午項目組來一需求&#xff0c;欲在MySQL環境的某張表下創建幾個BTREE索引。要創建索引&#xff0c;首先需要了解基表的表結構&#xff0c;以及已經包含的索引。Oracle的表結構大家都很熟悉&#xff0c;但MySQL表結構和已創建索引的查看怎么操作&#xff0c;本文將…

Hadoop模式介紹-獨立,偽分布式,分布式

了解了什么是Hadoop之后&#xff0c;讓我們在單機上啟動Hadoop&#xff1a; 這篇文章包含在ubuntu上安裝Hadoop的說明。 這是Hadoop安裝的快速分步教程。 在這里&#xff0c;您將獲得以獨立模式 &#xff08;單節點集群&#xff09;安裝Hadoop所需的所有命令及其說明&#xff0…

apk反編譯方式

一、Apk反編譯得到Java源代碼 下載上述反編譯工具包&#xff0c;打開apk2java目錄下的dex2jar-0.0.9.9文件夾&#xff0c;內含apk反編譯成java源碼工具&#xff0c;以及源碼查看工具。 apk反編譯工具dex2jar&#xff0c;是將apk中的classes.dex轉化成jar文件 源碼查看工具jdgui…

優化Hibernate所鼓勵的7大措施

優化Hibernate所鼓勵的7大措施&#xff1a; 1.盡量使用many-to-one&#xff0c;避免使用單項one-to-many2.靈活使用單向one-to-many3.不用一對一&#xff0c;使用多對一代替一對一4.配置對象緩存&#xff0c;不使用集合緩存5.一對多使用Bag 多對一使用Set6.繼承使用顯示多態 HQ…

如何用c 控制mysql數據庫_用C語言操作MySQL數據庫

函數描述mysql_affected_rows()返回上次UPDATE、DELETE或INSERT查詢更改&#xff0f;刪除&#xff0f;插入的行數。mysql_autocommit()切換autocommit模式&#xff0c;ON/OFFmysql_change_user()更改打開連接上的用戶和數據庫。mysql_charset_name()返回用于連接的默認字符集的…

數據結構(RMQ):POJ 3624 Balanced Lineup

Balanced LineupDescription For the daily milking, Farmer Johns N cows (1 ≤ N ≤ 50,000) always line up in the same order. One day Farmer John decides to organize a game of Ultimate Frisbee with some of the cows. To keep things simple, he will take a conti…

Apache Thrift快速入門教程

Thrift是一種跨語言RPC框架&#xff0c;最初是在Facebook上開發的&#xff0c;現在作為Apache項目開源。 這篇文章將描述如何以不同的模式&#xff08;例如阻塞&#xff0c;非阻塞和異步&#xff09;編寫Thrift服務和客戶端。 &#xff08;我覺得后兩種模式的文檔較少&#xff…

數組拆分為新數組

package com.classes;//已知數組a&#xff0c;將奇數位置元素存到b數組中&#xff0c;偶數位置元素存到c數組中public class Shuzu1118_4 { public static void main(String[] args) { int [] a{3,6,9,1,4,7,2,5,8}; int [] b; //定義數組b int [] c; //定義數組c//先找出數組…

java數組交集_java數組的交集和并集

前兩天給我出了一道題&#xff0c;求數組的并集和交集&#xff0c;然后我試著寫一下&#xff0c;很尷尬&#xff0c;由于長時間沒有寫過代碼&#xff0c;一開始數組是如何定義的給忘了。當時我說了我的思路&#xff0c;不過也是很low的做法&#xff0c;查閱網上的一些資料&…

ADF聲明性組件示例

在我以前的文章中&#xff0c;我答應展示如何為智能值列表創建ADF聲明性組件。 因此&#xff0c;我將創建一個包含三個元素的組件&#xff1a;標簽&#xff0c;輸入文本和值的組合框列表。 那很容易。 我在工作空間中創建了一個單獨的ADF ViewController項目&#xff1a; 在此項…

VS2015 安裝包缺失(聯網安裝失敗)問題解決

Win7 x86 測試可行 * 如果前面有嘗試過安裝不成功, 一定要用卸載程序刪除已安裝的部分,否則會出亂子. 1. 或者是用虛擬光驅加載ISO, 或者是解壓到硬盤上, 都沒有關系. 2. 用管理員權限啟動CMD控制臺, 進入VS2015 安裝盤的根目錄 (vs_enterprise.exe 所在的目錄). 3. 執行命令 …

java藍橋暑假班_Java實現 藍橋杯VIP 算法提高 班級排名

算法提高 班級排名時間限制&#xff1a;1.0s 內存限制&#xff1a;256.0MB問題描述達達在陶陶的影響下&#xff0c;也對學習慢慢的產生了興趣。他在每次考試之后&#xff0c;都會追著老師問&#xff0c;自己在班級的總名次是多少。考試一多&#xff0c;老師也不耐煩了&#xff…

$.ajax所犯的錯誤。success后面不執行

$.ajax({ type: post, url: ../AshxHandler/HandlerAddPhoto.ashx, data: { clientPath: photoName }, dataType: text, cache: false, success: function (data) { alert(1); }, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(上傳圖片出現錯誤&#xf…

WhateverOrigin –與Heroku和Play對抗相同的原產地政策! 構架

不久前&#xff0c;我在編碼 Bitcoin Pie時發現需要克服臭名昭著的Same Origin Policy &#xff0c;該政策限制了運行在客戶端瀏覽器上的javascript可以訪問的域。 通過Stack Overflow&#xff0c;我找到了一個名為Any Origin的站點&#xff0c;這基本上是無需設置專用服務器即…