電動車控制器介紹_第1頁
電動車控制器介紹_第2頁
電動車控制器介紹_第3頁
電動車控制器介紹_第4頁
電動車控制器介紹_第5頁
已閱讀5頁,還剩53頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)

文檔簡介

PAGEPAGE1電動車控制器介紹第一篇:電動車控制器介紹電動車控制器介紹電動車控制器是用來控制電動車電機(jī)的啟動、運(yùn)行、進(jìn)退、速度、停止以及電動車的其它電子器件的核心控制器件,它就象是電動車的大腦,是電動車上重要的部件。我們開發(fā)的智能型無刷電動車控制器采用了美國cypress公司的方案,采用性能非常優(yōu)異單片機(jī)作為主控芯片,來實現(xiàn)控制和保護(hù)電動車的電機(jī)、電池,使電動車驅(qū)動系統(tǒng)工作在最佳狀態(tài),從而提高產(chǎn)品的可靠性和使用壽命;采用霍爾電子無級調(diào)速系統(tǒng),具有欠壓保護(hù)、過流保護(hù)、堵轉(zhuǎn)保護(hù)等保護(hù)功能,可靠的對電動車電機(jī)和電池進(jìn)行保護(hù),確保電動車使用及安全;加入了全新的無刷電機(jī)控制器理論,具有反充電/EABS剎車功能,用戶在關(guān)掉電源的情況下可把電機(jī)鎖死,使車子很難推行,另外還加入1+1助力系統(tǒng),具有巡航功能,模式切換功能,實現(xiàn)了真正的智能型控制。一、控制器功能:1、工作電壓:DC48V;2、功率:350W450W500W;3、欠壓保護(hù):DC41.5V±1V(也可根據(jù)用戶要求設(shè)定);4、電動模式:霍爾電子無級調(diào)速系統(tǒng),調(diào)速范圍0~100%,1.1~4.2V;5、限流電流:≤17A(平均值),最大脈沖電流35A(根據(jù)用戶要求設(shè)定);6、限速功能:最高車速可達(dá)35km/h~45km/h(根據(jù)電機(jī)而定),限速行駛速度控制在20XX/h以內(nèi);7、啟動方式:手柄控制啟動快慢,控制靈活;8、剎車:EABS+機(jī)械剎,高/低電平;9、巡航模式:具有自動巡航和手動巡航兩種功能可選,8秒進(jìn)入巡航,穩(wěn)定行駛速度,無須手柄控制;10、1+1助力功能:控制器根據(jù)騎車者腳踏力的大小(速度快慢),給出相應(yīng)比例的電機(jī)動力,實現(xiàn)了在騎行中輔以動力,讓騎行者感覺更輕松,中軸轉(zhuǎn)速智能型;11、堵轉(zhuǎn)保護(hù)功能:自動判斷電機(jī)在過流時是處于完全堵轉(zhuǎn)狀態(tài)還是在運(yùn)行狀態(tài)或電機(jī)短路狀態(tài),如過流時是處于運(yùn)行狀態(tài),控制器將限流值設(shè)定在固定值,以保持整車的驅(qū)動能力;如電機(jī)處于純堵轉(zhuǎn)狀態(tài),則控制器2秒后將限流值控制在10A以下,起到保護(hù)電機(jī)和電池,節(jié)省電能;如電機(jī)處于短路狀態(tài),控制器則使輸出電流控制在2A以下,以確保控制器及電池的安全。12、防飛車功能:解決了無刷控制器由于轉(zhuǎn)把或線路故障引起的飛車現(xiàn)象,同時具有啟動防飛車功能,提高了系統(tǒng)的安全性。13、電機(jī)鎖功能:在關(guān)閉電門鎖的情況下,控制器能自動將電機(jī)鎖死,實現(xiàn)了部件級的防盜功能,解決了防盜型控制器在警戒狀態(tài)下控制器還必須工作,工作電流大的不利因素。14、遙控功能:在關(guān)閉電門鎖的情況下,控制器通過遙控報警器自動在將電機(jī)鎖死的同時具有報警功能,實現(xiàn)了遙控與部件級的雙重防盜功能,解決了防盜型控制器在警戒狀態(tài)下控制器還必須工作,工作電流大的不利因素。并可在車場中通過遙控器尋車。15、反充電功能:滑行時可對電池進(jìn)行反充電,在延長了電池的行駛時間的同時增加了電池的使用壽命,解決了電池在行駛時的行駛時間短和使用壽命不長的問題。16、電機(jī)選擇:解決了正、反相繞阻電機(jī)之間不兼容的現(xiàn)象,方便了用戶的使用。17、120XX60o選擇:120XX60o電機(jī)可相互切換。18、指示燈顯示代碼:1、指示燈常滅:控制器進(jìn)入運(yùn)行狀態(tài);2、指示燈亮0.5滅0.5秒閃爍一次,滅1秒:控制器進(jìn)入待機(jī)狀態(tài);3、指示燈亮0.5滅0.5秒閃爍二次,滅1秒:剎車信號;4、指示燈亮0.5滅0.5秒閃爍三次,滅1秒:MOS損壞;5、指示燈亮0.5滅0.5秒閃爍四次,滅1秒:飛車保護(hù);6、指示燈亮0.5滅0.5秒閃爍五次,滅1秒:電流故障;7、指示燈亮0.5滅0.5秒閃爍六次,滅1秒:電源電壓低保護(hù);8、指示燈亮0.5滅0.5秒閃爍七次,滅1秒:霍爾信號故障;9、指示燈亮0.5滅0.5秒閃爍八次,滅1秒:手柄信號未接。二、使用方法:1、在接線前先切斷電源,按接線圖所示連接各根導(dǎo)線;2、該控制器應(yīng)安裝在通風(fēng)、防水、防震部位;3、控制器限速控制插頭應(yīng)放置容易操作的地方;4、控制器接插件應(yīng)接插到位,禁止將控制器電源正負(fù)極反接;5、測試后裝進(jìn)鋁殼之前,建議放電。第二篇:電動車控制器設(shè)計方案電動自行車控制器設(shè)計電動自行車控制器方案20XX/11/5電動自行車控制器設(shè)計目錄第一章概述3第二章系統(tǒng)需求分析4第三章控制器分析6一、電動車控制器框圖6二、控制器關(guān)鍵功能分析7第四章控制器設(shè)計9一、硬件設(shè)計9二、軟件設(shè)計12電動自行車控制器設(shè)計第一章概述近年來,隨著改革開放和經(jīng)濟(jì)發(fā)展日益深刻,人民生活水平日漸提高,出行交通工具也發(fā)生前所未有的變化。老百姓出行不僅考慮快捷、方便,還追求時尚環(huán)保,因此近年來電動自動自行車日益受老百姓喜愛。作為電動自行車,其核心控制器則是電動自行車的關(guān)鍵,控制的好壞決定車子的平穩(wěn)、安全、舒適,因此一個功能全面、可靠性強(qiáng)、符合要求的控制器決定了電動自行車的質(zhì)量。為了使得電動自行車有良好的體驗和可靠的質(zhì)量保證,因此本文介紹一種控制器的設(shè)計方案。電動自行車控制器設(shè)計第二章系統(tǒng)需求分析1、具有安全檢測功能,檢測電池電壓,電流需要檢測電池中電流,電池電流不能過大,防止損傷電池;需要檢查電機(jī)中的電流,并且識別是否是電機(jī)堵轉(zhuǎn)還是車子上坡或者負(fù)載過大,并且限制電機(jī)電流17A以下,在15~17A間切換,防止大電流長時間燒壞電機(jī);檢測電池電壓,電池電壓大于電機(jī)額定電壓120XX,發(fā)出報警鈴聲,提醒電壓過大,不能驅(qū)動電機(jī);2、顯示速度和里程數(shù)利用三位數(shù)碼管顯示里程數(shù),范圍0~999Km,保證每分鐘更新一次;用5個發(fā)光二極管顯示速度,表示5個檔位,每個檔位間隔速度為10Km/h,即表示的速度為10Km/h、20XX/h、30Km/h、40Km/h、50Km/h,速度在哪個檔位,對應(yīng)發(fā)光二極管閃亮。3、具有轉(zhuǎn)向燈控制電路當(dāng)打開轉(zhuǎn)向燈開關(guān)時,對應(yīng)的轉(zhuǎn)向燈每隔0.5秒閃一次,每次持續(xù)0.5秒電動自行車控制器設(shè)計4、照明燈控制電路當(dāng)打開照明燈時,在儀表盤上顯示照明打開,用一個發(fā)光二極管。5、具有報警功能當(dāng)鑰匙開關(guān)不再車上時,若輪子速度有變化,即發(fā)出報警聲音。電動自行車控制器設(shè)計第三章系統(tǒng)分析一、電動車控制器框圖上圖是整車的控制系統(tǒng)框圖,主要有電源、電機(jī)、控制器等,其中控制器位于核心地位,是整個控制系統(tǒng)的關(guān)鍵,也是負(fù)責(zé)組織各個部分協(xié)調(diào)工作的中心。其具體的控制框圖如下圖所示:電動自行車控制器設(shè)計電源降壓模塊燈管驅(qū)動電路照控速盤電壓信號剎車信號信號轉(zhuǎn)換電路WM燈P向、轉(zhuǎn)明燈轉(zhuǎn)向燈、照明燈信號信號轉(zhuǎn)換電路PIC芯片信號轉(zhuǎn)換電路MOS驅(qū)動電路電機(jī)電源輸出電路電機(jī)電路電流、電機(jī)電壓蜂鳴器P信號轉(zhuǎn)換電路WM三極管驅(qū)動電路電機(jī)霍爾信號電壓、里程顯示輸出數(shù)碼管顯示電路電源從圖中可以看出,控制器由單片機(jī)及其外圍電路構(gòu)成,包括輸入信號處理電路、輸出信號處理電路、電源電路等。二、控制器關(guān)鍵功能分析控制器功能:1、改變電機(jī)速度即調(diào)速功能,檢測車把電壓,根據(jù)車把設(shè)定速度來進(jìn)行速度設(shè)定。同時檢測霍爾傳感器計數(shù)值,作為當(dāng)前速度,通過PID調(diào)節(jié)來計算應(yīng)該輸出的PWM波。2、剎車功能檢測剎車信號,當(dāng)剎車有效時,將速度設(shè)定值強(qiáng)制變?yōu)榱悖敵鯬WM也變?yōu)榱?。電動自行車控制器設(shè)計3、有防過壓、過流檢測電路檢測電源電壓,低壓報警,防止損傷電池;檢測電源電流,當(dāng)電流過大時適當(dāng)降速,限制電流在合理區(qū)間,防止燒壞電機(jī)、電源。4、顯示電池電壓、車速、里程數(shù)將車子的速度用數(shù)碼管顯示在儀表盤上,將電池電壓通過發(fā)光二極管顯示在儀表盤上。5、防盜當(dāng)車子鎖上時,車輪子有轉(zhuǎn)動則報警。6、照明燈控制開關(guān)、轉(zhuǎn)向燈控制開關(guān)可以采用雙刀雙擲開關(guān),一個可控制強(qiáng)電信號,另一個給單片機(jī)進(jìn)行檢測。電動自行車控制器設(shè)計第四章控制器設(shè)計控制器是電動自行車的核心,要實現(xiàn)的功能有:1、可以改變電機(jī)速度2、可以剎車3、有防過壓、過流檢測電路4、顯示電池電壓、車速、里程數(shù)5、防盜控制器不僅要具有所有功能并且引出相關(guān)信號線,而且要有合適的外觀尺寸,并且可以對內(nèi)部電路進(jìn)行保護(hù)。一、硬件設(shè)計1、電機(jī)驅(qū)動電路設(shè)計由V1~V6六只功率管構(gòu)成的驅(qū)動全橋可以控制繞組的通電狀態(tài)。按照功率管的通電方式,可以分為兩兩導(dǎo)通和三三導(dǎo)通兩種控制方式。由于兩兩導(dǎo)通方式提供了更大的電磁轉(zhuǎn)矩而被廣泛采用。在兩兩導(dǎo)通方式下,每一瞬間有兩個功率管導(dǎo)通,每隔1/6周期即60°電角度換相一次,每只功率管持續(xù)導(dǎo)通120XX角度,對應(yīng)每相繞組持續(xù)導(dǎo)通120XX在此期間相電流方向保持不變。電動自行車控制器設(shè)計為保證產(chǎn)生最大的電磁轉(zhuǎn)矩,通常需要使繞組合成磁場與轉(zhuǎn)子磁場保持垂直。由于采用換相控制方式,其定子繞組產(chǎn)生的是跳變的磁場,使得該磁場與轉(zhuǎn)子磁場的位置保持在60°~120XX對垂直的范圍區(qū)間。2、照明燈、轉(zhuǎn)向燈、速度顯示儀表單片機(jī)檢測到照明燈亮暗,轉(zhuǎn)向燈亮暗及方向,將其顯示在儀表盤上,燈的亮暗是通過三個發(fā)光二極管來顯示的。由于一般的發(fā)光二極管20XX的電流就可以驅(qū)動,因此可以用單片機(jī)I/O引腳直接驅(qū)動。至于速度顯示,可以通過數(shù)碼管顯示,數(shù)碼管可以用三個,顯示范圍是0.0~99.9KM/h,可以用三極管控制選擇端,每次選擇一個數(shù)碼管,進(jìn)行給值,單片機(jī)輸出的是四位信號,可以顯示0~9的BCD碼,通過數(shù)碼管顯示驅(qū)動芯片轉(zhuǎn)換為數(shù)碼管的7段碼,則選中的數(shù)碼管顯示對應(yīng)的數(shù)字,通過不斷給數(shù)碼管寫值則可以達(dá)到看起來連續(xù)的效果。電動自行車控制器設(shè)計或者要節(jié)省成本,其實速度顯示可以僅顯示檔位,比如0~5km/h、5~10km/h、10~15km/h、15~20XX/h、20XX5km/h分為5檔,每檔對應(yīng)一個發(fā)光二極管,當(dāng)速度在對應(yīng)的檔位時,對應(yīng)的發(fā)光二極管亮,其他的不亮。3、電池電壓檢測電路檢測電池電壓需要對電池電壓進(jìn)行采樣,采樣電路的作用是強(qiáng)弱分離,對單片機(jī)引腳進(jìn)行保護(hù),同時對電池電壓進(jìn)行變換,變到適合單片機(jī)A/D引腳采樣的范圍。采樣電路可以先用電容進(jìn)行濾波,然后接上一個輸入電阻很大的變換電路,可以通過741等放大器實現(xiàn),然后對比較后的電壓進(jìn)行電阻分壓轉(zhuǎn)換,轉(zhuǎn)換到0~3.3V,適合單片機(jī)采樣。4、電機(jī)電流檢測、電池電流檢測、漏電檢測在待檢測的電路中串入阻值很小的電阻(注意大電流電路中電阻必須要有較大的功率),然后對電阻兩側(cè)的電壓取樣,經(jīng)過后級差值比較電路得出壓差。差值轉(zhuǎn)換可以采用741,然后在進(jìn)行放大縮小變化,轉(zhuǎn)換成0~3.3V的范圍,可以接入單片機(jī)A/D引腳進(jìn)行電壓檢測,然后除以電阻及變比等即可得到對應(yīng)線路的電流。通過和每個線路設(shè)定電流閾值及車狀態(tài)檢測,即可得到是否過流、是否漏電等信息。電動自行車控制器設(shè)計5、報警電路單片機(jī)通過I/O引腳輸出報警信號開關(guān),然后通過三極管驅(qū)動蜂鳴喇叭來提示是否有緊急情況。通過不同頻率的信號分辨不同的報警信息。6、防盜電路防盜檢測其實是檢測輪子是否轉(zhuǎn)動來實現(xiàn)的,即利用霍爾器件檢測速度,若速度大于某個去掉干擾后的閾值就認(rèn)為有被盜的可能,就驅(qū)動蜂鳴喇叭報警。二、軟件設(shè)計1、軟件流程圖設(shè)計電動自行車控制器設(shè)計上電檢查進(jìn)入主循環(huán)檢測速度輸入,設(shè)定速度輸入,剎車信號輸入,電源電壓檢測輸入速度PID計算,將PWM控制信號輸出儀表盤顯示速度程序流程圖1,主要流程圖,包括初始化、主循環(huán)。電動自行車控制器設(shè)計檢測速度設(shè)定值,用單片機(jī)A/D轉(zhuǎn)換功能將模擬電壓轉(zhuǎn)換為數(shù)字信號,低通濾波讀出單片機(jī)光碼盤計數(shù)器值,低通濾波增量式PID計算輸出值,并且進(jìn)行限速處理PWM輸出設(shè)定程序流程圖2,速度調(diào)整程序流程圖電動自行車控制器設(shè)計已經(jīng)檢測到實際速度值,并且進(jìn)行低通濾波處理將速度信號分成三位,分別是十位,個位,小數(shù)位計算三位數(shù)字轉(zhuǎn)換成數(shù)碼管設(shè)定值,并且進(jìn)行輸出時序設(shè)置調(diào)用顯示子函數(shù)程序流程圖3,顯示子函數(shù)程序流程圖電動自行車控制器設(shè)計速度PID計算剎車信號是否有效否進(jìn)行增量式PID計算,設(shè)定是將設(shè)定速度設(shè)為零,進(jìn)行PID計算,輸出PWM設(shè)定子函數(shù)程序流程圖4,速度調(diào)控流程圖電動自行車控制器設(shè)計安全檢測子函數(shù)電源電流是否過大是否否進(jìn)行正常處理,顯示電壓是電流過大,進(jìn)行漏電判斷或者速度限制下一程序程序流程圖5,安全檢測程序流程圖2、軟件功能設(shè)計速度PID設(shè)計:1)可以采用增量式PID,在不同電壓、不同速度下比例積分微分系數(shù)有所不同;2)帶剎車檢測,剎車時將設(shè)定速度設(shè)為0,電機(jī)PWM輸出為零;3)超速限制,當(dāng)速度超過20XX/h時,進(jìn)行適當(dāng)減速,限制在20XX/h以下;電動自行車控制器設(shè)計4)起步限速,開始時速度慢慢上升,防止突然啟動。安全檢測設(shè)計:1)檢測電壓電流,當(dāng)電壓較低時報警,以免損壞電池;2)電流檢測,防止超過限制電流燒壞電機(jī)、電源或者電線,當(dāng)電流大于最大電流時,減速是電流在最大電流值以下附近一個區(qū)間內(nèi)波動;3)上電檢測,當(dāng)電機(jī)未開動時,若有較大電流則可能漏電進(jìn)行報警;4)當(dāng)車鑰匙拔出來,并且開啟報警功能后,若車輪子光碼盤有讀數(shù)說明車子可能被盜,要進(jìn)行報警。顯示設(shè)計:1)速度顯示設(shè)計,用三段數(shù)碼管顯示速度的十位、個位和小數(shù)位,采用共陰極數(shù)碼管,LM373鎖存數(shù)字,三個IO口選通數(shù)碼管,一次顯示一位,每個循環(huán)周期控制一次;2)照明燈顯示,主控電路用開關(guān)實現(xiàn),單片機(jī)僅檢測開關(guān)是否開啟,并用一個IO口來控制三極管電路驅(qū)動發(fā)光二極管來顯示是否開啟照明燈,左右的轉(zhuǎn)向燈采用相同的設(shè)計;3)電源電壓顯示,將檢測到的電壓用多個發(fā)光二極管顯示,亮的越多電壓越高,當(dāng)電壓低于報警電壓時,所有二極管熄滅,驅(qū)動電路采用三極管驅(qū)動,每個循環(huán)周期進(jìn)行一次顯示。第三篇:struts2_控制器介紹struts2控制器介紹核心控制器FilterDispatcher核心控制器FilterDispatcher是Struts2框架的基礎(chǔ),包含了框架內(nèi)部的控制流程和處理機(jī)制。業(yè)務(wù)控制器Action和業(yè)務(wù)邏輯組件是需要用戶來自己實現(xiàn)的。用戶在開發(fā)Action和業(yè)務(wù)邏輯組件的同時,還需要編寫相關(guān)的配置文件,供核心控制器FilterDispatcher來使用。Struts2的工作流程相對于Struts1要簡單,與WebWork框架基本相同,所以說Struts2是WebWork的升級版本。Struts2框架按照模塊來劃分,可以分為ServletFilters、Struts核心模塊、攔截器和用戶實現(xiàn)部分。Struts2框架結(jié)構(gòu)圖如圖3.1所示。圖3.1Struts2框架結(jié)構(gòu)圖一個請求在Struts2框架中的處理大概分為以下幾個步驟??蛻舳颂峤灰粋€(HttpServletRequest)請求,如上文在瀏覽器中輸入http://localhost:8080/bookcode/ch2/Reg.action就是提交一個(HttpServletRequest)請求。請求被提交到一系列(主要是3層)的過濾器(Filter),如(ActionContextCleanUp、其他過濾器(SiteMesh等)、FilterDispatcher)。注意:這里是有順序的,先ActionContextCleanUp,再其他過濾器(OthterFilters、SiteMesh等),最后到FilterDispatcher。FilterDispatcher是控制器的核心,就是MVC的Struts2實現(xiàn)中控制層(Controller)的核心。FilterDispatcher詢問ActionMapper是否需要調(diào)用某個Action來處理這個(HttpServletRequest)請求,如果ActionMapper決定需要調(diào)用某個Action,F(xiàn)ilterDispatcher則把請求的處理交給ActionProxy。ActionProxy通過ConfigurationManager(struts.xml)詢問框架的配置文件,找到需要調(diào)用的Action類。例如,用戶注冊示例將找到UserReg類。ActionProxy創(chuàng)建一個ActionInvocation實例,同時ActionInvocation通過代理模式調(diào)用Action。但在調(diào)用之前,ActionInvocation會根據(jù)配置加載Action相關(guān)的所有Interceptor(攔截器)。一旦Action執(zhí)行完畢,ActionInvocation負(fù)責(zé)根據(jù)struts.xml中的配置找到對應(yīng)的返回結(jié)果result。Struts2的核心控制器是FilterDispatcher,有3個重要的方法:destroy()、doFilter()和Init(),可以在Struts2的下載文件夾中找到源代碼,如代碼3.1所示。代碼3.1核心控制器FilterDispatcherpublicclassFilterDispatcherimplementsStrutsStatics,Filter{/***定義一個Log實例*/privatestaticfinalLogLOG=LogFactory.getLog(FilterDispatcher.class);/***存放屬性文件中的.STRUTS_I18N_ENCODING值*/privatestaticStringencoding;/***定義ActionMapper實例*/privatestaticActionMapperactionMapper;/***定義FilterConfig實例*/privateFilterConfigfilterConfig;protectedDispatcherdispatcher;/***創(chuàng)建一個默認(rèn)的dispatcher,初始化filter*設(shè)置默認(rèn)的packages**/publicvoidinit(FilterConfigfilterConfig)throwsServletException{this.filterConfig=filterConfig;dispatcher=createDispatcher(filterConfig);dispatcher.init();Stringparam=filterConfig.getInitParameter(“packages”);Stringpackages=“erceptor.debugging”;if(param!=null){packages=param+“”+packages;}this.pathPrefixes=parse(packages);}//銷毀filter方法publicvoiddestroy(){if(dispatcher==null){LOG.warn(“somethingisseriouslywrong,Dispatcherisnotinitialized(null)”);}else{dispatcher.cleanup();}}/***處理一個Action或者資源請求**filter嘗試將請求同actionmapping相匹配*如果找到,將執(zhí)行dispatcher的serviceAction方法*如果Action處理失敗,doFilter將建立一個異常**如果請求靜態(tài)資源*資源將被直接復(fù)制給response**如果找不到匹配Action或者靜態(tài)資源,則直接跳出publicvoiddoFilter(ServletRequestreq,ServletResponseres,FilterChainchain)throwsIOException,ServletException{HttpServletRequestrequest=(HttpServletRequest)req;HttpServletResponseresponse=(HttpServletResponse)res;ServletContextservletContext=getServletContext();StringtimerKey=“FilterDispatcher_doFilter:”;try{UtilTimerStack.push(timerKey);request=prepareDispatcherAndWrapRequest(request,response);ActionMappingmapping;try{mapping=actionMapper.getMapping(request,dispatcher.getConfigurationManager());}catch(Exceptionex){LOG.error(“errorgettingActionMapping”,ex);dispatcher.sendError(request,response,servletContext,HttpServletResponse.SC_INTERNAL_SERVER_ERROR,ex);return;}if(mapping==null){StringresourcePath=RequestUtils.getServletPath(request);if(“".equals(resourcePath)&&null!=request.getPathInfo()){resourcePath=request.getPathInfo();}if(serveStatic&&resourcePath.startsWith(”/struts“)){Stringname=resourcePath.substring(”/struts“.length());findStaticResource(name,request,response);}else{//為一個普通的request,則通過chain.doFilter(request,response);}return;}/***這個方法詢問ActionMapper是否需要調(diào)用某個Action來處理這個(request)請求,*如果ActionMapper決定需要調(diào)用某個Action,*FilterDispatcher則把請求的處理交給ActionProxydispatcher.serviceAction(request,response,servletContext,mapping);}finally{try{ActionContextCleanUp.cleanUp(req);}finally{UtilTimerStack.pop(timerKey);}}}……}在doFilter()方法中,將調(diào)用dispatcher.serviceAction,該方法如果找到相應(yīng)的Action,將把用戶請求交給ActionProxy。serviceAction()代碼在Dispatcher.java中,如代碼3.2所示。代碼3.2Dispatcher類publicclassDispatcher{.../***為mapping加載類,并調(diào)用相應(yīng)的方法或者直接返回result**根據(jù)用戶請求的參數(shù),建立Action上下文*根據(jù)指定的Action’名稱和包空間名稱,加載一個Action代理ActionProxy*然后Action的相應(yīng)方法將被執(zhí)行,*/publicvoidserviceAction(HttpServletRequestrequest,HttpServletResponseresponse,ServletContextcontext,ActionMappingmapping)throwsServletException{MapextraContext=createContextMap(request,response,mapping,context);//如果存在一個值棧,則建立一個新的并復(fù)制以備Action使用ValueStackstack=(ValueStack)request.getAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY);if(stack!=null){extraContext.put(ActionContext.VALUE_STACK,ValueStackFactory.getFactory().createValueStack(stack));}StringtimerKey=”HandlingrequestfromDispatcher“;try{UtilTimerStack.push(timerKey);Stringnamespace=mapping.getNamespace();Stringname=mapping.getName();Stringmethod=mapping.getMethod();Configurationconfig=configurationManager.getConfiguration();//FilterDispatcher把請求的處理交給ActionProxyActionProxyproxy=config.getContainer().getInstance(ActionProxyFactory.class).createActionProxy(namespace,name,extraContext,true,false);proxy.setMethod(method);request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY,proxy.getInvocation().getStack());//ActionMapping直接返回一個resultif(mapping.getResult()!=null){Resultresult=mapping.getResult();result.execute(proxy.getInvocation());}else{proxy.execute();}if(stack!=null){request.setAttribute(ServletActionContext.STRUTS_VALUESTACK_KEY,stack);}}catch(ConfigurationExceptione){LOG.error(”Couldnotfindactionorresult",e);sendError(request,response,context,HttpServletResponse.SC_NOT_FOUND,e);}catch(Exceptione){thrownewServletException(e);}finally{UtilTimerStack.pop(timerKey);}}…}從上面代碼中可以看出來,Struts2用于處理用戶請求的Action實例,并不是用戶實現(xiàn)的業(yè)務(wù)控制器,而是Action代理。關(guān)于Action代理相關(guān)內(nèi)容,讀者可以參考攔截器章節(jié)的介紹。★提示★前面一直在說Action可以是一個普通的Java類,與ServletAPI完全分離,但是為了實現(xiàn)業(yè)務(wù)邏輯,Action需要使用HttpServletRequest內(nèi)容。Struts2設(shè)計的精巧之處就是使用了Action代理,Action代理可以根據(jù)系統(tǒng)的配置,加載一系列的攔截器,由攔截器將HttpServletRequest參數(shù)解析出來,傳入Action。同樣,Action處理的結(jié)果也是通過攔截器傳入HttpServletResponse,然后由HttpServletRequest傳給用戶。其實,該處理過程是典型的AOP(面向切面編程)的方式,讀者可以在后面詳細(xì)了解到。Struts2處理過程模型如圖3.2所示。圖3.2Struts2處理過程模型★說明★攔截器是Struts2框架的核心,通過攔截器,實現(xiàn)了AOP(面向切面編程)。使用攔截器,可以簡化Web開發(fā)中的某些應(yīng)用,例如,權(quán)限攔截器可以簡化Web應(yīng)用中的權(quán)限檢查。3.1.2業(yè)務(wù)控制器Action業(yè)務(wù)控制器Action是由開發(fā)者自己編寫實現(xiàn)的,Action類可以是一個簡單的Java類,與ServletAPI完全分離。Action一般都有一個execute()方法,也可以定義其他業(yè)務(wù)控制方法,詳細(xì)內(nèi)容將在后面介紹。Action的execute()返回一個String類型值,這與Struts1返回的ActionForward相比,簡單易懂。Struts2提供了一個ActionSupport工具類,該類實現(xiàn)了Action接口和validate()方法,一般開發(fā)者編寫Action可以直接繼承ActionSupport類。編寫Action類后,開發(fā)者還必須在配置文件中配置Action。一個Action的配置應(yīng)該包含下面幾個元素:1、該Action的name,即用戶請求所指向的URL。2、Action所對應(yīng)的class元素,對應(yīng)Action類的位置。3、指定result邏輯名稱和實際資源的定位。Action是業(yè)務(wù)控制器,筆者建議在編寫Action的時候,盡量避免將業(yè)務(wù)邏輯放到其中,盡量減少Action與業(yè)務(wù)邏輯模塊或者組件的耦合程度。3.1.3業(yè)務(wù)模型組件業(yè)務(wù)模型組件可以是實現(xiàn)業(yè)務(wù)邏輯的模塊,可以是EJB、POJO或者JavaBean,在實際開發(fā)中,對業(yè)務(wù)模型組件的區(qū)分和定義也是比較模糊的,實際上也超出了Struts2框架的范圍。不同的開發(fā)者或者團(tuán)隊,都有自己的方式來實現(xiàn)業(yè)務(wù)邏輯模塊,Struts2框架的目的就是使用Action來調(diào)用業(yè)務(wù)邏輯模塊。例如一個銀行存款的業(yè)務(wù)邏輯模塊,如代碼3.3所示。代碼3.3模擬一個銀行業(yè)務(wù)的實現(xiàn)模塊packagech3;publicclassBank{//定義銀行賬戶privateStringaccounts;//定義操作金額privatedoublemoney;//屬性的getter和setter方法publicStringgetAccounts(){returnaccounts;}publicvoidsetAccounts(Stringaccounts){this.accounts=accounts;}publicdoublegetMoney(){returnmoney;}publicvoidsetMoney(doublemoney){this.money=money;}//模擬銀行存款方法publicbooleansaving(Stringaccounts,doublemoney){//調(diào)用DAO等模塊讀寫數(shù)據(jù)庫returndosomeing();}}上面實例在實際開發(fā)中沒有任何意義,這里只是作為業(yè)務(wù)邏輯模塊來說明,在執(zhí)行saving(Stringaccounts,doublemoney)方法時,可以調(diào)用相應(yīng)的數(shù)據(jù)庫訪問其他組件,來實現(xiàn)存款操作。使用Action調(diào)用該業(yè)務(wù)邏輯組件可以在execute()方法中實現(xiàn),如代碼3.4所示。代碼3.4業(yè)務(wù)控制器Bank_Saving_Actionpackagech3;importjava.util.Map;importcom.opensymphony.xwork2.ActionContext;importcom.opensymphony.xwork2.ActionSupport;publicclassBank_Saving_ActionextendsActionSupport{//定義銀行賬戶privateStringaccounts;//定義操作金額privatedoublemoney;publicStringexecute()throwsException{//創(chuàng)建Bank實例Bankbk=newBank();//調(diào)用存款方法if(bk.saving(accounts,money)){returnSUCCESS;}else{returnERROR;}}//屬性的getter和setter方法publicStringgetAccounts(){returnaccounts;}publicvoidsetAccounts(Stringaccounts){this.accounts=accounts;}publicdoublegetMoney(){returnmoney;}publicvoidsetMoney(doublemoney){this.money=money;}Bank_Saving_Action演示了對銀行存款業(yè)務(wù)邏輯組件的調(diào)用,這里是通過在Action中創(chuàng)建業(yè)務(wù)邏輯組件實例的方式實現(xiàn)的。在實際開發(fā)中,可以使用靜態(tài)工廠獲得業(yè)務(wù)邏輯組件的實例或者使用IoC容器來管理。Action中不實現(xiàn)任何業(yè)務(wù)邏輯,只是負(fù)責(zé)組織調(diào)度業(yè)務(wù)邏輯組件。調(diào)用關(guān)系如圖3.3所示。圖3.3調(diào)用業(yè)務(wù)邏輯組件★說明★業(yè)務(wù)控制器Action一般情況下不是直接創(chuàng)建業(yè)務(wù)邏輯組件實例,而是使用工廠模式或者是從Spring容器中獲得業(yè)務(wù)邏輯組件實例,這樣可以提高系統(tǒng)的性能。3.1.4視圖組件Struts1只能支持JSP作為視圖資源,而Struts2的進(jìn)步之處就是可以使用其他視圖技術(shù),如FreeMarker、Velocity等。通過前面的學(xué)習(xí)和示例,讀者會知道Action的返回結(jié)果只是一個簡單的字符串,也就是一個邏輯上的視圖名稱,要與實際視圖資源對應(yīng),必須通過配置文件來實現(xiàn)。在struts.xml配置文件中,每一個Aciton定義都有name和class屬性,同時還要指定result元素。result元素指定了邏輯視圖名稱和實際視圖的對應(yīng)關(guān)系。每個result都有一個type屬性,前面介紹的struts.xml中并沒有顯式指定type值,即使用了默認(rèn)的type類型:dispatcher,該結(jié)果類型支持JSP所謂視圖資源。對于Struts2的視圖技術(shù)和result返回類型,后面將詳細(xì)介紹。第四篇:電動車控制器的標(biāo)準(zhǔn)和電動車控制器購買需要注意事項電動車控制器的標(biāo)準(zhǔn)和

溫馨提示

  • 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

提交評論