




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
Java工程開發(fā)平臺(tái)開發(fā)標(biāo)準(zhǔn)
北京東方國信電子CRM事業(yè)部
時(shí)間:2003-8-27
目錄
Java工程開發(fā)平臺(tái)開發(fā)標(biāo)準(zhǔn)1
一、開發(fā)平臺(tái)概述2
二、技術(shù)綜述2
1、Struts框架技術(shù)2
2、Hibernate數(shù)據(jù)持久化技術(shù)4
3、動(dòng)態(tài)bean技術(shù)9
三、在BONC-JONE平臺(tái)上進(jìn)展開發(fā)12
1、BONC-JONE平臺(tái)目錄說明12
2、如何使用BONC-JONE運(yùn)行起來13
3、開發(fā)有關(guān)標(biāo)準(zhǔn)性要求及典型步驟13
四、主要函數(shù)及使用技術(shù)方法說明36
如何使用自定義標(biāo)簽庫?36
如何使用日志類寫日志?38
如何進(jìn)展資源注冊?41
如何進(jìn)展登陸權(quán)限驗(yàn)證?41
如何進(jìn)展字符轉(zhuǎn)換?41
如何對資源文件進(jìn)展字符轉(zhuǎn)換?41
如何配置、讀取應(yīng)用配置信息?41
如何打包boncpersistenceobj.jar文件?41
數(shù)據(jù)操作方法的原理是怎樣的?41
如何將任意文件上傳到藪據(jù)庫中,又如何下載?41
如何保證在頁面清空的字段能正確提交到數(shù)據(jù)庫?41
如何使用日期控件?42
如何使用DBQuery類進(jìn)展數(shù)據(jù)蛋詢?42
如何自動(dòng)生成Hibernate持久化beans及map文件?42
如何使用分頁技術(shù)?44
附錄:45
附A:Struts學(xué)習(xí)精要參考45
附B:Hibernate學(xué)習(xí)精要參考45
附C:技術(shù)備忘45
一、開發(fā)平臺(tái)概述
BONG-JONE開發(fā)平臺(tái)是北京東方國信電子技術(shù)遵循“簡單、有效、先進(jìn)、可擴(kuò)〃的原
那么,通過整合Struts1.1與Hibernate2.1等優(yōu)秀的開源技術(shù)設(shè)計(jì)并實(shí)現(xiàn)的一個(gè)J2EE
開發(fā)平臺(tái)。
其架構(gòu)圖如下:
這個(gè)體系架構(gòu)的主體是MVC架構(gòu)。MVC是Model/View/Control的縮寫。
ModeI/View/ControI是軟件設(shè)計(jì)的典型構(gòu)造。在這種設(shè)計(jì)構(gòu)造下,一個(gè)應(yīng)用被分為三個(gè)局
部:Model、View和Controller,每個(gè)局部負(fù)責(zé)不同的功能。Model是指對業(yè)務(wù)數(shù)據(jù)/信息
的處理模塊,包括對業(yè)務(wù)數(shù)據(jù)的存取、加工、綜合等;View是指用戶界面,也就是面向用
戶的數(shù)據(jù)表示;Controller那么負(fù)責(zé)View和Model之間的流程控制,也就是完成兩個(gè)方向
的動(dòng)作:1.將用戶界面(View)的操作映射到具體的Model,以完成具體的業(yè)務(wù)邏輯;2.將
通過Model處理完的業(yè)務(wù)數(shù)據(jù)及時(shí)反響到用戶界面(View)上。
其系統(tǒng)組成構(gòu)造圖如下:
?分層系統(tǒng)構(gòu)造還限制隔層依賴的發(fā)生,各層的通訊是由頂向下管理的。某一層僅依
賴于首接位于它下面的那一層"每一層對其他層的存在都是不知道的,除非那一層
緊鄰其下。即使是對緊鄰其下的層它也僅需要知道如何使用接口與其通訊就可以
了,而無需知道其實(shí)現(xiàn)細(xì)節(jié)。
BONC-JONE開發(fā)平臺(tái)通過Struts+Tiles技術(shù)實(shí)現(xiàn)了MVC模式中的表示層和控制層,通
過Hibernate技術(shù)結(jié)合動(dòng)態(tài)Bean技術(shù)融合成獨(dú)特的業(yè)務(wù)Beans技術(shù)構(gòu)建了數(shù)據(jù)層。
二、技術(shù)綜述
1、Struts框架技術(shù)
Struts是一個(gè)基于J2EE的MVC框架。
J2EE體系包括JSP、Servlet.EJ3、WEBSERVICE等多項(xiàng)技術(shù)。這些技術(shù)的出現(xiàn)給電子商務(wù)
時(shí)代的WEB應(yīng)用開發(fā)提供了一個(gè)非常有競爭力的選擇。但怎樣把這些技術(shù)組合起來,形成一
個(gè)適應(yīng)工程需要的穩(wěn)定架構(gòu)對工程開發(fā)是非常重要的。
設(shè)計(jì)一個(gè)框架,需要考慮的方面很多,不僅要對J2EE體系中的各種技術(shù)進(jìn)展篩選取舍,
并要考慮到開發(fā)過程中的角色分工、后期的運(yùn)行維護(hù),以及系統(tǒng)擴(kuò)展性等諸多因親。
因此,一個(gè)成功的軟件需要有一個(gè)成功的架構(gòu)。
MVC架構(gòu)使得應(yīng)用程序的構(gòu)造更加清晰,通過將代碼按照層次劃分為業(yè)務(wù)邏輯/數(shù)據(jù)、用
戶界面和應(yīng)用流程控制這三個(gè)層次,增強(qiáng)代碼穩(wěn)定性。我們知道,對于Model.View、
ControlIer這三局部功能來講,View的實(shí)現(xiàn)一般是由界面設(shè)計(jì)人員和界面程序員來完成,
Model那么是由業(yè)務(wù)邏輯程序員來完成,Controller那么一般由負(fù)責(zé)整體控制的程序員來完
成。Controller局部的代碼比擬穩(wěn)定,一般會(huì)實(shí)現(xiàn)一個(gè)通用的架構(gòu):而Model那么跟隨商
務(wù)流程的變化而變化;View的更改那么是隨著用戶需求的更改而更改。這種模塊功能的劃
分有利于在代碼修改正程中進(jìn)展模塊的隔離,而不需要把具有不同功能的代碼混雜在一起造
成混亂。對于工程開發(fā)而言,有利于在工程小組內(nèi)按照小組成員各自的擅長進(jìn)展分工,有利
于三個(gè)局部并行開發(fā)、加快工程進(jìn)度。
當(dāng)前可供選擇的較為流行的MVC框架有六種之多:Struts^Maverick、WebWorkTurbine、
ReaIMothods>AOP(aspect-orientedprogramming]0它們應(yīng)用的領(lǐng)域,及實(shí)現(xiàn)的側(cè)重點(diǎn)各有
不同。但以Struts應(yīng)用最廣,是基于MVC模式的Web應(yīng)用最經(jīng)典框架,當(dāng)推首選。
Struts最早是作為ApacheJakarta工程的組成局部問世。工程的創(chuàng)立者希望通過對該工程
的研究,改良和提高JavaServerPages(JSPs)、Servlet、標(biāo)簽庫以及面向?qū)ο蟮募夹g(shù)水
準(zhǔn)。
Struts這個(gè)名字來源于在建筑和舊式飛機(jī)中使用的支持金屬架。它的目的是為了幫助我們
減少在運(yùn)用MVC設(shè)計(jì)模型來開發(fā)Web應(yīng)用的時(shí)間。
因此我們選擇Struts0
Struts鼓勵(lì)按照Model2方式構(gòu)建應(yīng)用的體系。Model2是MVC根本設(shè)計(jì)模式的一種變
體。MVC設(shè)計(jì)模式的優(yōu)點(diǎn)是,它使得Model、View和Controller各個(gè)局部之間相對獨(dú)立。
Struts在一個(gè)中心位置裝配ActionServlet、ActionMapping和各種Action類,處理所有
傳入的ServletRequestoActionServlet把各個(gè)傳入的SezvletRequest分發(fā)給
Action類,而ActionMapping對象可通過Struts-config.xml配置文件控制,它告訴
ActionServlet如何分發(fā)請求。
本圖示意了Struts各個(gè)局部之間的通信過程
Controller的功能:在客戶端、View和Model之間起協(xié)調(diào)、仲裁的作用。只有Controller
才會(huì)與ModeI和Vicw聯(lián)系,在這中間它就象是一1個(gè)交換機(jī),而ModeI和Vicw之間不會(huì)直接
通信,這樣,Model、View和Controller就被分隔開來。這是成功運(yùn)月Struts的關(guān)鍵所在。
說明一下:所有Controller的邏輯應(yīng)當(dāng)放入Action類,與應(yīng)用的其他層的通信可以在
這里進(jìn)展。雖然我們可以把業(yè)務(wù)邏輯也放入Controller,但一般而言最好不要這么做。應(yīng)
當(dāng)改用Model局部的組件,因?yàn)檫@些組件才是真正處理數(shù)據(jù)的地方。把數(shù)據(jù)保存到數(shù)據(jù)庫也
應(yīng)當(dāng)是Model的功能之一。
當(dāng)Controller處理好一個(gè)ServIetRequest,它把請求轉(zhuǎn)發(fā)給View。View的唯一任
務(wù)是表現(xiàn)數(shù)據(jù),在Struts中,View一般使用JSP技術(shù)。
在Struts中,Controller和View之間的所有通信都通過ServletRequesto
Session和ServletContext間接完成,對于這些操作來說,首選的技術(shù)莫過于Servlet,
Struts直接把ServletRequest傳遞給Servlet或者是JSP,不過Servlet容器會(huì)自
動(dòng)把JSP轉(zhuǎn)換成Servleto
Struts框架將其側(cè)重點(diǎn)放在了Controller與View層。
View由JSP定制標(biāo)記庫和JSP頁面共同構(gòu)造,其中ActionForm類是一種類似JavaBean
的ValueObject對象,帶有set和get方法,用來保存客戶的狀態(tài)。按照Struts的MVC概
念,ActionForm位于View和Controller之間的中間地帶。Struts提.供了一組完備的專用
標(biāo)記,用來從JSP訪問ActionForm里面的數(shù)據(jù)。
Controller由ActionServlet、ActionMapping和各種Action類相互配合來完成。其中
Action類給開發(fā)人員自由發(fā)揮的空間比擬大,因此,在開發(fā)過程中完整地遵從MVC的概念
Action類的使用方式是一個(gè)關(guān)鍵c
對于Struts的解剖。
圖講解明:其中不同顏色代表MVC的不同局部:紅色〔控制器)、紫色〔模型〕和綠色〔視
圖〕
?首先,控制器(:ActionServlet〕進(jìn)展初始化工作,讀取配置文件
〔struts-config.xml〕,為不同的Struts模塊初始化相應(yīng)的ModuIeConfig對象。
比方配置文件中的Action映射定義都保存在ActionConfig集合中。相應(yīng)地有
ControIConfig集合、FormBeanConfig集合、ForwardConfig集合和
MessageResourcesConfig集合等。
?控制器接收請求,并從ActionConfig中找出對應(yīng)于該請求的Action子類,如
果沒有對應(yīng)的Action,控制器直接將請求轉(zhuǎn)發(fā)給JSP或者靜態(tài)頁面。否那么控制器
將請求分發(fā)至具體Action類進(jìn)展處理。
?在控制器調(diào)用具體Action的execute方法之前,ActionForm對象將利用請求
中的參數(shù)來填充自己〔可選步驟,需要在配理文件中指定〕。具體的ActionForm對
象應(yīng)該是ActionForm的子類對象,它其實(shí)就是一個(gè)JavaBean。此外,還可以在
ActionForm類中調(diào)用validate方法來檢查請求參數(shù)的合法性,并且可以返回一個(gè)
包含所有錯(cuò)誤信息的ActonErrors對象。如果執(zhí)行成功,ActionForm自動(dòng)將這些
參數(shù)信息以JavaBean[一般稱之為formbean]的方式保存在ServletContext中,
這樣它們就可以被其它Action對象或者JSP調(diào)用。Struts將這些ActionForm的配
置信息都放在FormBeanConfig集合中,通過它們Struts能夠知道針對某個(gè)客戶請
求是否需要?jiǎng)?chuàng)立相應(yīng)的ActionForm實(shí)例。
?Action很簡單,一般只包含一個(gè)execute方法,它負(fù)責(zé)執(zhí)行相應(yīng)的業(yè)務(wù)邏輯,如果
需要,它也進(jìn)展相應(yīng)的數(shù)據(jù)檢查。執(zhí)行完成之后,返回一個(gè)ActionForward對象,
控制器通過該ActionForv/ard對象來進(jìn)展轉(zhuǎn)發(fā)工作。我們主張■將獲取數(shù)據(jù)和執(zhí)行業(yè)
務(wù)邏輯的功能放到具體的JavaBean當(dāng)中,而Action只負(fù)責(zé)完成與控制有關(guān)的功能。
遵循該原那么,所以在上圖中將Action對象但為控制需局部。
本圖給出了客戶端從發(fā)出請求到獲得響應(yīng)整個(gè)過程的圖講解明。
以上我們從原理上剖析了Struts,關(guān)于具體如何應(yīng)用Struts框架框,請參看附錄A。
2、Hibernate數(shù)據(jù)持久化技術(shù)
Hibernate是一種object/relationalmapping(0RM)的持久化技術(shù)。
曾經(jīng),包括現(xiàn)在也有許多J2EE工程在直接使用SQL/JDBC實(shí)現(xiàn)持久化。眾所周知的DA0
模式讓我們把復(fù)雜的JDBC編碼和大量SQL隱藏到業(yè)務(wù)邏輯和領(lǐng)域模型之后,但這種方式實(shí)
現(xiàn)的是有限的別離,最致命的是應(yīng)用由一種數(shù)據(jù)庫向另一種數(shù)據(jù)庫迂移時(shí)可移植性非常差。
另外它要求開發(fā)者對工程中使用的關(guān)系數(shù)據(jù)庫管理系統(tǒng)非常熟悉,而且要精通SQL。
當(dāng)前可供選擇的較為流行的數(shù)據(jù)持久化技術(shù)也同樣有很多:EJB、Hibernate、JDO、OJB、
CayenneSimpleORM、JAXOR等等。
不選用EJB的理由
EJB在J2EE應(yīng)用里是一個(gè)重量級(jí)的組件,它由容器提供了分布、事務(wù)等多種企業(yè)級(jí)應(yīng)用
需要的特性。我們不選用它主要是因?yàn)椋?/p>
?兼容性問題。標(biāo)準(zhǔn)一模一樣,實(shí)現(xiàn)各有不同,當(dāng)從某一種EJB容器向另一種EJB容
器移植時(shí)維護(hù)的本錢會(huì)很高。
?性能問題。
?不支持動(dòng)態(tài)Query的問題。EntityBean最終的執(zhí)行代碼是在部署編譯時(shí)生成的,很
難實(shí)現(xiàn)動(dòng)態(tài)Query.,
?如果一個(gè)應(yīng)用對事務(wù)處理要求很高,訪問量非常大需要實(shí)現(xiàn)分布式集群時(shí)EJB才是
必須的。
選用Hibernate的理由
Hibernate是當(dāng)前最活潑,應(yīng)用最廣,更新最快,文檔最完整,功能最齊備的一個(gè)數(shù)據(jù)
持久化的開源工程。選用它的理由主要有:
?Hibernate并不直接反映數(shù)據(jù)庫中的表和列,它通過一些持久化類〔JavaBeans)來
映射到數(shù)據(jù)庫中的表上。這些持久化類與我們通常使用的JavaBeans沒有任何不同,
它們即可以由Hibernate來持久化,同樣重要的是它們也可以完全與Hibernate無
關(guān)地被使用。這是它與其它持久化模型〔比方EJB)的一個(gè)重要的區(qū)別即Hibernate
的持久化美是純JavaBeans,它可以在任何地方被使用,而不需要容器。
?Hibernate提供了一種對象導(dǎo)向的查詢語言〔HQL〕。幾乎支持所有的SQL語法,傳
統(tǒng)數(shù)據(jù)庫可以做的它就可以做。
?Hibernate提供了數(shù)據(jù)分段提取控制功能。
?將Hibernate放在SLSB后,它同樣可以實(shí)現(xiàn)分布式應(yīng)用,同樣可以利用容器提供的
JAT事務(wù)效勞。
因此我們選擇Hibernate。
Hibernate概要構(gòu)造圖:
Hibernate詳細(xì)構(gòu)造圖:
Hibernate使用概要
?手工創(chuàng)立或使用工具自動(dòng)生成Hibernate的持久化類:
文件例如:
packageeg;
importjava.util.Set;
importjava.util.Date;
/**
*@hibernate.class
*tabIe="CATS"
*/
pubIiccIassCat{
privateLongid;//identifier
privateDatebirthdate;
privateCatmate;
privateSetkittens
privateColorcolor;
privatecharsex;
privatefloatweight;
/**
*@hibernate.id
*generator-cIass="native"
*column="CAT_ID"
*/
pubIicLonggetId(){
returnid;
1
privatevoidsetId(Longid)
this.id=id;
)
/**
*@hibernate.many-to-one
*column="MATE_ID"
*/
pubIicCatgetMate0[
returnmate;
)
voidsetMate(Catmate){
this.mate=mate;
)
/**
*@hibernate.property
*column="BIRTH_DATE"
*/
pubIicDategetBirthdate(){
returnbirthdate;
)
voidsetBirthdate(Datedate)
birthdate=date;
1
*@hibernate.property
*column="WEIGHT"
*/
pubIicfloatgetWeight(){
returnweight;
1
voidsetWeight(floatweight)
this.weight=weight;
)
/**
*@hibernate.property
*column="C0L0R"
*not-nuIl="true"
*/
pubIicColorgetCoIor0(
returncolor;
1
voidsetColor(Colorcolor){
this.color=color;
)
/**
*@hibernate.set
*lazy="true"
*order-by="BIRTH_DATE"
*@hibernate.coIIection-key
*column="PARENT_ID"
*@hibernate.colIection-one-to-many
*/
pubIicSetgetKittens3(
returnkittens;
1
voidsetKittens(Setkittens){
this.kittens=kittens;
)
//addKittennotneededbyHibernate
pubIicvoidaddKitten;Catkitten){
kittens.add(kitten);
)
/**
*@hibernate.property
*column="SEX"
*not-nuIl="true"
*update="faIse"
*/
pubIicchargetSex()[
returnsex;
1
voidsetSex(charsex){
this.sex=sex;
)
1
?手工創(chuàng)立或使用工具自動(dòng)生成Hibernate的xml映射文件;
文件例如:
<?xmlversion="1.0"?>
<!DOCTYPEhibernate-mappingPUBLIC
"-//Hibernate/HibernateMappingDTD2.O//EN"
://hibernate.sourceforge.net/hibernate-mapping-2.0.dtd">
<hibernate-mapping>
<cIassname="eg.Cat"table="CATS"discriminator-vaIue="C">
<idname="id"column="uid"type="Iong">
〈generatorclass="hilo"/>
</id>
<discriminatorcoIumn="subclass"type="character"/>
<propertyname="birthdate"type="date"/)
<propertyname="color"not-null=,,true"/>
<propertyname="sex"not-null="true"update="faIse'7>
<propertyname="weight”/)
<many-to-onename="mate"column="mate_id"/>
<setname="kittens”)
<keycoIumn="mother_id"/>
<one-to-manyclass="eg.Cat"/>
</set>
<subclassname="eg.DomesticCat"
discriminator-vaIue="D">
<propertyname="name"type="string"/>
</subcIass>
</cIass>
<classname="eg.Dog”>
<!-mappingforDogcouIdgohere->
</class>
</hibernate-mapping>
?初始化Configuration
Configurationcfg=newConfiguration()
.addFiIe("Cat.hbm.xml")
.addFiIe("DomesticCat.hbm.xmI");
或
Configurationcfg=newConfiguration()
.addCIass(eg.Cat.cIass)
.addCIass(eg.DomesticCat.cIass)
?獲得SessionFactory
SessionFactorysessions=cfg.buiIdSessionFactory();
?進(jìn)展數(shù)據(jù)存取等操作
Sessionsess=sessions.openSession(conn);
//startanewtransaction(optional)
Transactiontx=sess.beginTransaction();
DomesticCatpk=newDomesticCat();
pk.setColor(Color.TABBY);
pk.setSex('F');
pk.setName("PK");
pk.setKittens(newHashSet());
pk.addKitten(fritz);
sess.save(pk,newLong(1234));
sess.fIush();//forcetheSQLINSERT
sess.refresh(cat);//re-readthestate(afterthetriggerexecutes)
txmit();
sess.cIose();
?使用HQL語言查詢
Queryq=s.createQuery("fromfooincIassFoowherefoo.name=:nameand
foo.size=:size");
q.setProperties(fooBean);//fooBeanhasgetName()andgetSize()
Listfoos=q.Iist();
需要說明的是:
Hibernate產(chǎn)生的所有SQL是運(yùn)行時(shí)產(chǎn)生的,說的更準(zhǔn)確一些是在你系統(tǒng)啟動(dòng)時(shí)產(chǎn)生。
所有我們需要的只是一個(gè)包含映射元數(shù)據(jù)的xml映射文件。
xml映射文件可以你手工來維護(hù),也可以通過植入源代碼的注釋來產(chǎn)生。
以上我們簡要介紹了Hibernate的根本特點(diǎn)及使用方法,詳細(xì)內(nèi)容請參看附錄B。
3、動(dòng)態(tài)bean技術(shù)
使用動(dòng)態(tài)bean技術(shù)的理由:
?我們不只一次抱怨信息系統(tǒng)中數(shù)據(jù)項(xiàng)變化不定,無法設(shè)計(jì)和實(shí)現(xiàn)JavaBeanso
?我們也不只一次作過這樣的事情:數(shù)據(jù)項(xiàng)增加或減少了,我需要修改信息系統(tǒng)以求
適應(yīng)。
比方我們按照某個(gè)企業(yè)的要求設(shè)計(jì)出了2000個(gè)Bean來滿足該企史對信息系統(tǒng)中業(yè)務(wù)數(shù)
據(jù)模型的需要,過了一定時(shí)間后,他們的業(yè)務(wù)發(fā)生了一定的變化,要對數(shù)據(jù)模型獷大一局部
數(shù)據(jù)項(xiàng),可想而知會(huì)有多么辛苦。動(dòng)態(tài)beans技術(shù)就是為解決此類問題而生,它為解決由于
數(shù)據(jù)項(xiàng)變化帶來的設(shè)計(jì)和實(shí)現(xiàn)的變更提供了技術(shù)根底。
動(dòng)態(tài)bean技術(shù)主要概念:
?一個(gè)Bean屬性的定義完全取決于有無訪問者方法:設(shè)置器〔setXXXO〕和獲取器
(getXXXO〕,而與在類定義中有無顯示說明字段毫無關(guān)系。
?為了使Beans能確認(rèn)一個(gè)屬性,其設(shè)置器〔setXXXO〕和獲取器〔getXXXO)必須
遵循以下命名規(guī)那么:
■一個(gè)屬性名在訪問方法中必須以大寫字母開頭;
■在其它地方以小寫字母開頭。
?獷展javaBean屬性機(jī)制:
定義了五種屬性訪問策略,使得屬性的訪問代碼像腳本一樣在運(yùn)行時(shí)決定,另外一
個(gè)進(jìn)步就是它支持List和Map屬性的元素屬性,也就是擴(kuò)展javaBean屬性機(jī)制它不把
一個(gè)Bean的某個(gè)List和Map成員看成一個(gè)整體屬性,而是動(dòng)態(tài)地把這個(gè)List和Map
成員的元素看成屬性,這樣無疑提供了一種無限擴(kuò)展Bean屬性的能力。
Common-beanutiIs1.6中的propertyUtiIs實(shí)用類使用Java語言的內(nèi)省反射功能實(shí)
現(xiàn)擴(kuò)展屬性的設(shè)置器和獲取器。propertyUtiIs定義了引用一個(gè)特定Javabean屬性的五種
格式:
■簡單屬性,格式beanName.propNpName標(biāo)識(shí)了JavaBeanbeanName的
一個(gè)屬性,這個(gè)屬性的獲取器和設(shè)置器的方法是通過JavaBean的標(biāo)準(zhǔn)內(nèi)省功能
決定的。如果要改變簡單屬性的值,必須要有設(shè)置器操作,可以想象成類似調(diào)
用beanName.[getpropName()|setpropName(vaIue)];
■嵌套屬性,格式beanName.propNamel.propName2.propName3o像簡單屬性一樣,
第一個(gè)propNamel元素被用來選擇一個(gè)屬性獲取器方法,在這個(gè)方法返回的對
象上使用propName2的獲取器方法返回下一個(gè)對象,最后這個(gè)對象的屬性
propName3被訪問或沒置,可以想象成類似調(diào)用
beanName.getpropNamel().getpropName2().[getpropName3()|setpropName3(vaIue)]
■索弓I屬性,格式beanName.propName[index]。屬性propNamel可以是一^個(gè)數(shù)組,
java.utiI.List或者JavaBeanbeanName有索引屬性獲我器和設(shè)置器操作。
bean只需propName的獲取器方法,可以想象成類似調(diào)用beanName.[getpropName
(index)|setpropName(index,vaIue)]:
■映射屬性,格式beanName.propName(key)。propName是一個(gè)java.utiI.Map實(shí)現(xiàn)。bean
只需propName的獲取器方法,可以想象成類似調(diào)用beanName.getpropName
().[get("key")|set("key",value);
■組合屬性,格式beanName.propNamel.propName2[index].propName3(key)0
?動(dòng)態(tài)bean:
動(dòng)態(tài)bean具有動(dòng)態(tài)屬性,也就是說可以由程序運(yùn)行時(shí)構(gòu)造bean的屬性,而不是像標(biāo)準(zhǔn)
的javaBean在編譯時(shí)決定一個(gè)bean的屬性。
定義和訪問一個(gè)動(dòng)態(tài)bear的步驟如下:
■定義一個(gè)動(dòng)態(tài)屬性Dynaproperty數(shù)組,動(dòng)態(tài)屬性Dynaproperty定義了一個(gè)屬
性的名字和對象類型;
■用定義好的動(dòng)態(tài)屬性數(shù)組實(shí)例化一個(gè)動(dòng)態(tài)類;
■由動(dòng)態(tài)類返回一個(gè)動(dòng)態(tài)bean;
■可以用propertyUtiIs訪問和設(shè)置動(dòng)態(tài)bean的屬性。
下面是定義和訪問動(dòng)態(tài)bean的代碼:
//TestDynaBean.java
importorg.apachemons.beanutiIs.*;
importjava.utiI.
pubIiccIassTestDynaBean{
pubIicstaticvoidmain;String[]args)(
TestBeanbean=newTestBean();
ObjectvaIue=null;
try(
Dynaproperty[]px={
newDynaproperty("subordinate",bean.getClass()),
newDynaproperty("firstName'1,
Class.forName("java.lang.String")),
newDynaproperty("IastName",
Class.forName("java.Iang.String"))
);
DynaCIassdynaCIass=newBasicDynaCIass("empIoyee",null,
PX);
DynaBeanemployee=dynaCIass.newInstance();
propertyUtiIs.setproperty(empIoyee,"subordinate",bean);
propertyUtiIs.setproperty'employee,"subordinate.IistIndexed[0]","dy
beanset");
propertyUtiIs.setproperty(empIoyee,"firstName'1,"Fred");
propertyUtiIs.setproperty(empIoyee,"IastName",
"FIintstone");
System.out.printIn("subordinate.IistIndexed[0]:");
System.out.printIn(propertyUtiIs.getproperty(empIoyee,"subordinate.Ii
stIndexed[0]"));
System,out.printIn("firstNamc:"+
propertyUtiIs.getproperty:empIoyee,"firstName"));
System.out.printIn("IastName:"+
propertyUtiIs.getproperty:empIoyee,"IastName"));
)catch(Exceptione){
System,out.printIn(e.toString());
}
)
}
從配置文件配置動(dòng)態(tài)bean的動(dòng)態(tài)屬性好處在于既能固定又能更改動(dòng)態(tài)Bean的屬
性,這些屬性是這個(gè)動(dòng)態(tài)Bean對外界的宣布的"訪問協(xié)議動(dòng)態(tài)屬性Dynaproperty的
主要構(gòu)造函數(shù)承受兩個(gè)參數(shù):第一個(gè)為屬性名稱,為字符串性,第二個(gè)為屬性的類型,
為Class類型。從配置文件讀取的資料普通為字符串型,我們可以用ClassLoader把配
置文件中字符串型的屬性類型轉(zhuǎn)化成Class類型的屬性類型。
下面struts1.1中struts-example.war的formbeans,xml中的片斷表達(dá)了如何
在配置文件中定一個(gè)動(dòng)態(tài)bean的動(dòng)態(tài)屬性:
<form-beanname="logonForm"
type="org.apache.struts,vaIidator.DynaVaIidatorForm">
<form-propertyname="username"type="java.Iang.String"/>
〈form-propertyname="password"type="java.Iang.String"/>
</form-bean>
下面RequestUtils的代碼片斷表達(dá)了如何從字符串表示的屬性類型轉(zhuǎn)化成Class型
的屬性類型:
publicstaticClassappIicationCIass(StringclassName)
throwsCIassNotFoundException(
//Lookuptheclassloadertobeused
ClassLoadercIassLoader=
Thread.currentThread().getContextCIassLoader();
if(classLoader=null){
ClassLoader=RequestUtiIs.cIass.getCIassLoader();
)
//AttempttoloadthespecifiedcIass
return(cIassLoader.IoadClass(cIassName));
)
這就是關(guān)于動(dòng)態(tài)bean的所有奧秘,RequestUtiIs類代碼片斷publicstaticActionForm
createActionForm就是這樣創(chuàng)立動(dòng)態(tài)bean的。
三、在B0NC-J0NE平臺(tái)上進(jìn)展開發(fā)
1、BONC-JONE平臺(tái)目錄說明
注意:com.bonemon、com.bone,security包屬于開發(fā)平臺(tái)根本支持包,其中的文件不
允許開發(fā)人員改動(dòng)。
2、如何使用BONC-JONE運(yùn)行起來
將開發(fā)平臺(tái)從sourcesafe拉下來后,只需要將src目錄下的bonc_init.properties
文件中boncHome=的路徑改為你所下載目錄的實(shí)際路徑,如:
boncHome=D:\\DeveIopWork\\java\\boncCrm\\exampIeroot\\WEB-1NF,做了這樣的設(shè)置后,
系統(tǒng)啟動(dòng)時(shí)就會(huì)到這個(gè)目錄下去找我們的工程配置文件bonc_config.xml。
如果你使用的是Jbuilder,還應(yīng)該將Iib目錄下的所有包文件,參加到你工程的Required
Libraries中。
做完以上工作bone-jone應(yīng)該就可以正常運(yùn)行了。
3、開發(fā)有關(guān)標(biāo)準(zhǔn)性要求及典型步驟
?應(yīng)用的包的組織規(guī)那么
■客戶關(guān)系工程中所有與應(yīng)用模塊相關(guān)的包均應(yīng)在com.bone,erm包下,如果開
發(fā)的是其他工程那么根據(jù)工程名稱來定義這個(gè)包名稱,可能是這樣的:
com.bone,sampIe等。
■在com.bone,erm包之下,以模塊名稱來分包,比方:模塊名稱是“留言模塊〃,
就要定義一個(gè)與其對應(yīng)的包c(diǎn)om.bone.erm.module,leavewordo
■在各模塊包下再分為bean包〔存放Formbean及其他本模塊可能要用到的
bean]action包〔存放Action類)與bussinessmanager業(yè)務(wù)管理包〔存放業(yè)
務(wù)管理接口類〕,比方:com.bone.erm.module,leaveword,action
com.bone.erm.module,leaveword,bean與com.bone.erm.
moduIe.Ieaveword.bussinessmanager包。
■在各模塊的業(yè)務(wù)管理包下再定義業(yè)務(wù)管理實(shí)現(xiàn)類包〔impl包存放業(yè)務(wù)管理接口
的實(shí)」見美),匕匕方:com.bone.erm.module,leaveword,bussinessmanager.implo
■包定義的要求:全部小寫字母定義。
?應(yīng)用開發(fā)中主要編寫的類的作用
■Formbean類:建議開發(fā)中盡量使用動(dòng)態(tài)Formbean〔即根據(jù)struts的配置,文
件生成的動(dòng)態(tài)bean〕,特殊情況下才寫Formbean類。該類是一個(gè)ValueObject
對象,主要的作用是包裝客戶端請求,將數(shù)據(jù)從view層傳給Action類,由
Action類轉(zhuǎn)給業(yè)務(wù)處理類進(jìn)展處理:或者由Action類更改或填充其中的數(shù)據(jù),
然后將其傳給view層來顯示。
■Action類:Action類主要完成三方面的功能,其一是做登陸及權(quán)限臉證,其
二是做數(shù)據(jù)校臉,其三〔也是最主要的〕負(fù)責(zé)完成與控制有關(guān)的功能。需要注
意的是盡可能不要此類中包含業(yè)務(wù)處理功能。
■業(yè)務(wù)管理接口類:該類是對業(yè)務(wù)對象進(jìn)展操作的抽象,是一個(gè)接口,對該業(yè)務(wù)
對象的操作均應(yīng)通過它來進(jìn)展。
■業(yè)務(wù)管理抽象類:這種類實(shí)現(xiàn)或局部實(shí)現(xiàn)業(yè)務(wù)管理接口由定義的方法,業(yè)務(wù)操
作的大局部代碼均應(yīng)該寫在這個(gè)類中。由于這個(gè)類是個(gè)抽象類,所以它不能夠
被實(shí)例化。
■業(yè)務(wù)管理實(shí)現(xiàn)類:這種類是業(yè)務(wù)管理抽象類的繼承類,通常情況下其中無實(shí)除
代碼。
?應(yīng)用開發(fā)中關(guān)鍵的配置文件的意義及功能
■web.xml文件:是Web應(yīng)用最根本的部署描述配置文件,
部署Web應(yīng)用首先要配置web.xml文件。開發(fā)人員需要在Web.xml部署描述文件中
配置:
有效的部署描述文件必須包含DTD聲明:
<!DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebAppIication
2.2//EN"://java.sun/j2ee/dtds/web-app_2_2.dtd">
web-app標(biāo)記是部署描述文件的根元素,它的子元素包括:
元素描述
icon此元素指定在GUI工具中表示此Web應(yīng)用的大圖標(biāo)和小圖
標(biāo),包含一個(gè)smal1-icon和一個(gè)large-icon元素,可使
用GIF或JPEG格式的圖像
disp1ay-name此元素提供在GUI工具中此模塊的短名字
description此元素提供關(guān)于父元素的描述性文本
distributable如果在Web應(yīng)用部署描述中使用該元素,就表示該Web應(yīng)
用可以部署到分布式Servlet容器
context-param此元素包含Web應(yīng)用的Servlet環(huán)境的初始參數(shù)
servlet包含一個(gè)servlet的聲明性數(shù)據(jù)
servlet-mapping在servlet和url模式間進(jìn)展映射
session-config聲明此Web應(yīng)用的Session參數(shù)
mime-mapping定義擴(kuò)展名和mimetype間的映射
we1come-fi1e_1ist包含we1come-fi1e子元素的順序列表
error包含一個(gè)錯(cuò)誤代碼或違例類型與web應(yīng)用中資源的映射
taglib用于描述一個(gè)JSP標(biāo)記庫
resource-ref包含一個(gè)對外部資源的引用聲明
security-constraint用于為一個(gè)或多個(gè)Web資源集合指定相應(yīng)的平安約束
1ogin-config用于配置身份卷定的方法,此應(yīng)用使用域名,以及通過表
單登錄機(jī)制那么需要設(shè)置此屬性
security-role包含使用于web應(yīng)用中<$6011「ity-constriant>元素的平
安角色的聲明
env-entry包含應(yīng)用環(huán)境變量的聲明
ejb-ref用于聲明對EJB的引用
ServletContext初始化參數(shù):
context-param標(biāo)記的子元素包括:
param-name:參數(shù)名
param-vaIue:參數(shù)值
description:參數(shù)的描述信息
例如:
<context-param>
<param-name>my_context_param_name</param-name>
<param-vaIue>ContextParamVaIue</param-vaIue>
<description>paramdescription</description>
</context-param>
Session配置
session-config標(biāo)記的子元素包括:
session-timeout:session超時(shí)時(shí)間
例如:
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
Servlet/JSP定義
servlet標(biāo)記的子元素包括:
icon:在GUI工具中的顯示圖標(biāo)
servIet-name:servlet名稱
display-name:在GUI工具中的顯示名稱
description:描述信息
servlet-class|jsp-fiIe:servlet類名稱;jsp文件的完全路徑
init-param:初始化參數(shù)列表
Ioad-on-startup:web應(yīng)用啟動(dòng)時(shí)裝載
security-roIe-ref:定義平安引用角色
servlet-mapping標(biāo)記的子元素包括:
servlet-name:servlet名稱
例如:
<servIet>
<icon>
<smaIl-icon>smaII.gif</smaIl-icon>
<Iarge-icon>IargeI.gif</1arge-icon>
</icon>
<servIet-name>my_servlet</servlet-name>
<dispIay-name>my_servlet</display-name>
<description>my_servIet</description>
<servIet-cIass>com.apusic.test.MyServIet</servIet-cIass>
<init-param>
<param-name>my_init_param</param-name>
<param-value>lnitParamVaIue</param-vaIue>
<description>paramdescripton</description>
</init-param>
<Ioadonstartup>1</Ioad-on-startup>
<security-roIe-ref>
<description>roledescription</description>
<roIe-name>my_security_roIe_name</roIe-name>
<roIe-1ink>SecurityRoIeLink</role-link>
</security-roIe-ref>
</servIet>
ServIet/JSP映射
urI-pattern:servIet映射的URL模板
<servIet-mapping>
<servIet-name>my_servIet</servIet-name>
<url-pattern>/my_url_pattern</url-pattern>
</servIet-mapping>
MIME類型映射
mime-mapping的子元素包括:
extension:獷展名
mime-type:MIME類型
例如:
<mime-mapping>
<extension>txt</extension>
<mime-type>text/plain</mime—type)
</mime-mapping>
歡送文件列表
weIcome-fiIe-1ist標(biāo)記的子元素包括:
weIcomefile;作為缺省的歡送文件名
例如:
<weIcome-file-list>
<weIcome-fiIe>
index,jsp
</weIcome-file>
<weIcome-file>
index,html
</weIcome-file>
<weIcome-fiIe>
index,htm
</weIcome-file>
</weIcome-file-list>
錯(cuò)誤頁面
error標(biāo)記的子元素包括:
error-code|exception-type:的錯(cuò)誤代碼;異常類型
location:資源在Web應(yīng)用中的位置
例如:
<error>
<error-code>404</error-code>
<Iocation>ErrorPage.jsp</1ocation>
</error>
<error>
<exception-type>ExceptionType</exception-type>
<Iocation>ErrorPage.jsp</1ocation>
</error>
平安
security-constraint標(biāo)3己的子元素包,舌:
web-resource-collection:用于區(qū)分資源子集和web應(yīng)用內(nèi)使用平安約
束的這類資源的方法。如方法未被指定,平安約束將適用于所有
的方法。
auth-constraint:指定允許訪問此資源集合的用戶角色。在此處使用的
角色必須在063「ity-role-ref>元素中進(jìn)展定義
user-data-constraint:于指出客戶端和容器間的數(shù)據(jù)交換的保護(hù)方式
login-config標(biāo)記的子元素包括:
auth-method:用于為Web應(yīng)用配置身份鑒定機(jī)制。作為對使用身份
鑒定約束保護(hù)的任何Web資源取得訪問的先決條件,用戶必須使用已
配置的身份
溫馨提示
- 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)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 人教版數(shù)學(xué)六年級(jí)下冊《練習(xí)五》具體內(nèi)容及教學(xué)建議
- 長沙醫(yī)學(xué)院《兼并與收購》2023-2024學(xué)年第二學(xué)期期末試卷
- 手足口病合并肺炎護(hù)理
- 山東省日照市嵐山區(qū)2025屆數(shù)學(xué)五年級(jí)第二學(xué)期期末達(dá)標(biāo)檢測試題含答案
- Web即時(shí)通訊系統(tǒng)課程
- 湖南三一工業(yè)職業(yè)技術(shù)學(xué)院《物流分析與設(shè)施規(guī)劃》2023-2024學(xué)年第二學(xué)期期末試卷
- 濰坊護(hù)理職業(yè)學(xué)院《企業(yè)文化研究》2023-2024學(xué)年第二學(xué)期期末試卷
- 常德職業(yè)技術(shù)學(xué)院《化工制圖與CAD實(shí)驗(yàn)》2023-2024學(xué)年第二學(xué)期期末試卷
- 西藏民族大學(xué)《實(shí)驗(yàn)室安全與規(guī)范》2023-2024學(xué)年第二學(xué)期期末試卷
- 廣安職業(yè)技術(shù)學(xué)院《教學(xué)設(shè)計(jì)團(tuán)體操創(chuàng)編理論與實(shí)踐》2023-2024學(xué)年第二學(xué)期期末試卷
- 教職工防震培訓(xùn)課件
- 維修類技能培訓(xùn)課件
- 企業(yè)環(huán)保、節(jié)能知識(shí)培訓(xùn)
- 醫(yī)院高風(fēng)險(xiǎn)意外事件應(yīng)急措施和救護(hù)機(jī)制
- (完整word版)健康SF-36量表(中文版)
- 電復(fù)律護(hù)理查房課件
- 動(dòng)火作業(yè)應(yīng)急預(yù)案范本
- 模板-機(jī)房來訪人員進(jìn)出登記表
- 預(yù)防校園欺凌法治知識(shí)競答題庫及答案
- 中國歷史文選-圖文
- 二級(jí)公路設(shè)計(jì)畢業(yè)設(shè)計(jì)(論文)-二級(jí)公路畢業(yè)設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論