我們所學(xué)習(xí)的技術(shù)框架有很多_第1頁
我們所學(xué)習(xí)的技術(shù)框架有很多_第2頁
我們所學(xué)習(xí)的技術(shù)框架有很多_第3頁
我們所學(xué)習(xí)的技術(shù)框架有很多_第4頁
我們所學(xué)習(xí)的技術(shù)框架有很多_第5頁
已閱讀5頁,還剩115頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論