




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
我們所學(xué)習(xí)的技術(shù)框架有很多,例如struts1,struts2、JSF、Spring、SpringMVC、Hibernate、
ibatis?…在上篇博客我說了我們可能在開發(fā)的路途上會要學(xué)習(xí)這些框架,我也給出了我對框
架學(xué)習(xí)的幾點(diǎn):
屬于哪一層
提供什么服務(wù)
利用框架可以做什么
怎么學(xué)習(xí)框架衿
1.設(shè)“思路和執(zhí)行流桿
熟練掌握使用
-'-____________
類比法,編織知識網(wǎng)
我們首先要看一下這個框架屬于開發(fā)結(jié)構(gòu)中的那?層。因?yàn)槲覀兊拈_發(fā)都是要用分層
的思想來做的,所以我們第一個就要看看我們開發(fā)分層中,各個層次之間有哪些框架。
我們從圖上看到了那些框架屬于哪一層的(這里還有很多框架沒有涉及到)。之后我
們來看一些常用的框架(這個常用相對于個人而言,我這里所說的常用針對我自己來說,如
果這里我沒有介紹全的話,大家可以到相關(guān)的框架官網(wǎng)去查閱一下資料自主學(xué)習(xí))。
下面我就簡單的介紹?些我經(jīng)常使用的框架的結(jié)構(gòu)和一些分析:
Struts框架(分為struts1和struts2):
一、Struts框架結(jié)構(gòu)圖:
優(yōu)點(diǎn):
LStruts框架是一個基于mvc的框架,所以它繼承了所有mvc的優(yōu)點(diǎn),例如:復(fù)用
性好,團(tuán)隊(duì)開發(fā)分工明確,結(jié)構(gòu)層次分明等
2.給程序開發(fā)者在servlet層上節(jié)約了大量的開發(fā)時間,應(yīng)用程序開發(fā)者不再去觸及
大量的servlet的編寫,僅僅變換為配置文件。
二、Struts1框架
1.框架的結(jié)構(gòu)圖:
2.StnHsl框架有五個常用對象:actionservlet>actionmappingactionform>action>
actionforward
a)Actionservlet是核心控制,URL地址映射、ActionFonn的匹配、Action的
執(zhí)行都需要這個類來進(jìn)行導(dǎo)航
b)Actionmapping:它們可將請求URI映射到Action類,并且將Action類與
ActionFormbean相關(guān)聯(lián)
c)Actionfonn:收集表單數(shù)據(jù)
d)Action:完成所需的業(yè)務(wù)邏輯,確定要跳轉(zhuǎn)的頁面
e)Actionforward:用來封裝轉(zhuǎn)發(fā)路徑的
3.Struts1框架的執(zhí)行流程:
1)檢索和用戶匹配的ActionMapping實(shí)例,如果不存在,就返回請求路徑無效的錯
誤信息
2)如果ActionForm實(shí)例不存在,就創(chuàng)建一個ActionForm的對象,把客戶提交的表單
數(shù)據(jù)封裝到ActionForm對象中。
3)根據(jù)配置信息決定是否要進(jìn)行表單驗(yàn)證,如果需要,就調(diào)用ActionForm的validate()
方法
4)如果validate。方法放回null,或者并不包含ActionMessage的ActionError對象,就
表示驗(yàn)證成功
5)ActionServlet根據(jù)ActionMapping所包含的映射信息決定將請求轉(zhuǎn)發(fā)給那個action,
如果相應(yīng)的action實(shí)例不存在,就先創(chuàng)建這個action對象,然后再調(diào)用這個action的excute()
方法
6)action的execute。方法返回一個ActionForword對象,ActionServlet會把客戶請求
轉(zhuǎn)發(fā)給ActionForword對象所指向的JSP組件
7)ActionForword對象指向JSP組件生成動態(tài)網(wǎng)頁返回給客戶
actstruts^/
春戶■?應(yīng)
4.優(yōu)點(diǎn):和struts框架的優(yōu)點(diǎn)相同
5.缺點(diǎn):
1)表現(xiàn)層技術(shù)單一:僅能用jsp
2)與servletAPI耦合性高,難于測試(httpservletrequest,httpservletresponse)
3)嚴(yán)重依賴于ServletAPI(繼承action,繼承actionform).與struts1框架耦合
性太高
這篇博客就寫到這里,如果再寫篇幅可能會過長,對讀者的閱讀造成負(fù)面影響,所以
我會在下面的博客中陸續(xù)介紹我經(jīng)常使用的框架,當(dāng)然我也會在這些同層之間的框架的分析
中加入各個框架的區(qū)別,當(dāng)然在適當(dāng)?shù)牡胤綍嬕恍﹫D片來表示他們之間的知識關(guān)聯(lián)性,希
望讀者能夠我一些建議和意見。
在上篇博客中,我簡單的介紹了我們分層開發(fā)中每一層中擁有的框架,而且介
紹了我常用的框架strutsl的結(jié)構(gòu)和原理分析,那么今天我繼續(xù)介紹我熟悉的框
架struts2的框架的結(jié)構(gòu)和原理分析。
在說struts2框架之前,我要先介紹另外一個框架webwork框架,這個框架
也是一個mvc的框架,這個框架的設(shè)計(jì)思路是采用攔截鏈將用戶的請求的數(shù)據(jù)
轉(zhuǎn)發(fā)到Action中,并負(fù)責(zé)將Action的處理結(jié)果轉(zhuǎn)換成對用戶的響應(yīng)。它的這種
設(shè)計(jì)思路能夠和ServletAPI分離,鑒于我們的上篇博客介紹的strutsl的缺點(diǎn),所
以webwork框架解決了strutsl的這個缺點(diǎn)。
我們來看一下webwork框架的結(jié)構(gòu)圖:
HTTP遣求
WebWorkActionContextCleanUp
其他過流IB(如SitcMeth等)
WubWork的核心控瓶器:ScrvIctDitpatcher
Action
WabWcsk
,如HTMUfonn?
等*".一?
‘.”理肘"率
xwork.xml
視圖模板》I
-JSP
顛色含義,_FreeMarker
Servletilitil一等等
I開發(fā)者定義文存
有了這個流程圖,我就不給大家講解具體的原理流程了,它采用的是攔截鏈
的機(jī)制,通過這些攔截鏈完成用戶的相應(yīng)請求,從而與servletAPI分離,當(dāng)與
servlet分離開的時候,也就是表明和容器解耦了;另外,我們從結(jié)構(gòu)圖中看到它
的視圖模版有jsp、FreeMarker等等,它的表示層技術(shù)比struts1框架的飽滿許多。
所以,webwork框架解決了strutsl框架存在的問題,而且它的設(shè)計(jì)思路是
非常好的,鑒于此,struts2框架就在strutsl框架的基礎(chǔ)上引入了webwork框架
的設(shè)計(jì)思路應(yīng)運(yùn)而生了。所以我們就能夠發(fā)現(xiàn)struts2兼具strutsl的特性而且通
過引入webwork框架的設(shè)計(jì)思路解決了strutsl的一些缺點(diǎn)。
struts2框架的大致的體系圖:
◎Struts2的大致體系圖
客戶端
從圖中我們能夠看出它是引入的webwork框架的設(shè)計(jì)思路,而且它也是基
于mvc的一個開源的框架。之后我們來說一下struts2框架的一個執(zhí)行流程(流
程圖和webwork框架非常類似):
Struts2Architecture(HttpSeMetRequest
ActionContextCleanUp
OtherFilters(SiteMesh,etc)
FilterDispatcher
X/
ActionMapper
義Interceptor1)
Action。喇eptor,
invocation(Interceptor3)間Subsystem
HTML,Dojo,Forms,etc
Action
Result
Template
Interceptor3JSP,FreeMarker,
Interceptor2
Interceptor1
XHttpSen/letRespon^)-
(2)ServletFilters(2)CoreInterceptors(2)UserCreated
1.瀏覽器發(fā)送請求,通過幾層過濾器完成一些功能,之后到actionmapper
中,之后將請求傳到核心控制器中
2.核心控制器filterDispatcher根據(jù)請求決定調(diào)用合適的Action
3.調(diào)用webwork的攔截器鏈自動請求通用功能,如校驗(yàn)之類的操作
4.回調(diào)action的execute方法,獲取用戶請求執(zhí)行相應(yīng)的業(yè)務(wù)邏輯
5.之后返回字符串,匹配result,之后跳轉(zhuǎn)到相應(yīng)的視圖或其他的文檔
6.之后在執(zhí)行相應(yīng)的攔截器鏈自動請求功能,隨后轉(zhuǎn)到web客戶端。
這樣我們就對struts2框架的結(jié)構(gòu)上的東西做了一個簡單的介紹。在上篇博
客講解了strutsl框架,所以有必要在這里對他倆進(jìn)行一下對比(我僅僅總結(jié)了
五條我認(rèn)為比較重要的,以后如果發(fā)現(xiàn)其他的在隨時補(bǔ)充):
1.在Action實(shí)現(xiàn)類方面的對比(strutsl的Action繼承action,struts2
實(shí)現(xiàn)接口,也可以不實(shí)現(xiàn),可以定制服務(wù))
2.線程模式方面的對比(strutsl存在線程安全問題,struts2不存在)
3.ServletAPI依賴方面的對比(strutsl依賴servletAPI,struts2不是)
4.可測性方面的對比(strutsl難測試,依賴容器,struts2不是)
5.封裝請求參數(shù)的對比(strutsl使用actionform;struts2直接寫到
action,并且支持pojo對象)
在上篇博客中介紹了struts2框架的原理和流程分析,可以說struts框架一路走
來,改變非常大,而且讓我們開發(fā)人員變得更加輕松,里面的設(shè)計(jì)理念的改變也
是讓我們編程人員的思路得到更大的擴(kuò)展。
?
\Strutsl框架〕IWebWork框架?1
strutsl框架
到struts2福架在進(jìn)步-——->)
struts2框架在基礎(chǔ)上引進(jìn)\/
webwork福架好的設(shè)■思路?__.
基質(zhì)實(shí)現(xiàn)1設(shè)計(jì)電路
????
????
[Struts2框架|
'J
\/
可以說,一個先進(jìn)的技術(shù)或者框架就是要不斷的進(jìn)步才能永遠(yuǎn)讓編程人
員喜歡和使用,一個優(yōu)秀的編程人員也是要不斷的進(jìn)步才能永遠(yuǎn)讓這個世界變得
更加絢麗多彩。
其實(shí)編程就是這樣有意思的!
前面說了一些宏觀上學(xué)習(xí)框架相關(guān)的思想方面的東西,下面繼續(xù)來介紹我經(jīng)
常使用的框架和框架的分析,這篇博客主要介紹的是hibernate框架。
首先說hibernate框架是數(shù)據(jù)持久層的框架,這個框架是非常強(qiáng)大的,它讓
編程人員純粹的用面向?qū)ο蟮姆绞絹碜鲩_發(fā),讓編程人員所面對的都是對象。僅
僅從這一點(diǎn)它的設(shè)計(jì)思路就是非常讓編程人員喜愛的。
回想我們普通的開發(fā)流程,和客戶溝通定需求,抽象出來原型,從原型中建
立數(shù)據(jù)模型到庫表結(jié)構(gòu)的建立,之后在映射成對象模型,之后在用00的設(shè)計(jì)思
想完成后續(xù)的程序開發(fā)。但是當(dāng)我們使用了hibernate框架以后,原先的設(shè)計(jì)思
路就顯得不再那么具有優(yōu)勢了。我們直接建立對象模型,之后利用hibernate框
架映射成數(shù)據(jù)模型,我們不再去考慮數(shù)據(jù)庫關(guān)系模型的東西,僅僅考慮的東西僅
僅就是類和對象,這樣的開發(fā)才是面向?qū)ο蟮拈_發(fā),也才是最接近人類思考問題
的方式。所以hibernate框架的設(shè)計(jì)思路是非常好的。
hibernate框架設(shè)計(jì)思路的優(yōu)越性其實(shí)體現(xiàn)在了它本身的框架的原理上。
hibernate封裝了JDBC,減輕了開發(fā)人員在持久層的大量重復(fù)性工作,它利用了
java反射機(jī)制來實(shí)現(xiàn)程序的透明性;它就是通過這兩點(diǎn)才達(dá)到從對象出發(fā)而非
關(guān)系數(shù)據(jù)庫出發(fā)的效果。
介紹這么多理論性的東西之后我們能夠感覺到hibernate框架的強(qiáng)大,來看看
它的結(jié)構(gòu)圖:
Busingsluiycr
Interceptor
UserType
PersistenceLayer|Session卜actory
SessionTransactionQueryFt'onfiguration
JNDIJDBCJTA
在hibernate框架中有幾個比較重要的接口和類:
1.Query接口:Query負(fù)責(zé)執(zhí)行各種數(shù)據(jù)庫查詢。它可以使用HQL語句或
SQL語句兩種表達(dá)方式。
2.Configuration類:Configuration類負(fù)責(zé)配置并啟動Hibernate,創(chuàng)建
SessionFactory對象
3.SessionFactory接口:SessionFactory接口負(fù)責(zé)初始化Hibernate。它
充當(dāng)數(shù)據(jù)存儲源的代理,并負(fù)責(zé)創(chuàng)建Session對象
4.Session接口:Session接口負(fù)責(zé)執(zhí)行被持久化對象的CRUD操作
5.Transaction接口:Transaction接口負(fù)責(zé)事務(wù)相關(guān)的操作
hibernate框架就是在利用這幾個接口來封裝了JDBC,而且我們用這些接口
來操作數(shù)據(jù)庫變得非常簡單,減少了我們在持久層的代碼量。
從這個結(jié)構(gòu)圖和我的一些分析就能發(fā)現(xiàn)hibernate框架是非常強(qiáng)大,而且它
給我們開發(fā)人員的開發(fā)帶來了非常大的便利,尤其是他的設(shè)計(jì)思路還有它的“全
自動”的映射對象模型和關(guān)系模型。
但是hibernate框架也有它的一些缺點(diǎn):
1.既然是封裝了JDBC,所以很明顯它沒有JDBC的效率高,尤其是在大量的
處理表更新操作的時候。
2,它有局限性,一個持久化類不能映射多個表
3.它應(yīng)對大數(shù)量的時候顯得非常笨拙,這一點(diǎn)沒有JDBC和接下來要介紹的
IBatis框架
其實(shí)一項(xiàng)技術(shù)或者一個框架都有它的優(yōu)缺點(diǎn),選擇最合適的才是王道。
這篇博客主要是介紹了hibernate框架的結(jié)構(gòu)和分析,闡述了hibernate框架
的優(yōu)缺點(diǎn),【具體詳細(xì)使用要等到我的框架學(xué)習(xí)的后續(xù)文章】??偟膩碚fhibernate
框架在持久層的作用非常明顯,我們懂得了它的優(yōu)缺點(diǎn)之后,才能做到我們是否
是要選擇這個框架作為我們持久層開發(fā)的必須的技術(shù)支撐,所以這些我常用的框
架結(jié)構(gòu)和分析不單單是在介紹一些框架學(xué)習(xí)的宏觀知識把控,更多的是在為將來
做項(xiàng)目開發(fā)中選擇合適的技術(shù)支撐做鋪墊。
后續(xù)的博客在不斷更新,希望這些博客能夠?qū)ψx者的開發(fā)過程帶來幫助,當(dāng)然如
果讀者對我的博客有什么好的建議或者意見,請與我聯(lián)系。聯(lián)系方式見博客側(cè)邊
欄!
先看MVC模式流程圖(其實(shí)MVC設(shè)計(jì)模式就是java中的model2o):
WEB客戶端Servlet業(yè)務(wù)邏輯JSP
RequestQ,
霰再合敢0M層(Model)V層
C層(Control
)
ResponseQ
I
就像圖上所標(biāo)識的C層主要是Servlet層控制頁面跳轉(zhuǎn),M層就
是具體的業(yè)務(wù)處理邏輯,而JSP就是所謂的V層。MVC是有別于我們
所說的三層,我們平常所說的三層是UI層、BLL層、DAL層,具體的
區(qū)別如圖:
WEB客戶端JSPBLL層
request。UI層
再弓BLLWO
u
□
?
從圖上能看出來,JSP和Servlet構(gòu)成了UI層,而Model層分成了
BLL層和DAL層(也就是業(yè)務(wù)邏輯利數(shù)據(jù)持久層)。
從理論上認(rèn)清了MVC設(shè)計(jì)模式之后,下面開始動手敲一個MVC
設(shè)計(jì)模式示例代碼:
JSP索引頁面index.jsp:
viewplaincopy
print?
1.<%@pagelanguage=*'java"contentType=*'text/html;charset=GB18030,1
2.pageEncoding=*'GB18030n%>
3.<?DOCTYPEhtmlPUBLIC”-//W3C//DTDHTML4.01Transitional//ENnHhttp:/
/www.w3.org/TR/html4/loose.dtdn>
4.<html>
5.<head>
6.<metahttp-equiv=nContent-Typecontent="text/html;charset=GB18030M>
7.<title>Inserttitlehere</title>
8.</head>
9.<body>
10.<formaction=Hservlet/addUser.actionnmethod=npostn>
11.姓名:<inputtype=ntextnname=1'2**567*91011username">
12.<inputtype=nsubmit"value="提交”〉
13.</form>
14.
15.</body>
16.</html>
業(yè)務(wù)邏輯代碼UserManager:
:ava]viewplaincopy
print?
1.packagecom.cjq.servlet;
2.
3.importjava.util.ArrayList;
4.importjava.util.List;
5.
6.publicclassUserManager{
7.
8.publicvoidaddUser(Stringusername){
9.System.out.printin("UserManager.addUsre()>username:n+userna
me);
10.)
11.
12.publicvoiddelUser(Stringusername){
13.System.out.printIn("UserManager.delUser()>username:*'+userna
me);
14.}
15.
16.publicvoidmodifyUser(Stringusername){
17.System.out.printin("UserManager.modifyUser()-->usernamen+user
name);
18.)
19.
20.publicListqueryUser(Stringusername){
21.System,out.printin(**UserManager.queryUser()-->usernameH+usern
ame);
22.ListuserList=newArrayList();
23.userList.add(uan);
24.userList.add(Mbn);
25.userList.add(nc");
26.returnuserList;
27.)
28.}
Servlet控制代碼:
:ava]viewplaincopy
print?
1.packagecom.cjq.servlet;
2.
3.importjava.io.lOException;
4.importjava.util.List;
5.
6.importjavax.servlet.ServletException;
7.importjavax.servlet.http.HttpServlet;
8.importjavax.servlet.http.HttpServletRequest;
9.importjavax.servlet.http.HttpServletResponse;
10.
11.publicclassTestServletextendsHttpServlet
12.
13.
14.protectedvoiddoGet(HttpServletRequestrequest,HttpServletRespon
seresponse)
15.throwsServletException,lOException{
16.
17.StringrequestURI=request.getRequestURI();
18.System.out.printin("request=H+requestURI);
19.Stringpath=requestURI.substring(requestURI.indexOf(*'/",1)zreq
uestURI.indexOf('*."));
20.System.out.printIn("path-"+path);
21.
22.Stringusername=request.getParameter("usernamen);
23.UserManageruserManager=newUserManager();
24.//userManager.addUser(username);
25.Stringforward=n;
26.if(n/servlet/delUser'*.equals(path)){
27.userManager.delUser(username);
28.forward=,*/del_success.jspn;
29.}elseif("/servlet/addUser*'.equals(path)){
30.userManager.addUser(username);
31.forward=n/add_success.jspn;
32.}elseif("/servlet/modifyUsern.equals(path)){
33.userManager.modifyUser(username);
34.forward=n/modify__success.jspn;
35.}elseif("/servlet/queryUser',.equals(path)){
36.ListuserList=userManager.queryUser(username);
37.request.setAttribute("userListn,userList);
38.forward=**/query_success.jsp";
39.}else{
40.thrownewRuntimeException("請求失敗”);
41.}
42.request.getRequestDispatcher(forward).forward(request,respons
e
43.
44.}
這個servlet代碼主要實(shí)現(xiàn)的功能判斷是那個頁面請求服務(wù)器做
那些操作,之后調(diào)用業(yè)務(wù)邏輯實(shí)現(xiàn)相應(yīng)業(yè)務(wù)操作。
配置Servlet:
viewplaincopy
print?
1.<?xmlversion="l.0*'encoding="UTF-8”?>
2.<web-appxmlns:xsi=n/2001/XMLSchema-instance"xmlns=n
http://java.sun.com/xml/ns/javaee*,xmlns:web="http://java.sun.com/xml/
ns/javaee/web-app_2_5.xsdnxsi:schemaLocation=n/xml
/ns/javaee/xml/ns/javaee/web-app_3_0.xsdnid=*'WebA
pp_IDnversion=n3.0n>
3.<display-name>test_Servlet</display-name>
4.<welcome-file-list>
5.<welcome-file>index.html</welcome-file>
6.<welcome-file>index.htm</welcome-file>
7.<welcome-file>index.jsp</welcome-file>
8.<welcome-file>default.html</welcome-file>
9.<welcome-file>default,htm</welcome-file>
10.<welcome-file>default.jsp</welcome-file>
11.</welcome-file-list>
12.
13.<servlet>
14.<servlet-name>TestServlet</servlet-name>
15,<servlet-class>com.cjq.servlet.TestServlet</servlet-class>
16.</servlet>
17.<servlet-mapping>
18.<servlet-name>TestServlet</servlet-name>
19.<url-pattern>*.action</url-pattern>
20.</servlet-mapping>
21.
22.
23.</web-app>
輸出結(jié)果:
日Console漢',1Servers■X&l皆國
Tomcatv7.0Serveratlocalhost[ApacheTomcat)C:\ProgramFiles\JavaVeAbin^avaw.exe(2012-2-20下午7:39:25)
path?/servlet/addUser
UserManager.addl)sre()--->usernarae:ddd
通過上面的示例已經(jīng)對MVC設(shè)計(jì)模式有了初步的認(rèn)識,其實(shí)這
個示例是對Struts框架學(xué)習(xí)的基礎(chǔ),只有弄清楚了這個實(shí)例才能弄清楚
Struts框架的實(shí)現(xiàn)原理和Struts框架使用。
那么我們怎么才能通過這個示例引入Sti-uts框架呢?這個問題從
IF-Eles開始。
首先我們看到了TestServlet中出現(xiàn)了許多if-else語句,這樣是非
常不穩(wěn)定的,這樣的程序是非常不靈活的,以后如果有變化,那么維護(hù)
是非常差的;而且我們在if-else中出現(xiàn)了大量的字符串,這樣在coding
的時候會出現(xiàn)寫錯,這樣無形中給調(diào)試帶來了麻煩。所以去掉if-else成
了我們重構(gòu)的第一步,也是我們進(jìn)行Struts框架學(xué)習(xí)的第一步。
如何才能去掉If-ELSE呢?請看下一篇文章《深入淺出學(xué)習(xí)
Strutsl框架(二):重構(gòu)MVC模式代碼中跳轉(zhuǎn)路徑和業(yè)務(wù)邏輯》。
在上篇博文《深入淺出學(xué)習(xí)Strutsl框架(一):一個簡單mvc模式代
碼示例開始》中簡單說了一下MVC模式代碼的實(shí)現(xiàn)和MVC模式和三
層架構(gòu)的區(qū)別,并且留下一個問題一如何去掉TestServlet中的IF-Else
語句塊。
因?yàn)樵赥estServlet中出現(xiàn)了If-Else語句塊,所以讓程序變得不再
靈活,讓應(yīng)付需求變化時變得笨拙。所以就承接上篇文章來重構(gòu)一下
TestServlet代碼,主要是用繼承多肽來進(jìn)一?步對TestServlet進(jìn)行重構(gòu)。
雖然這一篇文章最后沒有將if-else徹底去掉,但是比起上篇文章的代碼
顯得更加靈活,也為下一篇徹底去掉If-else埋下伏筆。
下面進(jìn)入重構(gòu)階段:
先看一下上篇文章的TestServlet代碼:
「av日|viewplaincopy
print?
1.packagecom.cjq.servlet;
2.
3.importjava.io.lOException;
4.importjava.util.List;
5.
6.importjavax.servlet.ServletException;
7.importjavax.servlet.http.HttpServlet;
8.importjavax.servlet.http.HttpServletRequest;
9.importjavax.servlet.http.HttpServletResponse;
10.
11.publicclassTestServletextendsHttpServlet{
12.
13.
14.protectedvoiddoGet(HttpServletRequestrequest,HttpServletRespon
seresponse)
15.throwsServletException,lOException{
16.
17.StringrequestURI=request.getRequestURI();
18.System.out.printin(nrequest='*+requestURI);
19.StringpathrequestUR工.substring(requestURI.indexOf("/”,!.),req
uestURI.indexOf(;
20.System.out.printIn(,,path-u+path);
21.
22.Stringusername=request.getParameter("usernamen);
23.UserManageruserManager=newUserManager();
24.//userManager.addUser(username);
25.Stringforward=Hn;
26.if(',/servlet/delUser'*.equals(path)){
27.userManager.delUser(username);
28.forward=n/del_success.jspw;
29.}elseif("/servlet/addUser".equals(path)){
30.userManager.addUser(username);
31.forward=n/add_success.jspn;
32.}elseif(*'/servlet/modifyUsern.equals(path)){
33.userManager.modifyUser(username);
34.forward=/modify_success.jspn;
35.}elseif(?'/servlet/queryUser',.equals(path)){
36.ListuserList=userManager.queryUser(username);
37.request.setAttribute("userListn,userList);
38.forward=M/query_success.jsp";
39.}else{
40.thrownewRuntimeException("請求失敗”);
41.}
42.request.getRequestDispatcher(forward).forward(requestzrespons
e
43.
44.)
首先我們看到了在每個語句塊中都出現(xiàn)了給forward賦值,其實(shí)也
就是給頁面跳轉(zhuǎn)的路徑賦值,針對每個請求路徑判斷來賦值跳轉(zhuǎn)路徑。
另外每個IF-Else語句塊中都有業(yè)務(wù)處理,我們要把這些業(yè)務(wù)處理分別
放到類里面,讓職責(zé)更加單一,這樣更加符合面向?qū)ο蟮乃悸贰?/p>
就從這里我們開始重構(gòu),我們可以將這個跳轉(zhuǎn)路徑和業(yè)務(wù)邏輯封
裝起來。
既然封裝,那么我們就抽象出來一個借口,主要完成一個方法,
這個方法主要的功能就是要完成業(yè)務(wù)邏輯封裝和路徑跳轉(zhuǎn)的返回。隨后
建立四個類,主要實(shí)現(xiàn)相應(yīng)的增刪改查的業(yè)務(wù)處理和處理之后的跳轉(zhuǎn)路
徑返回。
代碼如下:
接口Action:
:java]viewplaincopy
print?
1.packagecom.cjq.servlet;
2.
3.importjavax.servlet.http.HttpServletRequest;
4.importjavax.servlet.http.HttpServletResponse;
5.
6.publicinterfaceAction{
7.
8.publicStringexecute(HttpServletRequestrequest,HttpServletRespon
seresponse)
9?throwsException;
10.}
增刪改查實(shí)現(xiàn)類:
添加用戶實(shí)現(xiàn)類:
viewplaincopy
print?
1.<prename=Hcodenclass=Hjava',>packagecom.cjq.servlet;
2.
3.importjavax.servlet.http.HttpServletRequest;
4.importjavax.servlet.http.HttpServletResponse;
5.
6.publicclassAddUserActionimplementsAction{
7.
8.
9.publicStringexecute(HttpServletRequestrequest,
10.HttpServletResponseresponse)throwsException{
11.Stringusername=request.getParameter("username");
12.UserManageruserManager=newUserManager();
13.UserManager.addUser(username);
14.returnn/add_success.jspn;
15.}
16.
17.}</prexbrxbr>
刪除用戶實(shí)現(xiàn)類:
Java]viewplaincopy
print?
1.packagecom.cjq.servlet;
2.
3.importjavax.servlet.http.HttpServletRequest;
4.importjavax.servlet.http.HttpServletResponse;
5.
6.publicclassDelUserActionimplementsAction{
7.
8.
9.publicStringexecute(HttpServletRequestrequest,
10.HttpServletResponseresponse)throwsException{
11.Stringusername=request.getParameter("username*');
12.UserManageruserManager=newUserManager();
13.UserManager.delUser(username);
14.returnH/del_success.jsp";
15.}
16.
17.}
更新用戶實(shí)現(xiàn)類:
Iava]viewplaincopy
print?
1.packagecom.cjq.servlet;
2.
13.importjavax.servlet.http.HttpServletRequest;
4.importjavax.servlet.http.HttpServletResponse;
5.
6.publicclassModifyUserActionimplementsAction{
7.
8.^Override
9.publicStringexecute(HttpServletRequestrequest,
10.HttpServletResponseresponse)throwsException{
11.Stringusername=request.getParameter(MusernameH);
12.UserManageruserManager=newUserManager();
13.UserManager.modifyUser(username);
14.returnn/mociify_success.jspn;
15.)
16.
17.)
查詢用戶實(shí)現(xiàn)類:
viewplaincopy
print?
1.packagecom.cjq.servlet;
2.
3.importjava.util.List;
4.
5.importjavax.servlet.http.HttpServletRequest;
6.importjavax.servlet.http.HttpServletResponse;
7.
8.publicclassQueryUserActionimplementsAction{
9.
10.0Override
11.publicStringexecute(HttpServletRequestrequest,
12.HttpServletResponseresponse)throwsException{
13.Stringusername=request.getParameter(nusername,');
14.UserManageruserManager=newUserManager();
15.ListuserList=userManager.queryUser(username);
16.request.setAttribute(MuserList*',userList);
17.return'*/query_success.jsp*';
18.}
19.
20.}
TestServlet類重構(gòu)如下:
Iavalviewplaincopy
print?
1.packagecom.cjq.servlet;
2.
3.importjava.io.lOException;
4.importjava.util.List;
5.
6.importjavax.servlet.ServletException;
7.importjavax.servlet.http.HttpServlet;
8.importjavax.servlet.http.HttpServletRequest;
9.importjavax.servlet.http.HttpServletResponse;
10.
11.publicclassTestServletextendsHttpServlet{
12.
13.
14.protectedvoiddoGet(HttpServletRequestrequest,HttpServletRespon
seresponse)
15.throwsServletException,lOException{
16.
17.StringrequestURI=request.getRequestURI();
18.System.out.printin("request=n+requestURI);
19.Stringpath=requestURI.substring(requestURI.indexOf(“/“,1),req
uestURI.indexOf(".”));
20.System.out.printin("path="+path);
21.
22.Actionaction=null;
23.if("/servlet/delUser',.equals(path)){
24.action=newDelUserAction();
25.}elseif(n/servlet/addUsern.equals(path)){
26.action=newAddUserAction();
27.}elseif("/servlet/modifyUser".equals(path)){
28.action=newModifyUserAction();
29.}elseif("/servlet/queryUser'*.equals(path)){
30.action=newQueryUserAction();
31.}else(
32.thrownewRuntimeException("請求失敗”);
33.}
34.Stringforward=null;
35.try(
36.forward=action.execute(request,response);
37.}catch(Exceptione){
38.e.printStackTrace();
39.)
40.request.getRequestDispatcher(forward).forward(request,respons
e);
41.}
42.)
運(yùn)行結(jié)果:
uw
?**(ww**ujJIjze?、■(iwt(vj、<z,\??、z,?、>■,??■??ji*ryj?jy,j?、=z??(V*???jkJ=4J
信息:StartingProtocolHandler[Majp-bio-8009n]
二月21,20127:34:00下午org.apache.catalina.startup.Catalinastart
信息:Serverstartupin7803ms
request=/test_Servletl/servlet/addllser.action
path=/servlet/addllser
UserManager.addllsre()——>username:ddd|
這樣TestServlet類雖然沒有徹底去掉If-Else,但是這樣的代碼變
得更加簡練,利用多肽實(shí)現(xiàn)業(yè)務(wù)邏輯處理和路徑跳轉(zhuǎn)返回。職責(zé)更加清
晰,讓維護(hù)變得更加輕松。
問題遺留:
If-else語句塊沒有徹底剔除,而且程序中依舊出現(xiàn)了過多的字符
串,所以程序依舊是不靈活,而且字符串過多增加調(diào)試的復(fù)雜性。所以
下一篇文章就把if-else語句塊剔除,并且把字符串放到配置文件來用
dom4j來動態(tài)讀取。
我們離Struts框架越來越近,當(dāng)我們把if-else和字符串剔除之后
就會出現(xiàn)Struts框架的雛形。期待下一篇文章。
在《深入淺出學(xué)習(xí)Struts1框架(-):一個簡
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(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)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 無人機(jī)操控與航拍技術(shù)考核試卷
- 圖書館數(shù)字資源長期保存策略考核試卷
- 家電產(chǎn)品品質(zhì)監(jiān)控與質(zhì)量改進(jìn)考核試卷
- 整年運(yùn)輸合同范本
- 大板委托加工合同范本
- 修剪綠化直營合同范本
- 工地個人水電合同范本
- 小學(xué)生美術(shù)課件制作教學(xué)
- 名片合同范本
- 財務(wù)支出季度計(jì)劃工作的分解與執(zhí)行要點(diǎn)
- 潔凈空調(diào)負(fù)荷計(jì)算表格
- 瀘州食品安全承諾書
- 《機(jī)械基礎(chǔ)》課程標(biāo)準(zhǔn)
- 大理市房地產(chǎn)市場調(diào)研報告
- 工業(yè)旅游策劃案例
- 倉庫固定資產(chǎn)管理規(guī)范
- 智能制造企業(yè)制造成熟度能力域打分表
- 企業(yè)關(guān)停方案
- 《員工保密協(xié)議書》電子版正規(guī)范本(通用版)
- 物流配送退出申請書
- 【學(xué)校必備】普及精神衛(wèi)生知識-中小學(xué)“世界精神衛(wèi)生日”科普講座
評論
0/150
提交評論