版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、1. spring mvc 學(xué)習(xí)案例 標(biāo)簽: springmvcservletstringweb服務(wù)hashmap 2012-03-28 10:14 2048人閱讀 評論(0) 收藏 舉報(bào) spring mvc學(xué)習(xí)指南以下這個(gè)學(xué)習(xí)案例是我最近學(xué)習(xí)spring mvc時(shí)跟從一本書上的示例,原文中的示例代碼有一些小錯(cuò)誤,不過我在調(diào)試的過程中已經(jīng)給予了修正,如還有其它錯(cuò)誤,還請各位批評指正。對于現(xiàn)有較成熟的model-view-control(mvc)框架而言,其解決的主要問題無外乎下面幾部分:1 將web頁面中的輸入元素封裝為一個(gè)(請求)數(shù)據(jù)對象。2 根據(jù)請求的不同,調(diào)度相應(yīng)的邏輯處理單元,并將(
2、請求)數(shù)據(jù)對象作為參數(shù)傳入。3 邏輯處理單元完成運(yùn)算后,返回一個(gè)結(jié)果數(shù)據(jù)對象。4 將結(jié)果數(shù)據(jù)對象中的數(shù)據(jù)與預(yù)先設(shè)計(jì)的表現(xiàn)層相融合并展現(xiàn)給用戶。各個(gè)mvc實(shí)現(xiàn)固然存在差異,但其中的關(guān)鍵流程大致如上。結(jié)合一個(gè)實(shí)例,我們來看看這幾個(gè)關(guān)鍵流程在spring mvc框架中的處理手法。下面的實(shí)例,實(shí)現(xiàn)了一個(gè)常見的用戶登錄邏輯,即用戶通過用戶名和密碼登錄,系統(tǒng)對用戶名和密碼進(jìn)行檢測,如果正確,則在頁面上顯示幾條通知信息。如果登錄失敗,則返回失敗界面。(示例中,表示層以jsp2.0實(shí)現(xiàn)。)出于簡潔考慮,這里的“用戶名/密碼”檢測以及通知信息的生成均在代碼中以硬編碼實(shí)現(xiàn)。首先來看登錄界面:對應(yīng)的index.ht
3、ml:登錄用戶名:密 碼:很簡單的一個(gè)登錄界面,其中包含了一個(gè)用以輸入用戶名密碼的form,針對此form的提交將被發(fā)送到login.domvc關(guān)鍵流程的第一步,即收集頁面輸入?yún)?shù),并轉(zhuǎn)換為請求數(shù)據(jù)對象。這個(gè)靜態(tài)頁面提供了一個(gè)基本的輸入界面,下面這些輸入的數(shù)據(jù)將被發(fā)送至何處,將如何被轉(zhuǎn)換為請求數(shù)據(jù)對象?現(xiàn)在來看接下來發(fā)發(fā)生的事情:當(dāng)用戶輸入用戶名密碼提交之后,此請求被遞交給web服務(wù)器處理,上面我們設(shè)定form提交目標(biāo)為login.do,那么web服務(wù)器將如何處理這個(gè)請求?顯然,標(biāo)準(zhǔn)http協(xié)議中,并沒有以.do為后綴的服務(wù)資源,這是我們自己定義的一種請求匹配模式。此模式在web.xml中設(shè)定
4、:dispatcherorg.springframework.web.servlet.dispatcherservletcontextconfiglocation/web-inf/config.xmldispatcher*.doservlet定義這里我們定義了請求分發(fā)servlet,即:org.springframework.web.servlet.dispatcherservletdispatcherservlet是spring mvc中負(fù)責(zé)請_求調(diào)度的核心引擎,所有的請求將由此servlet根據(jù)配置分發(fā)至各個(gè)邏輯處理單元。其內(nèi)部同時(shí)也維護(hù)了一個(gè)applicationcontext實(shí)例。我們
5、在節(jié)點(diǎn)中配置了名為“contextconfiglocation”的servlet參數(shù),此參數(shù)指定了spring配置文件的位置“/web-inf/config.xml”。如果忽略此設(shè)定,則默認(rèn)為“/web-inf/-servlet.xml”,其中以servlet名替換(在當(dāng)前環(huán)境下,默認(rèn)值也就是“/web-inf/dispatcher-servlet.xml)。 請求映射我們將所有以.do結(jié)尾的請求交給spring mvc進(jìn)行處理。當(dāng)然,也可以設(shè)為其他值,如.action、.action等。通過以上設(shè)定,web服務(wù)器將把登錄界面提交的請求轉(zhuǎn)交給dispatcher處理,dispatcher將提取
6、請求(httpservletrequest)中的輸入數(shù)據(jù),分發(fā)給對應(yīng)的處理單元,各單元處理完畢后,將輸出頁面返回給web服務(wù)器,再由web服務(wù)器返回給用戶瀏覽器。dispatcher根據(jù)什么分發(fā)這些請求?顯然,我們還需要一個(gè)配置文件加以設(shè)定。這也就是上面提及的config.xml,此文件包含了所有的“請求/處理單元”關(guān)系映射設(shè)定,以及返回時(shí)表現(xiàn)層的一些屬性設(shè)置。org.springframework.web.servlet.view.jstlview/web-inf/view/.jsploginactionnet.xiaxin.action.logininfologinfailmainreso
7、lver設(shè)定resolver將把輸出結(jié)果與輸出界面相融合,為表現(xiàn)層提供呈現(xiàn)資源。view resolver的viewclass參數(shù)這里我們使用jsp頁面作為輸出,因此,設(shè)定為:org.springframework.web.servlet.view.jstlview其余可選的viewclass還有:org.springframework.web.servlet.view.freemarker.freemarkerview(用于基于freemarker模板的表現(xiàn)層實(shí)現(xiàn))org.springframework.web.servlet.view.velocity.velocityview(用于基于v
8、elocity模板的表現(xiàn)層實(shí)現(xiàn))等。view resolver的prefix和suffix參數(shù)指定了表現(xiàn)層資源的前綴和后綴,運(yùn)行時(shí),spring將為指定的表現(xiàn)層資源自動(dòng)追加前綴和后綴,以形成一個(gè)完整的資源路徑。另參見 “請求/處理單元”關(guān)系映射可以看到,這里我們將“/login.do”請求映射到處理單元loginaction。節(jié)點(diǎn)下可以有多個(gè)映射關(guān)系存在,目前我們只定義了一個(gè)。loginaction定義這里定義了邏輯處理單元loginaction的具體實(shí)現(xiàn),這里,loginaction的實(shí)現(xiàn)類為net.xiaxin.action.loginaction。loginaction的請求數(shù)據(jù)對象co
9、mmandclass參數(shù)源于loginaction的基類basecommandcontroller,basecommandcontrolle包含了請求數(shù)據(jù)封裝和驗(yàn)證方法(basecommandcontroller.bindandvalidate) , 它將根據(jù)傳入的httpservletrequest構(gòu)造請求數(shù)據(jù)對象。這里我們指定commandclass為net.xiaxin.action.logininfo,這是一個(gè)非常簡單的java bean,它封裝了登錄請求所需的數(shù)據(jù)內(nèi)容:public class logininfo private string username;private str
10、ing password;public string getpassword() return password;public void setpassword(string password) this.password = password;public string getusername() return username;public void setusername(string username) this.username = username;spring會(huì)根據(jù)loginaction的commandclass定義自動(dòng)加載對應(yīng)的logininfo實(shí)例。之后,對http請求中的參
11、數(shù)進(jìn)行遍歷,并查找logininfo對象中是否存在與之同名的屬性,如果找到,則將此參數(shù)值復(fù)制到logininfo對象的同名屬性中.請求數(shù)據(jù)轉(zhuǎn)換完成之后,我們得到了一個(gè)封裝了所有請求參數(shù)的java對象,并將此對象作為輸入?yún)?shù)傳遞給loginaction。返回視圖定義對于這里的loginaction而言,有兩種返回結(jié)果,即登錄失敗時(shí)返回錯(cuò)誤界面,登錄成功時(shí)進(jìn)入系統(tǒng)主界面。對應(yīng)我們配置了fail_view、success_view兩個(gè)自定義參數(shù)。參數(shù)值將由resolver進(jìn)行處理,為其加上前綴后綴,如對于fail_view而言,實(shí)際的視圖路徑為/web-inf/view/loginfail.jsp。
12、之后,resolver會(huì)將loginaction的返回?cái)?shù)據(jù)與視圖相融合,返回最終的顯示界面。業(yè)務(wù)邏輯處理單元:loginaction.java:public class loginaction extends simpleformcontroller private string fail_view;private string success_view;protected modelandview onsubmit(object cmd,bindexception ex)throws exception logininfo logininfo = (logininfo) cmd;hashma
13、p result_map = new hashmap();if (login(logininfo) = 0) result_map.put(logininfo, logininfo);list msglist = new linkedlist();msglist.add(msg1);msglist.add(msg2);msglist.add(msg3);result_map.put(messages, msglist);return newmodelandview(this.getsuccess_view(), result_map); else result_map.put(failmsg,
14、 new string(sorry, you input the wrong username or password!);return new modelandview(this.getfail_view(), result_map);private int login(logininfo logininfo) if (erica.equalsignorecase(logininfo.getusername()& mypass.equals(logininfo.getpassword() return 0;return 1;public string getfail_view() retur
15、n fail_view;public string getsuccess_view() return success_view;public void setfail_view(string string) fail_view = string;public void setsuccess_view(string string) success_view = string;其中:onsubmit方法我們在子類中覆蓋了父類的onsubmit方法;而onsubmit方法用于處理業(yè)務(wù)請求。負(fù)責(zé)數(shù)據(jù)封裝和請求分發(fā)的dispatcher,將對傳入的httpservletrequest進(jìn)行封裝,形成請求數(shù)
16、據(jù)對象,之后根據(jù)配置文件,調(diào)用對應(yīng)業(yè)務(wù)邏輯類的入口方法(這里就是loginaction)的onsubmit()方法,并將請求數(shù)據(jù)對象及其他相關(guān)資源引用傳入。protected modelandview onsubmit(object cmd,bindexception ex)onsubmit方法包含了兩個(gè)參數(shù):object cmd和bindexception ex。前面曾經(jīng)多次提到請求數(shù)據(jù)對象,這個(gè)名為cmd的object型參數(shù),正是傳入的請求數(shù)據(jù)對象的引用。bindexception ex參數(shù)則提供了數(shù)據(jù)綁定錯(cuò)誤的跟蹤機(jī)制。它作為錯(cuò)誤描述工具,用于向上層反饋錯(cuò)誤信息。在spring mvc中
17、,bindexception將被向上層表現(xiàn)層反饋,以便在表現(xiàn)層統(tǒng)一處理異常情況(如顯示對應(yīng)的錯(cuò)誤提示),這一機(jī)制稍后在“輸入?yún)?shù)合法性校驗(yàn)”部分再具體探討。onsubmit還有另外一個(gè)簽名版本:protected modelandview onsubmit(httpservletrequest request,httpservletresponse response,object cmd,bindexception ex)可以看到,類似servlet的doget/dopost方法,此版本的onsubmit方法簽名中包含了servlet規(guī)范中的httpservletrequest、httpser
18、vletresponse以提供與web服務(wù)器的交互功能(如session的訪問)。此參數(shù)類型的onsubmit方法的調(diào)用優(yōu)先級較高。也就是說,如果我們在子類中同時(shí)覆蓋了這兩個(gè)不同參數(shù)的onsubmit方法,那么只有此版本的方法被執(zhí)行,另一個(gè)將被忽略。將輸入的請求數(shù)據(jù)對象強(qiáng)制轉(zhuǎn)型為預(yù)定義的請求對象類型。返回處理結(jié)果modelandview類包含了邏輯單元返回的結(jié)果數(shù)據(jù)集和表現(xiàn)層信息。modelandview本身起到關(guān)系保存的作用。它將被傳遞給dispatcher,由dispatcher根據(jù)其中保存的結(jié)果數(shù)據(jù)集和表現(xiàn)層設(shè)定合成最后的界面。這里我們用到了兩種簽名版本的modelandview構(gòu)造方法
19、:public modelandview(string viewname)返回界面無需通過結(jié)果數(shù)據(jù)集進(jìn)行填充。public modelandview(string viewname, map model)返回界面由指定的結(jié)果數(shù)據(jù)集加以填充??梢钥吹剑Y(jié)果數(shù)據(jù)集采用了map接口實(shí)現(xiàn)的數(shù)據(jù)類型。其中包含了返回結(jié)果中的各個(gè)數(shù)據(jù)單元。關(guān)于結(jié)果數(shù)據(jù)集在界面中的填充操作,可參見下面關(guān)于返回界面的描述。上面這兩個(gè)版本的構(gòu)造子中,通過viewname指定了表示層資源。另外,我們也可以通過傳遞view對象指定表示層資源。public modelandview(view view)public modelandv
20、iew(view view, map model)我們可以結(jié)合redirectview完成轉(zhuǎn)向功能,如:return new modelandview(new redirectview(“/redirected.jsp”);當(dāng)然,我們也可以在帶有httpservletrequest參數(shù)的onsubmit方法實(shí)現(xiàn)中,通過httpservletrequest/httpservletresponse完成forward/redirect功能,這兩種途徑可以達(dá)到同樣的效果。最后,來看返回界面:錯(cuò)誤返回界面loginfail.jsp只是個(gè)純html文件(為了與view resolver中設(shè)定的后綴相匹配,
21、因此以.jsp作為文件后綴),這里就不再浪費(fèi)篇幅。再看成功登錄后的頁面main.jsp:界面顯示效果如下:login success!current user:your current messages:*$item登錄失敗后的頁面loginfail.jsp:login fail!頁面邏輯非常簡單,首先顯示當(dāng)前登錄用戶的用戶名。然后循環(huán)顯示當(dāng)前用戶的通知消息“messages”。如果當(dāng)前循環(huán)索引為奇數(shù),則在消息前追加一個(gè)“*”號(這個(gè)小特性在這里似乎有些多余,但卻為不熟悉jstl的讀者提供了如何使用jstl core taglib進(jìn)行循環(huán)和邏輯判斷的樣例)。實(shí)際上這只是個(gè)普通jstl/jsp頁
22、面,并沒有任何特殊之處,如果說有些值得研究的技術(shù),也就是其中引用的jstl core taglib上面這句話申明了頁面中所引用的taglib,指定其前綴為“c”,也就是說,在頁面中,所有以“c”為前綴,形同的節(jié)點(diǎn)都表明是此taglib的引用,在這里,也就是對jstlcore lib的引用。這里需要注意的是,筆者所采用的web容器為tomcat 5(支持servlet 2.4/jsp2.0規(guī)范)以及apache jstl 2.0(/taglibs/index.html)。將value中的內(nèi)容輸出到當(dāng)前位置,這里也就是把logininfo對象的use
23、rname屬性值輸出到頁面當(dāng)前位置。$是jsp2.0中的expression language(el)的語法。它定義了一個(gè)表達(dá)式,其中的表達(dá)式可以是一個(gè)常量(如上),也可以是一個(gè)具體的表達(dá)語句(如foreach循環(huán)體中的情況)。典型案例如下:$logininfo.username這表明引用logininfo對象的username屬性。我們可以通過“.”操作符引用對象的屬性,也可以用“”引用對象屬性,如$logininfousername與$logininfo.username達(dá)到了同樣的效果?!啊币梅绞降囊饬x在于,如果屬性名中出現(xiàn)了特殊字符,如“.”或者“-”,此時(shí)就必須使用“”獲取屬性值以
24、避免語法上的沖突(系統(tǒng)開發(fā)時(shí)應(yīng)盡量避免這一現(xiàn)象的出現(xiàn))。與之等同的jsp script大致如下:logininfo logininfo =(logininfo)session.getattribute(“l(fā)ogininfo”);string username = logininfo.getusername();可以看到,el大大節(jié)省了編碼量。這里引出的另外一個(gè)問題就是,el將從哪里找到logininfo對象,對于$logininfo.username這樣的表達(dá)式而言,首先會(huì)從當(dāng)前頁面中尋找之前是否定義了變量logininfo,如果沒有找到則依次到request、session、application范圍內(nèi)尋找,直到找到為止。如果直到最后依然沒有找到匹配的變量,則返回null.如果我們需要指定變量的尋找范圍,可以在el表達(dá)式中指定搜尋范圍:$pagescope.logininfo.username$requestscope.logininfo.username$sessionscope.logininfo.username$applicationscope.logininfo.username在spring中,所有邏輯處理單元返回的結(jié)果數(shù)據(jù),都將作為attribute被放置到httpservletreque
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2026云南臨滄市耿馬自治縣人民檢察院聘用制書記員招錄3人備考題庫及參考答案詳解一套
- 2026安徽合肥技師學(xué)院招聘勞務(wù)外包輔助教學(xué)教師10人備考題庫及完整答案詳解
- 2026上半年云南事業(yè)單位聯(lián)考德宏師范學(xué)院招聘碩士研究生及以上人員9人備考題庫及1套參考答案詳解
- 2026年湖北荊州市市直事業(yè)單位人才引進(jìn)254人備考題庫及完整答案詳解一套
- 2026陜西寶雞三和職業(yè)學(xué)院人才招聘66人考試參考試題及答案解析
- 2026年宣城市宣州區(qū)事業(yè)單位統(tǒng)一公開招聘工作人員30名參考考試題庫及答案解析
- 2026年上半年黑龍江事業(yè)單位聯(lián)考大興安嶺地區(qū)招聘186人備考題庫及答案詳解1套
- 2025河南國宏貿(mào)易發(fā)展集團(tuán)招聘2人備考題庫及一套參考答案詳解
- 2026中國人保資產(chǎn)管理有限公司博士后科研工作站招聘備考題庫帶答案詳解
- 2026年黃陂區(qū)教育局聘用制教師公開招聘27人備考題庫及1套參考答案詳解
- 《市場營銷(第四版)》中職完整全套教學(xué)課件
- (正式版)DB61∕T 2121-2025 《風(fēng)力發(fā)電場集電線路設(shè)計(jì)規(guī)范》
- 疑難病例討論制度落實(shí)常見問題與改進(jìn)建議
- 創(chuàng)傷性脾破裂的護(hù)理
- 蓬深102井鉆井工程(重新報(bào)批)項(xiàng)目環(huán)境影響報(bào)告表
- 大模型金融領(lǐng)域可信應(yīng)用參考框架
- (新教材)2025年人教版七年級上冊歷史期末復(fù)習(xí)常考知識點(diǎn)梳理復(fù)習(xí)提綱(教師版)
- 中國全色盲診療專家共識2026
- 中國地質(zhì)大學(xué)武漢本科畢業(yè)論文格式
- 鋼鐵工藝流程課件
- 自流平地面施工安全方案
評論
0/150
提交評論