Java項目開發(fā)平臺開發(fā)規(guī)范方案_第1頁
Java項目開發(fā)平臺開發(fā)規(guī)范方案_第2頁
Java項目開發(fā)平臺開發(fā)規(guī)范方案_第3頁
Java項目開發(fā)平臺開發(fā)規(guī)范方案_第4頁
Java項目開發(fā)平臺開發(fā)規(guī)范方案_第5頁
已閱讀5頁,還剩40頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

Java工程開發(fā)平臺開發(fā)標(biāo)準(zhǔn)

北京東方國信電子CRM事業(yè)部

時間:2003-8-27

目錄

Java工程開發(fā)平臺開發(fā)標(biāo)準(zhǔn)1

一、開發(fā)平臺概述2

二、技術(shù)綜述2

1、Struts框架技術(shù)2

2、Hibernate數(shù)據(jù)持久化技術(shù)4

3、動態(tài)bean技術(shù)9

三、在BONC-JONE平臺上進(jìn)展開發(fā)12

1、BONC-JONE平臺目錄說明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)限驗證?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

如何自動生成Hibernate持久化beans及map文件?42

如何使用分頁技術(shù)?44

附錄:45

附A:Struts學(xué)習(xí)精要參考45

附B:Hibernate學(xué)習(xí)精要參考45

附C:技術(shù)備忘45

一、開發(fā)平臺概述

BONG-JONE開發(fā)平臺是北京東方國信電子技術(shù)遵循“簡單、有效、先進(jìn)、可擴(kuò)〃的原

那么,通過整合Struts1.1與Hibernate2.1等優(yōu)秀的開源技術(shù)設(shè)計并實現(xiàn)的一個J2EE

開發(fā)平臺。

其架構(gòu)圖如下:

這個體系架構(gòu)的主體是MVC架構(gòu)。MVC是Model/View/Control的縮寫。

ModeI/View/ControI是軟件設(shè)計的典型構(gòu)造。在這種設(shè)計構(gòu)造下,一個應(yīng)用被分為三個局

部:Model、View和Controller,每個局部負(fù)責(zé)不同的功能。Model是指對業(yè)務(wù)數(shù)據(jù)/信息

的處理模塊,包括對業(yè)務(wù)數(shù)據(jù)的存取、加工、綜合等;View是指用戶界面,也就是面向用

戶的數(shù)據(jù)表示;Controller那么負(fù)責(zé)View和Model之間的流程控制,也就是完成兩個方向

的動作:1.將用戶界面(View)的操作映射到具體的Model,以完成具體的業(yè)務(wù)邏輯;2.將

通過Model處理完的業(yè)務(wù)數(shù)據(jù)及時反響到用戶界面(View)上。

其系統(tǒng)組成構(gòu)造圖如下:

?分層系統(tǒng)構(gòu)造還限制隔層依賴的發(fā)生,各層的通訊是由頂向下管理的。某一層僅依

賴于首接位于它下面的那一層"每一層對其他層的存在都是不知道的,除非那一層

緊鄰其下。即使是對緊鄰其下的層它也僅需要知道如何使用接口與其通訊就可以

了,而無需知道其實現(xiàn)細(xì)節(jié)。

BONC-JONE開發(fā)平臺通過Struts+Tiles技術(shù)實現(xiàn)了MVC模式中的表示層和控制層,通

過Hibernate技術(shù)結(jié)合動態(tài)Bean技術(shù)融合成獨特的業(yè)務(wù)Beans技術(shù)構(gòu)建了數(shù)據(jù)層。

二、技術(shù)綜述

1、Struts框架技術(shù)

Struts是一個基于J2EE的MVC框架。

J2EE體系包括JSP、Servlet.EJ3、WEBSERVICE等多項技術(shù)。這些技術(shù)的出現(xiàn)給電子商務(wù)

時代的WEB應(yīng)用開發(fā)提供了一個非常有競爭力的選擇。但怎樣把這些技術(shù)組合起來,形成一

個適應(yīng)工程需要的穩(wěn)定架構(gòu)對工程開發(fā)是非常重要的。

設(shè)計一個框架,需要考慮的方面很多,不僅要對J2EE體系中的各種技術(shù)進(jìn)展篩選取舍,

并要考慮到開發(fā)過程中的角色分工、后期的運(yùn)行維護(hù),以及系統(tǒng)擴(kuò)展性等諸多因親。

因此,一個成功的軟件需要有一個成功的架構(gòu)。

MVC架構(gòu)使得應(yīng)用程序的構(gòu)造更加清晰,通過將代碼按照層次劃分為業(yè)務(wù)邏輯/數(shù)據(jù)、用

戶界面和應(yīng)用流程控制這三個層次,增強(qiáng)代碼穩(wěn)定性。我們知道,對于Model.View、

ControlIer這三局部功能來講,View的實現(xiàn)一般是由界面設(shè)計人員和界面程序員來完成,

Model那么是由業(yè)務(wù)邏輯程序員來完成,Controller那么一般由負(fù)責(zé)整體控制的程序員來完

成。Controller局部的代碼比擬穩(wěn)定,一般會實現(xiàn)一個通用的架構(gòu):而Model那么跟隨商

務(wù)流程的變化而變化;View的更改那么是隨著用戶需求的更改而更改。這種模塊功能的劃

分有利于在代碼修改正程中進(jìn)展模塊的隔離,而不需要把具有不同功能的代碼混雜在一起造

成混亂。對于工程開發(fā)而言,有利于在工程小組內(nèi)按照小組成員各自的擅長進(jìn)展分工,有利

于三個局部并行開發(fā)、加快工程進(jìn)度。

當(dāng)前可供選擇的較為流行的MVC框架有六種之多:Struts^Maverick、WebWorkTurbine、

ReaIMothods>AOP(aspect-orientedprogramming]0它們應(yīng)用的領(lǐng)域,及實現(xiàn)的側(cè)重點各有

不同。但以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這個名字來源于在建筑和舊式飛機(jī)中使用的支持金屬架。它的目的是為了幫助我們

減少在運(yùn)用MVC設(shè)計模型來開發(fā)Web應(yīng)用的時間。

因此我們選擇Struts0

Struts鼓勵按照Model2方式構(gòu)建應(yīng)用的體系。Model2是MVC根本設(shè)計模式的一種變

體。MVC設(shè)計模式的優(yōu)點是,它使得Model、View和Controller各個局部之間相對獨立。

Struts在一個中心位置裝配ActionServlet、ActionMapping和各種Action類,處理所有

傳入的ServletRequestoActionServlet把各個傳入的SezvletRequest分發(fā)給

Action類,而ActionMapping對象可通過Struts-config.xml配置文件控制,它告訴

ActionServlet如何分發(fā)請求。

本圖示意了Struts各個局部之間的通信過程

Controller的功能:在客戶端、View和Model之間起協(xié)調(diào)、仲裁的作用。只有Controller

才會與ModeI和Vicw聯(lián)系,在這中間它就象是一1個交換機(jī),而ModeI和Vicw之間不會直接

通信,這樣,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局部的組件,因為這些組件才是真正處理數(shù)據(jù)的地方。把數(shù)據(jù)保存到數(shù)據(jù)庫也

應(yīng)當(dāng)是Model的功能之一。

當(dāng)Controller處理好一個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容器會自

動把JSP轉(zhuǎn)換成Servleto

Struts框架將其側(cè)重點放在了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類的使用方式是一個關(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的子類對象,它其實就是一個JavaBean。此外,還可以在

ActionForm類中調(diào)用validate方法來檢查請求參數(shù)的合法性,并且可以返回一個

包含所有錯誤信息的ActonErrors對象。如果執(zhí)行成功,ActionForm自動將這些

參數(shù)信息以JavaBean[一般稱之為formbean]的方式保存在ServletContext中,

這樣它們就可以被其它Action對象或者JSP調(diào)用。Struts將這些ActionForm的配

置信息都放在FormBeanConfig集合中,通過它們Struts能夠知道針對某個客戶請

求是否需要創(chuàng)立相應(yīng)的ActionForm實例。

?Action很簡單,一般只包含一個execute方法,它負(fù)責(zé)執(zhí)行相應(yīng)的業(yè)務(wù)邏輯,如果

需要,它也進(jìn)展相應(yīng)的數(shù)據(jù)檢查。執(zhí)行完成之后,返回一個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)整個過程的圖講解明。

以上我們從原理上剖析了Struts,關(guān)于具體如何應(yīng)用Struts框架框,請參看附錄A。

2、Hibernate數(shù)據(jù)持久化技術(shù)

Hibernate是一種object/relationalmapping(0RM)的持久化技術(shù)。

曾經(jīng),包括現(xiàn)在也有許多J2EE工程在直接使用SQL/JDBC實現(xiàn)持久化。眾所周知的DA0

模式讓我們把復(fù)雜的JDBC編碼和大量SQL隱藏到業(yè)務(wù)邏輯和領(lǐng)域模型之后,但這種方式實

現(xiàn)的是有限的別離,最致命的是應(yīng)用由一種數(shù)據(jù)庫向另一種數(shù)據(jù)庫迂移時可移植性非常差。

另外它要求開發(fā)者對工程中使用的關(guān)系數(shù)據(jù)庫管理系統(tǒng)非常熟悉,而且要精通SQL。

當(dāng)前可供選擇的較為流行的數(shù)據(jù)持久化技術(shù)也同樣有很多:EJB、Hibernate、JDO、OJB、

CayenneSimpleORM、JAXOR等等。

不選用EJB的理由

EJB在J2EE應(yīng)用里是一個重量級的組件,它由容器提供了分布、事務(wù)等多種企業(yè)級應(yīng)用

需要的特性。我們不選用它主要是因為:

?兼容性問題。標(biāo)準(zhǔn)一模一樣,實現(xiàn)各有不同,當(dāng)從某一種EJB容器向另一種EJB容

器移植時維護(hù)的本錢會很高。

?性能問題。

?不支持動態(tài)Query的問題。EntityBean最終的執(zhí)行代碼是在部署編譯時生成的,很

難實現(xiàn)動態(tài)Query.,

?如果一個應(yīng)用對事務(wù)處理要求很高,訪問量非常大需要實現(xiàn)分布式集群時EJB才是

必須的。

選用Hibernate的理由

Hibernate是當(dāng)前最活潑,應(yīng)用最廣,更新最快,文檔最完整,功能最齊備的一個數(shù)據(jù)

持久化的開源工程。選用它的理由主要有:

?Hibernate并不直接反映數(shù)據(jù)庫中的表和列,它通過一些持久化類〔JavaBeans)來

映射到數(shù)據(jù)庫中的表上。這些持久化類與我們通常使用的JavaBeans沒有任何不同,

它們即可以由Hibernate來持久化,同樣重要的是它們也可以完全與Hibernate無

關(guān)地被使用。這是它與其它持久化模型〔比方EJB)的一個重要的區(qū)別即Hibernate

的持久化美是純JavaBeans,它可以在任何地方被使用,而不需要容器。

?Hibernate提供了一種對象導(dǎo)向的查詢語言〔HQL〕。幾乎支持所有的SQL語法,傳

統(tǒng)數(shù)據(jù)庫可以做的它就可以做。

?Hibernate提供了數(shù)據(jù)分段提取控制功能。

?將Hibernate放在SLSB后,它同樣可以實現(xiàn)分布式應(yīng)用,同樣可以利用容器提供的

JAT事務(wù)效勞。

因此我們選擇Hibernate。

Hibernate概要構(gòu)造圖:

Hibernate詳細(xì)構(gòu)造圖:

Hibernate使用概要

?手工創(chuà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)立或使用工具自動生成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)行時產(chǎn)生的,說的更準(zhǔn)確一些是在你系統(tǒng)啟動時產(chǎn)生。

所有我們需要的只是一個包含映射元數(shù)據(jù)的xml映射文件。

xml映射文件可以你手工來維護(hù),也可以通過植入源代碼的注釋來產(chǎn)生。

以上我們簡要介紹了Hibernate的根本特點及使用方法,詳細(xì)內(nèi)容請參看附錄B。

3、動態(tài)bean技術(shù)

使用動態(tài)bean技術(shù)的理由:

?我們不只一次抱怨信息系統(tǒng)中數(shù)據(jù)項變化不定,無法設(shè)計和實現(xiàn)JavaBeanso

?我們也不只一次作過這樣的事情:數(shù)據(jù)項增加或減少了,我需要修改信息系統(tǒng)以求

適應(yīng)。

比方我們按照某個企業(yè)的要求設(shè)計出了2000個Bean來滿足該企史對信息系統(tǒng)中業(yè)務(wù)數(shù)

據(jù)模型的需要,過了一定時間后,他們的業(yè)務(wù)發(fā)生了一定的變化,要對數(shù)據(jù)模型獷大一局部

數(shù)據(jù)項,可想而知會有多么辛苦。動態(tài)beans技術(shù)就是為解決此類問題而生,它為解決由于

數(shù)據(jù)項變化帶來的設(shè)計和實現(xiàn)的變更提供了技術(shù)根底。

動態(tài)bean技術(shù)主要概念:

?一個Bean屬性的定義完全取決于有無訪問者方法:設(shè)置器〔setXXXO〕和獲取器

(getXXXO〕,而與在類定義中有無顯示說明字段毫無關(guān)系。

?為了使Beans能確認(rèn)一個屬性,其設(shè)置器〔setXXXO〕和獲取器〔getXXXO)必須

遵循以下命名規(guī)那么:

■一個屬性名在訪問方法中必須以大寫字母開頭;

■在其它地方以小寫字母開頭。

?獷展javaBean屬性機(jī)制:

定義了五種屬性訪問策略,使得屬性的訪問代碼像腳本一樣在運(yùn)行時決定,另外一

個進(jìn)步就是它支持List和Map屬性的元素屬性,也就是擴(kuò)展javaBean屬性機(jī)制它不把

一個Bean的某個List和Map成員看成一個整體屬性,而是動態(tài)地把這個List和Map

成員的元素看成屬性,這樣無疑提供了一種無限擴(kuò)展Bean屬性的能力。

Common-beanutiIs1.6中的propertyUtiIs實用類使用Java語言的內(nèi)省反射功能實

現(xiàn)擴(kuò)展屬性的設(shè)置器和獲取器。propertyUtiIs定義了引用一個特定Javabean屬性的五種

格式:

■簡單屬性,格式beanName.propNpName標(biāo)識了JavaBeanbeanName的

一個屬性,這個屬性的獲取器和設(shè)置器的方法是通過JavaBean的標(biāo)準(zhǔn)內(nèi)省功能

決定的。如果要改變簡單屬性的值,必須要有設(shè)置器操作,可以想象成類似調(diào)

用beanName.[getpropName()|setpropName(vaIue)];

■嵌套屬性,格式beanName.propNamel.propName2.propName3o像簡單屬性一樣,

第一個propNamel元素被用來選擇一個屬性獲取器方法,在這個方法返回的對

象上使用propName2的獲取器方法返回下一個對象,最后這個對象的屬性

propName3被訪問或沒置,可以想象成類似調(diào)用

beanName.getpropNamel().getpropName2().[getpropName3()|setpropName3(vaIue)]

■索弓I屬性,格式beanName.propName[index]。屬性propNamel可以是一^個數(shù)組,

java.utiI.List或者JavaBeanbeanName有索引屬性獲我器和設(shè)置器操作。

bean只需propName的獲取器方法,可以想象成類似調(diào)用beanName.[getpropName

(index)|setpropName(index,vaIue)]:

■映射屬性,格式beanName.propName(key)。propName是一個java.utiI.Map實現(xiàn)。bean

只需propName的獲取器方法,可以想象成類似調(diào)用beanName.getpropName

().[get("key")|set("key",value);

■組合屬性,格式beanName.propNamel.propName2[index].propName3(key)0

?動態(tài)bean:

動態(tài)bean具有動態(tài)屬性,也就是說可以由程序運(yùn)行時構(gòu)造bean的屬性,而不是像標(biāo)準(zhǔn)

的javaBean在編譯時決定一個bean的屬性。

定義和訪問一個動態(tài)bear的步驟如下:

■定義一個動態(tài)屬性Dynaproperty數(shù)組,動態(tài)屬性Dynaproperty定義了一個屬

性的名字和對象類型;

■用定義好的動態(tài)屬性數(shù)組實例化一個動態(tài)類;

■由動態(tài)類返回一個動態(tài)bean;

■可以用propertyUtiIs訪問和設(shè)置動態(tài)bean的屬性。

下面是定義和訪問動態(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());

}

)

}

從配置文件配置動態(tài)bean的動態(tài)屬性好處在于既能固定又能更改動態(tài)Bean的屬

性,這些屬性是這個動態(tài)Bean對外界的宣布的"訪問協(xié)議動態(tài)屬性Dynaproperty的

主要構(gòu)造函數(shù)承受兩個參數(shù):第一個為屬性名稱,為字符串性,第二個為屬性的類型,

為Class類型。從配置文件讀取的資料普通為字符串型,我們可以用ClassLoader把配

置文件中字符串型的屬性類型轉(zhuǎn)化成Class類型的屬性類型。

下面struts1.1中struts-example.war的formbeans,xml中的片斷表達(dá)了如何

在配置文件中定一個動態(tài)bean的動態(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)于動態(tài)bean的所有奧秘,RequestUtiIs類代碼片斷publicstaticActionForm

createActionForm就是這樣創(chuàng)立動態(tài)bean的。

三、在B0NC-J0NE平臺上進(jìn)展開發(fā)

1、BONC-JONE平臺目錄說明

注意:com.bonemon、com.bone,security包屬于開發(fā)平臺根本支持包,其中的文件不

允許開發(fā)人員改動。

2、如何使用BONC-JONE運(yùn)行起來

將開發(fā)平臺從sourcesafe拉下來后,只需要將src目錄下的bonc_init.properties

文件中boncHome=的路徑改為你所下載目錄的實際路徑,如:

boncHome=D:\\DeveIopWork\\java\\boncCrm\\exampIeroot\\WEB-1NF,做了這樣的設(shè)置后,

系統(tǒng)啟動時就會到這個目錄下去找我們的工程配置文件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ù)工程名稱來定義這個包名稱,可能是這樣的:

com.bone,sampIe等。

■在com.bone,erm包之下,以模塊名稱來分包,比方:模塊名稱是“留言模塊〃,

就要定義一個與其對應(yīng)的包com.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ù)管理實現(xiàn)類包〔impl包存放業(yè)務(wù)管理接口

的實」見美),匕匕方:com.bone.erm.module,leaveword,bussinessmanager.implo

■包定義的要求:全部小寫字母定義。

?應(yīng)用開發(fā)中主要編寫的類的作用

■Formbean類:建議開發(fā)中盡量使用動態(tài)Formbean〔即根據(jù)struts的配置,文

件生成的動態(tài)bean〕,特殊情況下才寫Formbean類。該類是一個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)展操作的抽象,是一個接口,對該業(yè)務(wù)

對象的操作均應(yīng)通過它來進(jìn)展。

■業(yè)務(wù)管理抽象類:這種類實現(xiàn)或局部實現(xiàn)業(yè)務(wù)管理接口由定義的方法,業(yè)務(wù)操

作的大局部代碼均應(yīng)該寫在這個類中。由于這個類是個抽象類,所以它不能夠

被實例化。

■業(yè)務(wù)管理實現(xiàn)類:這種類是業(yè)務(wù)管理抽象類的繼承類,通常情況下其中無實除

代碼。

?應(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),包含一個smal1-icon和一個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包含一個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包含一個錯誤代碼或違例類型與web應(yīng)用中資源的映射

taglib用于描述一個JSP標(biāo)記庫

resource-ref包含一個對外部資源的引用聲明

security-constraint用于為一個或多個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超時時間

例如:

<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)用啟動時裝載

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>

錯誤頁面

error標(biāo)記的子元素包括:

error-code|exception-type:的錯誤代碼;異常類型

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)容里面會有圖紙預(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

提交評論