基于SSM整合框架的快速開發(fā)技術(shù)研究_第1頁
基于SSM整合框架的快速開發(fā)技術(shù)研究_第2頁
基于SSM整合框架的快速開發(fā)技術(shù)研究_第3頁
基于SSM整合框架的快速開發(fā)技術(shù)研究_第4頁
基于SSM整合框架的快速開發(fā)技術(shù)研究_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、長江大學(xué)計算機科學(xué)學(xué)院碩士研究生作 業(yè) 簿年 級 計算機科學(xué)S151 專 業(yè) 計算機科學(xué)與技術(shù) 課程名稱 計算機新技術(shù)專題 姓 名 熊魏 交作業(yè)時間 2016年10月8日 基于SSM整合框架的快速開發(fā)技術(shù)研究熊魏長江大學(xué)計算機科學(xué)學(xué)院S151班學(xué)號:2015713901引言框架,即framework。其實就是某種應(yīng)用的半成品,把不同應(yīng)用程序中有共性的一些東西抽取出來,做成一個半成品程序,這樣的半成品就是所謂的程序框架。軟件系統(tǒng)發(fā)展到今天已經(jīng)很復(fù)雜了,特別是服務(wù)器端軟件,涉及到的知識、內(nèi)容、問題太多,在某些方面使用別人成熟的框架,就相當(dāng)于讓別人幫你完成一些基礎(chǔ)工作。你只需要集中精力,完成系統(tǒng)的業(yè)

2、務(wù)邏輯設(shè)計,這樣每次開發(fā)就不用白手起家,而是可以在這個基礎(chǔ)上開始搭建。使用框架的最大好處:減少重復(fù)開發(fā)工作量、縮短開發(fā)時間、降低開發(fā)成本,同時,還有其它的好處,如:使程序設(shè)計更合理,程序運行更穩(wěn)定等?;谶@些原因,基本上現(xiàn)在在開發(fā)中,都會選用某些合適的開發(fā)框架,來幫助快速高效的開發(fā)應(yīng)用系統(tǒng)。框架的選擇,就是看哪個框架最合適,從而減少開發(fā)的工作量,提高開發(fā)的效率和質(zhì)量,并有效減少維護的工作量,最終達到節(jié)約綜合開發(fā)成,本獲取更多的收益。下面簡單了解一下Spring MVC+Spring+Mybatis三大框架。2.技術(shù)架構(gòu)系統(tǒng)采用以spring為核心并整合了Spring mvc和mybatis的3

3、個輕量級框架技術(shù)的組合,即SSM整合框架。利用SSM整合框架可開發(fā)出分層、易擴展、易維護的企業(yè)級應(yīng)用系統(tǒng)。, 能夠極大地滿足系統(tǒng)的需求。SSM框架結(jié)構(gòu)圖如圖2所示。隨著web應(yīng)用的規(guī)模、復(fù)雜度不斷升級,對軟件架構(gòu)的復(fù)用性、可靠性、可擴展性都提出了較高的要求。本課題采用了MVC這一軟件架構(gòu)模式,該模式成功實現(xiàn)了動態(tài)的程序設(shè)計,簡化了后續(xù)對程序的修改以及擴展,使部分程序的重復(fù)利用成為可能。此外,此模式簡化了應(yīng)用程序的復(fù)雜度,使程序結(jié)構(gòu)更直觀?;贛VC架構(gòu)模式,本系統(tǒng)采用SSM框架,即Struct2,spring3.0,mybatis框架組合,采用此框架技術(shù)可以提高開發(fā)效率、降低程序的復(fù)雜度。圖1

4、 SSM框架結(jié)構(gòu)圖圖1 SSM框架結(jié)構(gòu)圖3 MVC設(shè)計模式MVC設(shè)計模式1是一種目前廣泛流行的軟件設(shè)計模式,它把一個應(yīng)用的各流程按照Model(模型)、View(視圖)、Controller(控制器)的方式進行分離。本系統(tǒng)所采用的SSM整合框架就是根據(jù)MVC設(shè)計模式的基礎(chǔ)上發(fā)展起來,其中Struts2就是采用MVC模式建立起來的框架技術(shù),而Struts2正是需要與spring、Mybatis進行無縫的集成,才能真正發(fā)揮MVC模式的作用。圖2 MVC設(shè)計模式的工作原理圖2 MVC設(shè)計模式的工作原理如圖1所示MVC設(shè)計模式的工作原理View部分即是應(yīng)用程序的用戶界面,用戶通過View層發(fā)送請求提交

5、到Controller層;Controller層接受請求根據(jù)具體需求調(diào)用Model層來處理,再根據(jù)Model層調(diào)用回來的結(jié)果進行跳轉(zhuǎn)。可知Controller層在整個流程中起到了橋梁的作用,控制數(shù)據(jù)的流向;而Model層負(fù)責(zé)業(yè)務(wù)邏輯的處理和數(shù)據(jù)庫訪問。4 Spring MVC技術(shù)研究Spring Web MVC是一種基于Java的實現(xiàn)了Web MVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架,即使用了MVC架構(gòu)模式的思想,將web層進行職責(zé)解耦,基于請求驅(qū)動指的就是使用請求-響應(yīng)模型,框架的目的就是幫助我們簡化開發(fā),Spring Web MVC也是要簡化我們?nèi)粘eb開發(fā)的。Spring Web

6、 MVC也是服務(wù)到工作者模式的實現(xiàn),但進行可優(yōu)化。前端控制器是DispatcherServlet;應(yīng)用控制器其實拆為處理器映射器(Handler Mapping)進行處理器管理和視圖解析器(View Resolver)進行視圖管理;頁面控制器/動作/處理器為Controller接口(僅包含ModelAndView handleRequest(request, response)方法)的實現(xiàn)(也可以是任何的POJO類);支持本地化(Locale)解析、主題(Theme)解析及文件上傳等;提供了非常靈活的數(shù)據(jù)驗證、格式化和數(shù)據(jù)綁定機制;提供了強大的約定大于配置(慣例優(yōu)先原則)的契約式編程支持。Sp

7、ring Web MVC框架也是一個基于請求驅(qū)動的Web框架,并且也使用了前端控制器模式來進行設(shè)計,再根據(jù)請求映射規(guī)則分發(fā)給相應(yīng)的頁面控制器(動作/處理器)進行處理。首先讓我們整體看一下Spring Web MVC處理請求的流程如圖3所示:圖3 Spring MVC 處理流程圖3 Spring MVC 處理流程具體執(zhí)行步驟如下:1、首先用戶發(fā)送請求前端控制器,前端控制器根據(jù)請求信息(如URL)來決定選擇哪一個頁面控制器進行處理并把請求委托給它,即以前的控制器的控制邏輯部分;圖3中的1、2步驟;2、頁面控制器接收到請求后,進行功能處理,首先需要收集和綁定請求參數(shù)到一個對象,這個對象在Spring

8、 Web MVC中叫命令對象,并進行驗證,然后將命令對象委托給業(yè)務(wù)對象進行處理;處理完畢后返回一個ModelAndView(模型數(shù)據(jù)和邏輯視圖名);圖3中的3、4、5步驟;3、 前端控制器收回控制權(quán),然后根據(jù)返回的邏輯視圖名,選擇相應(yīng)的視圖進行渲染,并把模型數(shù)據(jù)傳入以便視圖渲染;圖3中的步驟6、7;4、 前端控制器再次收回控制權(quán),將響應(yīng)返回給用戶,圖3中的步驟8;至此整個結(jié)束。5 Spring技術(shù)研究Spring 是一個開源框架,是為了解決企業(yè)應(yīng)用程序開發(fā)復(fù)雜性而創(chuàng)建的。框架的主要優(yōu)勢之一就是其分層架構(gòu),分層架構(gòu)允許您選擇使用哪一個組件,同時為 J2EE 應(yīng)用程序開發(fā)提供集成的框架。Sprin

9、g 框架是一個分層架構(gòu),由 6 個定義良好的模塊組成。Spring 模塊構(gòu)建在核心容器之上,核心容器定義了創(chuàng)建、配置和管理 bean 的方式。圖4 Spring框架架構(gòu)圖4 Spring框架架構(gòu)其核心模塊為IOC容器和AOP。4.1 IOC(Inversion of Control控制反轉(zhuǎn),又名依賴注入)IOC即依賴注入,利用java里的反射機制在運行時動態(tài)的去創(chuàng)建、調(diào)用對象,Spring框架就是在運行的時候,根據(jù)Spring的applicationContext.xml配置文件來動態(tài)的創(chuàng)建對象并調(diào)用對象的方法的,所以使用Spring框架后不需要用new方法創(chuàng)建而是通過框架自動產(chǎn)生一個對象,只

10、需要在xml文件中對bean進行定義。Spring發(fā)展到3.0后,不需要在xml文件中逐個定義bean對象,只需在調(diào)用的文件中使用Autowired來聲明所調(diào)用的對象即可,使開發(fā)更加簡潔方便。4.2 AOP(Aspect-OrientedProgramming,面向方面編程)AOP即面向切面編程,其原理是利用代理的設(shè)計模式,未使用Spring時,開發(fā)人員需要編寫大量的代碼來實現(xiàn)AOP,現(xiàn)在有了Spring對AOP的支持,不僅減輕了開發(fā)的工作量提高了開發(fā)的效率,也增強了程序的可靠性。本系統(tǒng)中Spring的AOP主要用于對事務(wù)的管理。Spring框架主要用于降低系統(tǒng)模塊之間的耦合度。其主要技術(shù)包括

11、控制反轉(zhuǎn)(IOC)和面向切面編程(AOP)兩大方面。Spring降低耦合度的功能主要通過IOC來實現(xiàn),IOC是Spring框架的核心,其原理可以理解為程序的所有組件都是被動的,初始化和調(diào)用都有容器(Spring)的負(fù)責(zé)。另外Spring提供了AOP技術(shù),利用AOP可以對業(yè)務(wù)邏輯的各個部分進行隔離,如:日志記錄、事務(wù)處理等,從而使得業(yè)務(wù)邏輯各部分的耦合度降低,提高程序的可重用性和開發(fā)效率。4.3 spring的主要特性。(1)降低組件之間的耦合度,實現(xiàn)軟件各層之間的解耦。(2)可以使用容器提供的眾多服務(wù),如:事務(wù)管理服務(wù)、消息服務(wù)、JMS服務(wù)、持久化服務(wù)等等。(3)容器提供單例模式支持,開發(fā)人員

12、不再需要自己編寫實現(xiàn)代碼。(4)容器提供了AOP技術(shù),利用它很容易實現(xiàn)如權(quán)限攔截,運行期監(jiān)控等功能。(5)容器提供的眾多輔作類,使用這些類能夠加快應(yīng)用的開發(fā),如:JdbcTemplate、HibernateTemplate.(6)對主流的應(yīng)用框架提供了集成支持。6 Hibernate與Mybatis技術(shù)研究MyBatis是一個基于Java的持久層框架。iBATIS提供的持久層框架包括SQL Maps和Data Access Objects(DAO)。MyBatis 是支持普通 SQL查詢,存儲過程和高級映射的優(yōu)秀持久層框架。MyBatis 消除了幾乎所有的JDBC代碼和參數(shù)的手工設(shè)置以及結(jié)果集

13、的檢索。MyBatis 使用簡單的 XML或注解用于配置和原始映射,將接口和 Java 的POJOs(Plain Old Java Objects,普通的 Java對象)映射成數(shù)據(jù)庫中的記錄。每個MyBatis應(yīng)用程序主要都是使用SqlSessionFactory實例的,一個SqlSessionFactory實例可以通過SqlSessionFactoryBuilder獲得。SqlSessionFactoryBuilder可以從一個xml配置文件或者一個預(yù)定義的配置類的實例獲得。用xml文件構(gòu)建SqlSessionFactory實例是非常簡單的事情。推薦在這個配置中使用類路徑資源(classpa

14、th resource),但你可以使用任何Reader實例,包括用文件路徑或file:/開頭的url創(chuàng)建的實例。MyBatis有一個實用類-Resources,它有很多方法,可以方便地從類路徑及其它位置加載資源。6.1功能架構(gòu)Mybatis的功能架構(gòu)分為三層,如圖5所示:圖4 Mybatis 架構(gòu)圖4 Mybatis 架構(gòu)(1)API接口層:提供給外部使用的接口API,開發(fā)人員通過這些本地API來操縱數(shù)據(jù)庫。接口層一接收到調(diào)用請求就會調(diào)用數(shù)據(jù)處理層來完成具體的數(shù)據(jù)處理。(2)數(shù)據(jù)處理層:負(fù)責(zé)具體的SQL查找、SQL解析、SQL執(zhí)行和執(zhí)行結(jié)果映射處理等。它主要的目的是根據(jù)調(diào)用的請求完成一次數(shù)據(jù)庫

15、操作。(3)基礎(chǔ)支撐層:負(fù)責(zé)最基礎(chǔ)的功能支撐,包括連接管理、事務(wù)管理、配置加載和緩存處理,這些都是共用的東西,將他們抽取出來作為最基礎(chǔ)的組件。為上層的數(shù)據(jù)處理層提供最基礎(chǔ)的支撐。6.2工作流程(1)加載配置:配置來源于兩個地方,一處是配置文件,一處是Java代碼的注解,將SQL的配置信息加載成為一個個MappedStatement對象(包括了傳入?yún)?shù)映射配置、執(zhí)行的SQL語句、結(jié)果映射配置),存儲在內(nèi)存中。(2)SQL解析:當(dāng)API接口層接收到調(diào)用請求時,會接收到傳入SQL的ID和傳入對象(可以是Map、JavaBean或者基本數(shù)據(jù)類型),Mybatis會根據(jù)SQL的ID找到對應(yīng)的Mapped

16、Statement,然后根據(jù)傳入?yún)?shù)對象對MappedStatement進行解析,解析后可以得到最終要執(zhí)行的SQL語句和參數(shù)。(3)SQL執(zhí)行:將最終得到的SQL和參數(shù)拿到數(shù)據(jù)庫進行執(zhí)行,得到操作數(shù)據(jù)庫的結(jié)果。(4)結(jié)果映射:將操作數(shù)據(jù)庫的結(jié)果按照映射的配置進行轉(zhuǎn)換,可以轉(zhuǎn)換成HashMap、JavaBean或者基本數(shù)據(jù)類型,并將最終結(jié)果返回。6.3動態(tài)SQLMyBatis 最強大的特性之一就是它的動態(tài)語句功能。如果您以前有使用JDBC或者類似框架的經(jīng)歷,您就會明白把SQL語句條件連接在一起是多么的痛苦,要確保不能忘記空格或者不要在columns列后面省略一個逗號等。動態(tài)語句能夠完全解決掉這些

17、痛苦。盡管與動態(tài)SQL一起工作不是在開一個party,但是MyBatis確實能通過在任何映射SQL語句中使用強大的動態(tài)SQL來改進這些狀況。動態(tài)SQL元素對于任何使用過JSTL或者類似于XML之類的文本處理器的人來說,都是非常熟悉的。在上一版本中,需要了解和學(xué)習(xí)非常多的元素,但在MyBatis 3 中有了許多的改進,現(xiàn)在只剩下差不多二分之一的元素。MyBatis使用了基于強大的OGNL表達式來消除了大部分元素。MyBatis是一個可以自定義SQL、存儲過程和高級映射的持久層框架。只使用簡單的XML和注解來配置和映射基本數(shù)據(jù)類型、MAP接口和POJO(簡單的JAVA對象)到數(shù)據(jù)庫記錄。相比另一流

18、行的持久層框架Hibernate,MyBatis是一種“半自動化”的ORM(對象關(guān)系映射)實現(xiàn),可以進行更為細(xì)致的SQL優(yōu)化減少查詢字段。因為本系統(tǒng)主要是對數(shù)據(jù)庫的數(shù)據(jù)進行處理,而且數(shù)據(jù)量會比較大,結(jié)構(gòu)比較穩(wěn)定,因此對SQL語句應(yīng)進行更高度的優(yōu)化,所以本系統(tǒng)選擇MyBatis作為數(shù)據(jù)庫持久層框架。相對Hibernate的全自動化,Mybatis是半自動化的ORM框架,雖然不如全自動化更節(jié)省開發(fā)人員時間,但是對于對性能要求較高的系統(tǒng),Mybatis可以對SQL語句自由進行優(yōu)化,而且現(xiàn)在有MybatisGenerateCode等插件工具可以實現(xiàn)自動生成實體類和基本的select,insert,de

19、lete及update語句。減少了Mybatis與Hibernate在開發(fā)復(fù)雜度上面差距。表1是使用zakisoft工具對Hibernate和Mybatis的執(zhí)行效率進行的測試數(shù)據(jù),其中執(zhí)行時間為平均每條數(shù)據(jù)的執(zhí)行時間,insert測試數(shù)據(jù)為10000條,select、delete、update每次測試均為隨機選擇、刪除、更新一條數(shù)據(jù),執(zhí)行次數(shù)100次。根據(jù)以上調(diào)研及測試,綜合考慮,本系統(tǒng)采用Mybatis框架。7.管理員及權(quán)限模塊實現(xiàn)系統(tǒng)建立初期,只有超級管理員一個角色和用戶,超級管理員可以創(chuàng)建其他角色,并為角色分配不同的權(quán)限,例如:web菜單維護角色、新聞內(nèi)容管理角色、web布局管理角色以

20、及文件管理等角色。然后創(chuàng)建web智能管理系統(tǒng)的后臺管理員用戶,每個用戶有其對應(yīng)的權(quán)限角色。例如擁有菜單維護的權(quán)限的用戶,可以創(chuàng)建前臺網(wǎng)站菜單并分配該菜單對應(yīng)的主頁。不同角色的管理員擁有不同的權(quán)限,在很大程度上保證了前臺web系統(tǒng)的安全性。7框架組合經(jīng)過對各個框架的研究,系統(tǒng)采用SSM框架組合,分別取Spring mvc、spring3.0、Mybatis各框架中優(yōu)秀模塊進行組合,實現(xiàn)MVC架構(gòu)模式。取Spring mvc中的Action層與JSP頁面之間的交互響應(yīng)、攔截器,過濾器等功能作為view層和controller層;Mybatis作為model層,負(fù)責(zé)實例、JDBC連接以及數(shù)據(jù)持久層的

21、功能;Spring作為一個輕量級的框架,采用其核心模塊IOC、AOP、Test,其中,IOC依賴翻轉(zhuǎn)用來連接各個層之間對象,簡化各個對象之間調(diào)用;由于基于反射及代理模式的面向切面編程開銷比較大,本系統(tǒng)中只用來進行事務(wù)管理,負(fù)責(zé)事務(wù)的回滾機制,Spring的Test機制使得測試變得不再復(fù)雜,可以采用非容器依賴的編程方式進行大部分測試工作,此外Spring還擔(dān)當(dāng)著MVC各個層之間的無縫連接工作,否則即使各個框架都很優(yōu)秀也無法發(fā)揮出其最大的作用。在SSM整合框架中,每一個框架都發(fā)揮著自己最擅長的方面: Spring mvc注重于降低表現(xiàn)層與邏輯層的耦合度,在視圖層和控制層發(fā)揮作用;Spring作為整

22、個框架的核心部分,起到了橋梁的作用,對業(yè)務(wù)層的層次深化,在業(yè)務(wù)層通過其IOC技術(shù)的對象依賴注入和AOP技術(shù)的事務(wù)分離,更深層次的降低了耦合程度;MyBatis框架主要負(fù)責(zé)Java對象和關(guān)系數(shù)據(jù)庫之間的映射,在數(shù)據(jù)持久層上提供數(shù)據(jù)的訪問。通過應(yīng)用SSM整合框架,可以將整個系統(tǒng)開發(fā)的結(jié)構(gòu)大致分為如圖2所示。圖6 SSM框架結(jié)構(gòu)圖6 SSM框架結(jié)構(gòu)3.1框架組合實現(xiàn)通過web.xml,Structs.xml,applicationContext.xml,mybatis-config.xml這個配置文件搭建web系統(tǒng)的整體框架,使之符合MVC架構(gòu)模式。web.xml文件中通過context-param

23、配置了Spring的上下文位置,并通過listener配置,通知容器加載Spring及Struct2的配置文件。Structs.xml主要是對頁面提交的請求以及Action返回的頁面進行對應(yīng)。applicationContext.xml是Spring的配置文件,其中,可以實現(xiàn)使用annotation自動注冊bean,并檢查Required,Autowired的屬性是否已經(jīng)被注入。使用AOP定義了事務(wù),除了以get,find,select方法名開頭的方法外,其他service層的方法均有回滾機制,保證了事務(wù)的原子性、一致性、持久性。此外還配置了mybatis文件位置以及數(shù)據(jù)庫的相關(guān)信息,將業(yè)務(wù)層

24、和數(shù)據(jù)層分離并聯(lián)系起來。mybatis-config.xml文件中配置了MAPPER的加載方式,本系統(tǒng)中采用非懶漢式加載,即在系統(tǒng)初始化時加載所有的MAPPER文件,防止出現(xiàn)初始化并發(fā)問題。經(jīng)過編寫各配置文件組合3個框架,完成了系統(tǒng)的整體架構(gòu)的搭建。SSM框架的組合分別是Spring mvc、Spring3.0、MyBatis,三者組合實現(xiàn)MVC架構(gòu)模式。Spring mvc的主要功能是使用action層與JSP頁面進行交互。Mybatis是半自動化的ORM框架,負(fù)責(zé)數(shù)據(jù)持久層的功能,可以對SQL語句進行自動優(yōu)化,并且可以使用插件實現(xiàn)自動生成實體類及基本的語句。Spring核心模塊IOC依賴反

25、轉(zhuǎn)各個層之間的對象,簡化對象的調(diào)用。SSM框架在Web應(yīng)用系統(tǒng)開發(fā)中具有以下優(yōu)勢:(1)系統(tǒng)開發(fā)效率提升??蚣芸梢蕴峁└咝У慕M件和視圖處理,而且以配置文件的方式定義程序邏輯。需求改變僅需修改控制邏輯的配置文件,無需關(guān)心底層框架的實現(xiàn),從而提高系統(tǒng)開發(fā)效率。(2)模塊間相互獨立。SSM框架具有“低耦合高內(nèi)聚”的特點。設(shè)計人員可以按功能將系統(tǒng)劃分為不同的功能模塊,模塊之間相互獨立,每個模塊的修改不影響其他模塊。(3)角色分離??蚣転殚_發(fā)者提供不同的接口,前端頁面設(shè)計人員只需關(guān)注JSP頁面的設(shè)計,后臺邏輯開發(fā)者對業(yè)務(wù)邏輯開發(fā)程序。前端和后臺的人員相互獨立,互不影響。(4)縮短開發(fā)周期,降低項目開發(fā)成

26、本??蚣芸梢赃m用于各種類型開發(fā)人員協(xié)同工作,降低了對開發(fā)人員知識和技能的要求,加快了開發(fā)速度。8結(jié)束語文章結(jié)合高校項目管理的特點,提出采用Strut2、Spring、Mybatis三者整合框架SSM的設(shè)計思想,設(shè)計并實現(xiàn)了高校項目管理系統(tǒng)。根據(jù)項目實際開發(fā)過程與結(jié)果,SSM框架很少的降低了項目開發(fā)的耦合度,實現(xiàn)表示層、業(yè)務(wù)層與數(shù)據(jù)層的分離,使得系統(tǒng)開發(fā)過程更合理化,提高系統(tǒng)開發(fā)后的可擴展性和可維護性。該系統(tǒng)已通過測試,在廣西大學(xué)投入使用,運行穩(wěn)定、效果良好。9 參考文獻1張俊萍;朱小冬;侯娜;張魯;梁欣;基于SSM的軟件體系結(jié)構(gòu)開發(fā)過程研究J;計算機測量與控制;2011年08期2諶湘倩;狄文輝

27、;孫冬;基于SSH框架與AJAX技術(shù)的JavaWeb應(yīng)用開發(fā)J;計算機工程與設(shè)計;2009年10期3任曉鵬;趙文兵;張春平;基于框架的Web系統(tǒng)開發(fā)研究J;計算機工程與設(shè)計;2010年04期4王艷清;陳紅;基于SSM框架的智能web系統(tǒng)研發(fā)設(shè)計J;計算機工程與設(shè)計;2012年12期5王錢;王蓉;張利;基于iBatis的通用數(shù)據(jù)持久層的研究與設(shè)計J;微計算機信息;2007年12期6劉軍;戴金山;基于Spring MVC與iBATIS的輕量級Web應(yīng)用研究J;計算機應(yīng)用;2006年04期7吳志霞;陳平;基于S2SH的在線項目管理平臺的設(shè)計與實現(xiàn)J;計算機與現(xiàn)代化;2011年08期8諶湘倩;狄文輝;

28、孫冬;基于SSH框架與AJAX技術(shù)的JavaWeb應(yīng)用開發(fā)J;計算機工程與設(shè)計;2009年10期9祝世東;基于MVC設(shè)計模式的Struts框架在建材檢測系統(tǒng)中的研究與應(yīng)用D;沈陽理工大學(xué);2010年10周永來;基于復(fù)用的Java EE快速Web開發(fā)架構(gòu)的研究與應(yīng)用D;華北電力大學(xué)(北京);2008年11鄧斯紅;基于AJAX和SSH集成框架的國有資產(chǎn)管理系統(tǒng)D;北京化工大學(xué);2010年12張春華;基于MVC模式的Struts框架的研究與應(yīng)用D;吉林大學(xué);2010年教 師 評 語 及 成 績評閱成績_評閱時間_教師簽名_附錄資料:不需要的可以自行刪除 busybox詳解制作根文件系統(tǒng)詳解制作根文件

29、系統(tǒng) 一、FHS(Filesystem Hierarchy Standard)標(biāo)準(zhǔn)介紹當(dāng)我們在linux下輸入ls / 的時候,見到的目錄結(jié)構(gòu)以及這些目錄下的內(nèi)容都大同小異,這是因為所有的linux發(fā)行版在對根文件系統(tǒng)布局上都遵循FHS標(biāo)準(zhǔn)的建議規(guī)定。該標(biāo)準(zhǔn)規(guī)定了根目錄下各個子目錄的名稱及其存放的內(nèi)容:目錄名存放的內(nèi)容/bin必備的用戶命令,例如ls、cp等/sbin必備的系統(tǒng)管理員命令,例如ifconfig、reboot等/dev設(shè)備文件,例如mtdblock0、tty1等/etc系統(tǒng)配置文件,包括啟動文件,例如inittab等/lib必要的鏈接庫,例如C鏈接庫、內(nèi)核模塊/home普通用戶主

30、目錄/rootroot用戶主目錄/usr/bin非必備的用戶程序,例如find、du等/usr/sbin非必備的管理員程序,例如chroot、inetd等/usr/lib庫文件/var守護程序和工具程序所存放的可變,例如日志文件/proc用來提供內(nèi)核與進程信息的虛擬文件系統(tǒng),由內(nèi)核自動生成目錄下的內(nèi)容/sys用來提供內(nèi)核與設(shè)備信息的虛擬文件系統(tǒng),由內(nèi)核自動生成目錄下的內(nèi)容/mnt文件系統(tǒng)掛接點,用于臨時安裝文件系統(tǒng)/tmp臨時性的文件,重啟后將自動清除制作根文件系統(tǒng)就是要建立以上的目錄,并在其中建立完整目錄內(nèi)容。其過程大體包括:編譯安裝busybox,生成/bin、/sbin、/usr/bin

31、、/usr/sbin目錄 利用交叉編譯工具鏈,構(gòu)建/lib目錄 手工構(gòu)建/etc目錄 手工構(gòu)建最簡化的/dev目錄 創(chuàng)建其它空目錄 配置系統(tǒng)自動生成/proc目錄 利用udev構(gòu)建完整的/dev目錄 制作根文件系統(tǒng)的jffs2映像文件 下面就來詳細(xì)介紹這個過程。二、編譯安裝busybox,生成/bin、/sbin、/usr/bin、/usr/sbin目錄這些目錄下存儲的主要是常用命令的二進制文件。如果要自己編寫這幾百個常用命令的源程序,my god, 這簡直是一個噩夢!好在我們有嵌入式Linux系統(tǒng)的瑞士軍刀busybox,事情就簡單很多。1、從 HYPERLINK / / 下載busybox

32、-1.7.0.tar.bz22、tar xjvf busybox-1.7.0.tar.bz2解包3、修改Makefile文件175 ARCH ?= arm176 CROSS_COMPILE ?= arm-linux- 4、make menuconfig配置busyboxbusybox配置主要分兩部分。第一部分是Busybox Settings,主要編譯和安裝busybox的一些選項。這里主要需要配置:1)、Build Options - Build BusyBox as a static binary (no shared libs),表示編譯busybox時,是否靜態(tài)鏈接C庫。我們選擇動態(tài)鏈

33、接C庫。2)、Installation Options - Applets links (as soft-links) - (X) as soft-links,表示安裝busybox時,將各個命令安裝為指向busybox的軟鏈接還是硬鏈接。我們選擇軟鏈接。3)、Installation Options - (/work/nfs_root/fs_mini3) BusyBox installation prefix,表示busybox的安裝位置。我們選擇/work/nfs_root/fs_mini34)Busybox Library Tuning。保留Command line editing以支持

34、命令行編輯;保留History size以支持記憶歷史命令;選中Tab completion和Username completion以支持命令自動補全 第二部分是Applets,他將busybox的支持的幾百個命令分門別類。我們只要在各個門類下選擇想要的命令即可。這里我們基本保持默認(rèn)設(shè)置。1)選中Networking Utilities - httpd下的Enable -u option,以啟用http服務(wù)器的功能allows the server to run as a specific user5、編譯busyboxmake6、安裝busyboxmake install安裝完成后,可以看到

35、在/work/nfs_root/fs_mini3目錄下生成了binsbinusr/binusr/sbin目錄,其下包含了我們常用的命令,這些命令都是指向bin/busybox的軟鏈接,而busybox本身的大小不到800K:dennisdennis-desktop:/work/nfs_root/fs_mini3$ lsbin linuxrc sbin usrdennisdennis-desktop:/work/nfs_root/fs_mini3$ ls -l bintotal 740lrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 addgroup -

36、 busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 adduser - busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 ash - busybox-rwxr-xr-x 1 dennis dennis 749632 2010-04-03 23:57 busyboxlrwxrwxrwx 1 dennis dennis 7 2010-04-03 23:57 cat busybox 而普通PC機上的ls命令就有差不多80K的大小: dennisdennis-desktop:/work/nf

37、s_root/fs_mini3$ ls -l /bin/ls-rwxr-xr-x 1 root root 78004 2007-09-29 20:51 /bin/ls busybox以它嬌小的身軀容納了數(shù)以百計的命令代碼,實在是讓人佩服不已,其不愧嵌入式系統(tǒng)瑞士軍刀之美譽。據(jù)說,busybox的作者身患絕癥,這更讓人欽佩GNU開源軟件的作者們。 三、利用交叉編譯工具鏈,構(gòu)建/lib目錄 光有應(yīng)用程序(命令)是不夠的,因為應(yīng)用程序本身需要使用C庫的庫函數(shù),因此還必需制作for ARM的C庫,并將其放置于/lib目錄。my god,要自己寫C庫的源代碼嗎?不用!還記得交叉編譯工具鏈的3個組成部分嗎

38、?交叉編譯器、for ARM的C庫和二進制工具。哈哈,for ARM的C庫是現(xiàn)成的,我們只需要拷貝過來就可以了。遺憾的是:整個C庫目錄下的文件總大小有26M。而我們根文件系統(tǒng)所在分區(qū)不過區(qū)區(qū)16M而已,根本放不下。怎么辦呢? dennisdennis-desktop:/work/nfs_root/fs_mini3$ du -s -si /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib26M /work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib 需要C庫目錄下所有的文件嗎?no,absolutely no!

39、讓我們來分析一下glibc庫目錄下內(nèi)容的組成。該目錄下的子目錄和文件共分8類: 目標(biāo)文件,如crtn.o,用于gcc鏈接可執(zhí)行文件 libtool庫文件(.la),在鏈接庫文件時這些文件會被用到,比如他們列出了當(dāng)前庫文件所依賴的其它庫文件,程序運行時無需這些文件 gconv目錄,里面是各種鏈接腳本,在編譯應(yīng)用程序時,他們用于指定程序的運行地址,各段的位置等 靜態(tài)庫文件(.a),例如libm.a,libc.a 動態(tài)庫文件 (.so、.so.0-9*) 動態(tài)鏈接庫加載器ld-2.3.6.so、ld-linux.so.2 其它目錄及文件很顯然,第1、2、3、4、7類文件和目錄是不需要拷貝的。由于動態(tài)

40、鏈接的應(yīng)用程序本身并不含有它所調(diào)用的C庫函數(shù)的代碼,因此執(zhí)行時需要動態(tài)鏈接庫加載器來為它加載相應(yīng)的C庫文件,所以第6類文件是需要拷貝的。除此之外,第5類文件當(dāng)然要拷貝。但第5類文件的大小也相當(dāng)大。dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ du -c -si *.so* 7.2M total 需要全部拷貝嗎?非也,非也!其實,需要哪些庫完全取決于要運行的應(yīng)用程序使用了哪些庫函數(shù)。如果我們只制作最簡單的系統(tǒng),那么我們只需要運行busybox這一個應(yīng)用程序即可。通過執(zhí)行 dennisdennis-des

41、ktop:/work/nfs_root/fs_mini3$ arm-linux-readelf -a bin/busybox | grep Shared0 x00000001 (NEEDED) Shared library: libcrypt.so.10 x00000001 (NEEDED) Shared library: libm.so.60 x00000001 (NEEDED) Shared library: libc.so.6 可知:busybox只用到了3個庫:通用C庫(libc)、數(shù)學(xué)庫(libm)、加密庫(libcrypt),因此我們只需要拷貝這3個庫的庫文件即可。但是每個庫都有4

42、個文件,4個文件都要拷貝嗎?當(dāng)然不是。 dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libcrypt.-*-rwxr-xr-x 1 dennis dennis 30700 2008-01-22 05:32 libcrypt-2.3.6.so-rw-r-r- 1 dennis dennis 23118 2008-01-22 05:32 libcrypt.alrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libcrypt.so - libcryp

43、t.so.1lrwxrwxrwx 1 dennis dennis 17 2008-12-22 15:38 libcrypt.so.1 - libcrypt-2.3.6.sodennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libm.-*-rwxr-xr-x 1 dennis dennis 779096 2008-01-22 05:31 libm-2.3.6.so-rw-r-r- 1 dennis dennis 1134282 2008-01-22 05:32 libm.alrwxrwxrwx

44、1 dennis dennis 9 2008-12-22 15:38 libm.so - libm.so.6lrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libm.so.6 - libm-2.3.6.sodennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ ls -l libc.-*-rwxr-xr-x 1 dennis dennis 1435660 2008-01-22 05:48 libc-2.3.6.so-rw-r-r- 1 dennis dennis 2

45、768280 2008-01-22 05:31 libc.a-rw-r-r- 1 dennis dennis 195 2008-01-22 05:34 libc.solrwxrwxrwx 1 dennis dennis 13 2008-12-22 15:38 libc.so.6 - libc-2.3.6.so 4個文件中的.a文件是靜態(tài)庫文件,是不需要拷貝的。另外3個文件是: 實際的共享鏈接庫:libLIBRARY_NAME-GLIBC_VERSION.so。當(dāng)然需要拷貝。 主修訂版本的符號鏈接,指向?qū)嶋H的共享鏈接庫:libLIBRARY_NAME.so.MAJOR_REVISION_VERS

46、ION,程序一旦鏈接了特定的鏈接庫,將會參用該符號鏈接。程序啟動時,加載器在加載程序前,會檢索該文件。所以需要拷貝。 與版本無關(guān)的符號鏈接,指向主修訂版本的符號連接(libc.so是唯一的例外,他是一個鏈接命令行:libLIBRARY_NAME.so,是為編譯程序時提供一個通用條目)。這些文件在程序被編譯時會被用到,但在程序運行時不會被用到,所以不必拷貝它。關(guān)于共享庫的2個符號鏈接的作用的特別說明:當(dāng)我們使用gcc hello.c -o hello -lm編譯程序時,gcc會根據(jù)-lm的指示,加頭(lib)添尾(.so)得到libm.so,從而沿著與版本無關(guān)的符號鏈接(libm.so - li

47、bm.so.6)找到libm.so.6并記錄在案(hello的ELF頭中),表示hello需要使用libm.so.6這個庫文件所代表的數(shù)學(xué)庫中的庫函數(shù)。而當(dāng)hello被執(zhí)行的時候,動態(tài)鏈接庫加載器會從hello的ELF頭中找到libm.so.6這個記錄,然后沿著主修訂版本的符號鏈接(libm.so.6 - libm-2.3.6.so)找到實際的共享鏈接庫libm-2.3.6.so,從而將其與hello作動態(tài)鏈接??梢?,與版本無關(guān)的符號鏈接是供編譯器使用的,主修訂版本的符號鏈接是供動態(tài)鏈接庫加載器使用的,而實際的共享鏈接庫則是供應(yīng)用程序使用的。通過以上分析,我們只需要拷貝3個庫(每個庫各1個主修

48、訂版本的符號鏈接和1個實際的共享鏈接庫)以及動態(tài)鏈接庫加載器(1個符號鏈接和1個實體文件)。步驟如下:dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ mkdir /work/nfs_root/fs_mini3/lib dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libcrypt-* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/g

49、cc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libcrypt.so.* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libm-* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libm.so.* /work/nfs_root/fs_mini3/

50、libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp libc-* /work/nfs_root/fs_mini3/libdennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l libc.so.* /work/nfs_root/fs_mini3/lib dennisdennis-desktop:/work/tools/gcc-3.4.5-glibc-2.3.6/arm-linux/lib$ cp -l

51、ld-* /work/nfs_root/fs_mini3/lib 四、手工構(gòu)建/etc目錄 /etc目錄存放的是系統(tǒng)程序的主配置文件,因此需要哪些配置文件取決于要運行哪些系統(tǒng)程序。即使最小的系統(tǒng)也一定會運行1號用戶進程init,所以我們至少要手工編寫init的主配置文件inittab。busybox的inittab文件的語法、語義與傳統(tǒng)的SYSV的inittab有所不同。 inittab文件中每個條目用來定義一個需要init啟動的子進程,并確定它的啟動方式,格式為:。例如:ttySAC0:askfirst:-/bin/sh 表示子進程要使用的控制臺,若省略則使用與init進程一樣的控制臺 表示

52、運行級別,busybox init程序這個字段沒有意義 表示init進程如何控制這個子進程 sysinit:系統(tǒng)啟動后最先執(zhí)行,只執(zhí)行一次,init進程等待它結(jié)束后才繼續(xù)執(zhí)行其它動作 wait:系統(tǒng)執(zhí)行完sysinit條目后執(zhí)行,只執(zhí)行一次,init進程等待它結(jié)束后才繼續(xù)執(zhí)行其它動作 once:系統(tǒng)執(zhí)行完wait條目后執(zhí)行,只執(zhí)行一次,init進程不等待它結(jié)束 respawn:啟動完once進程后,init進程監(jiān)測發(fā)現(xiàn)子進程退出時,重新啟動它 askfirst:啟動完respawn進程后,與respawn類似,不過init進程先輸出” Please press Enter to activat

53、e this console“,等用戶輸入回車后才啟動子進程 shutdown:當(dāng)系統(tǒng)關(guān)機時 restart:Busybox中配置了CONFIG_FEATURE_USE_INITAB,并且init進程接收到SIGUP信號時執(zhí)行,先重新讀取、解析/etc/inittab文件,再執(zhí)行restart程序 ctrlaltdel:按下ctrl+alt+del鍵時執(zhí)行,不過在串口控制臺中無法輸入它 表示進程對應(yīng)的二進制文件。如果前面有-號,表示該程序是“可以與用戶進行交互的”我們制作最簡單的/etc/inittab文件,其內(nèi)容如下::sysinit:/etc/init.d/rcS:askfirst:-/b

54、in/sh:ctrlaltdel:/sbin/reboot:shutdown:/bin/umount -a r 制作最簡單的腳本程序文件/etc/init.d/rcS,其內(nèi)容如下: #!/bin/shifconfig eth0 7修改shell腳本文件/etc/init.d/rcS的權(quán)限,以使其可被執(zhí)行:# chmod a+x /etc/init.d/rcS五、手工構(gòu)建最簡化的/dev目錄 在linux機器上,執(zhí)行l(wèi)s /dev可看到幾百個設(shè)備文件,我需要手工創(chuàng)建它們嗎?maybe,我只需要手工創(chuàng)建幾個設(shè)備文件!我怎么知道我應(yīng)該創(chuàng)建哪幾個設(shè)備文件呢?管它呢,先看看開發(fā)板上可愛的linux的反應(yīng)

55、再說。 啟動Linux操作系統(tǒng),顯示: VFS: Mounted root (nfs filesystem).Freeing init memory: 112KWarning: unable to open an initial console. 這說明,內(nèi)核已經(jīng)成功掛載根文件系統(tǒng),但卻未能成功啟動第1個用戶進程init。通過錯誤消息“unable to open an initial console”搜索內(nèi)核源代碼,找到init/main.c文件。748 static int noinline init_post(void)749 750 free_initmem();751 unlock_

56、kernel();752 mark_rodata_ro();753 system_state = SYSTEM_RUNNING;754 numa_default_policy();755 756 if (sys_open(const char _user *) /dev/console, O_RDWR, 0) 0)757 printk(KERN_WARNING Warning: unable to open an initial console.n);758 759 (void) sys_dup(0);760 (void) sys_dup(0);761 762 if (ramdisk_exec

57、ute_command) 763 run_init_process(ramdisk_execute_command);764 printk(KERN_WARNING Failed to execute %sn,765 ramdisk_execute_command);766 767 768 /*769 * We try each of these until one succeeds.770 *771 * The Bourne shell can be used instead of init if we are772 * trying to recover a really broken m

58、achine.773 */774 if (execute_command) 775 run_init_process(execute_command);776 printk(KERN_WARNING Failed to execute %s. Attempting 777 defaults.n, execute_command);778 779 run_init_process(/sbin/init);780 run_init_process(/etc/init);781 run_init_process(/bin/init);782 run_init_process(/bin/sh);783

59、 784 panic(No init found. Try passing init= option to kernel.);785 顯然,內(nèi)核錯誤是由175行不能打開/dev/console所致。通過查看已經(jīng)安裝好的linux機器的/dev/console設(shè)備文件,可知其是字符設(shè)備文件,主設(shè)備號為5,次設(shè)備號為1: dennisdennis-desktop:/work/nfs_root/fs_mini3/etc$ ls -l /dev/consolecrw- 1 root root 5, 1 2010-04-08 08:40 /dev/console 因此,我們使用下面的命令創(chuàng)建它: HYP

60、ERLINK mailto:dennisdennis-desktop:/work/nfs_root/fs_mini3/dev$ dennisdennis-desktop:/work/nfs_root/fs_mini3/dev$ sudo mknod console c 5 1 還需要創(chuàng)建其它設(shè)備文件嗎?只有天知道!再看看linux的反應(yīng)。 VFS: Mounted root (nfs filesystem).Freeing init memory: 112Kinit: cant open /dev/null: No such file or directory 這次我們有經(jīng)驗了,如法炮制,創(chuàng)建

溫馨提示

  • 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)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論