Java項(xiàng)目開發(fā)平臺(tái)開發(fā)規(guī)范_第1頁(yè)
Java項(xiàng)目開發(fā)平臺(tái)開發(fā)規(guī)范_第2頁(yè)
Java項(xiàng)目開發(fā)平臺(tái)開發(fā)規(guī)范_第3頁(yè)
Java項(xiàng)目開發(fā)平臺(tái)開發(fā)規(guī)范_第4頁(yè)
Java項(xiàng)目開發(fā)平臺(tái)開發(fā)規(guī)范_第5頁(yè)
已閱讀5頁(yè),還剩47頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、Java項(xiàng)目開發(fā)平臺(tái)開發(fā)規(guī)范_北京東方國(guó)信電子有限公司CRM事業(yè)部時(shí)間:2003-8-27目 錄Java項(xiàng)目開發(fā)平臺(tái)開發(fā)規(guī)范1一、開發(fā)平臺(tái)概述3二、技術(shù)綜述51、Struts框架技術(shù)52、Hibernate數(shù)據(jù)持久化技術(shù)93、動(dòng)態(tài)bean技術(shù)15三、在BONC-JONE平臺(tái)上進(jìn)行開發(fā)191、BONC-JONE平臺(tái)目錄說明192、如何使用BONC-JONE運(yùn)行起來193、開發(fā)有關(guān)規(guī)范性要求及典型步驟19四、主要函數(shù)及使用技術(shù)方法說明43如何使用自定義標(biāo)簽庫(kù)?43如何使用日志類寫日志?45如何進(jìn)行資源注冊(cè)?48如何進(jìn)行登陸權(quán)限驗(yàn)證?48如何進(jìn)行字符轉(zhuǎn)換?48如何對(duì)資源文件進(jìn)行字符轉(zhuǎn)換?48如何配置

2、、讀取應(yīng)用配置信息?48如何打包boncpersistenceobj.jar文件?48數(shù)據(jù)操作方法的原理是怎樣的?48如何將任意文件上傳到數(shù)據(jù)庫(kù)中,又如何下載?48如何保證在頁(yè)面清空的字段能正確提交到數(shù)據(jù)庫(kù)?48如何使用日期控件?49如何使用DBQuery類進(jìn)行數(shù)據(jù)查詢?49如何自動(dòng)生成Hibernate持久化beans及map文件?49如何使用分頁(yè)技術(shù)?51附錄:54附A:Struts學(xué)習(xí)精要參考54附B:Hibernate學(xué)習(xí)精要參考54附C:技術(shù)備忘54一、開發(fā)平臺(tái)概述BONCJONE開發(fā)平臺(tái)是北京東方國(guó)信電子技術(shù)有限公司遵循“簡(jiǎn)單、有效、先進(jìn)、可擴(kuò)”的原則,通過整合Struts 1.1

3、與Hibernate 2.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的縮寫。Model/View/Control是軟件設(shè)計(jì)的典型結(jié)構(gòu)。在這種設(shè)計(jì)結(jié)構(gòu)下,一個(gè)應(yīng)用被分為三個(gè)部分:Model、View和Controller,每個(gè)部分負(fù)責(zé)不同的功能。Model是指對(duì)業(yè)務(wù)數(shù)據(jù)/信息的處理模塊,包括對(duì)業(yè)務(wù)數(shù)據(jù)的存取、加工、綜合等;View是指用戶界面,也就是面向用戶的數(shù)據(jù)表示;Controller則負(fù)責(zé)View和Model之間的流程控制,也就是完成兩個(gè)方向的動(dòng)作:1.將用戶界面(View)的操作映射到具體

4、的Model,以完成具體的業(yè)務(wù)邏輯;2. 將通過Model處理完的業(yè)務(wù)數(shù)據(jù)及時(shí)反應(yīng)到用戶界面(View)上。其系統(tǒng)組成結(jié)構(gòu)圖如下:平臺(tái)輔助API表示層StrutsTiles業(yè)務(wù)層業(yè)務(wù)管理接口業(yè)務(wù)管理抽象類業(yè)務(wù)管理實(shí)現(xiàn)類業(yè)務(wù)Beans技術(shù)JDBC持久化層Hibernate連接池技術(shù)數(shù)據(jù)庫(kù)DataBaseBONCJONE開發(fā)平臺(tái)從總體結(jié)構(gòu)上充分體現(xiàn)了分層的系統(tǒng)設(shè)計(jì)思想。分層的概念起源于操作系統(tǒng)及網(wǎng)絡(luò)協(xié)議設(shè)計(jì)中,但目前這個(gè)概念已在所有面向?qū)ο蟮膽?yīng)用系統(tǒng)中相當(dāng)流行了。BONCJONE開發(fā)平臺(tái)主要層次分為:表示層、業(yè)務(wù)層、持久化層及一些各層公用的工具類庫(kù)。分層的系統(tǒng)設(shè)計(jì)思想的重點(diǎn)在于:l 一個(gè)分層的系統(tǒng)

5、在各相關(guān)層的實(shí)現(xiàn)代碼間定義了接口,從而允許一個(gè)層的實(shí)現(xiàn)代碼的變化不會(huì)影響到其它的層。l 分層系統(tǒng)結(jié)構(gòu)還限制隔層依賴的發(fā)生,各層的通訊是由頂向下管理的。某一層僅依賴于直接位于它下面的那一層。每一層對(duì)其他層的存在都是不知道的,除非那一層緊鄰其下。即使是對(duì)緊鄰其下的層它也僅需要知道如何使用接口與其通訊就可以了,而無(wú)需知道其實(shí)現(xiàn)細(xì)節(jié)。BONCJONE開發(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框架。 J2E

6、E體系包括JSP、Servlet、EJB、WEB SERVICE等多項(xiàng)技術(shù)。這些技術(shù)的出現(xiàn)給電子商務(wù)時(shí)代的WEB應(yīng)用開發(fā)提供了一個(gè)非常有競(jìng)爭(zhēng)力的選擇。但怎樣把這些技術(shù)組合起來,形成一個(gè)適應(yīng)項(xiàng)目需要的穩(wěn)定架構(gòu)對(duì)項(xiàng)目開發(fā)是非常重要的。 設(shè)計(jì)一個(gè)框架,需要考慮的方面很多,不僅要對(duì)J2EE體系中的各種技術(shù)進(jìn)行篩選取舍,并要考慮到開發(fā)過程中的角色分工、后期的運(yùn)行維護(hù),以及系統(tǒng)擴(kuò)展性等諸多因素。 因此,一個(gè)成功的軟件需要有一個(gè)成功的架構(gòu)。MVC架構(gòu)使得應(yīng)用程序的結(jié)構(gòu)更加清晰,通過將代碼按照層次劃分為業(yè)務(wù)邏輯/數(shù)據(jù)、用戶界面和應(yīng)用流程控制這三個(gè)層次,增強(qiáng)代碼穩(wěn)定性。我們知道,對(duì)于Model、View、Con

7、troller這三部分功能來講,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)行模塊的隔離,而不需要把具有不同功能的代碼混雜在一起造成混亂。對(duì)于項(xiàng)目開發(fā)而言,有利于在項(xiàng)目小組內(nèi)按照小組成員各自的擅長(zhǎng)進(jìn)行分工,有利于三個(gè)部分并行開發(fā)、加快項(xiàng)目進(jìn)度。 當(dāng)前可供選擇的較為流行的MVC框架有六種之多:Struts

8、、Maverick、WebWork、Turbine、RealMothods、AOP(aspect-oriented programming)。它們應(yīng)用的領(lǐng)域及實(shí)現(xiàn)的側(cè)重點(diǎn)各有不同。但以Struts應(yīng)用最廣,是基于MVC模式的Web應(yīng)用最經(jīng)典框架,當(dāng)推首選。 Struts最早是作為Apache Jakarta項(xiàng)目的組成部分問世。項(xiàng)目的創(chuàng)立者希望通過對(duì)該項(xiàng)目的研究,改進(jìn)和提高Java Server Pages (JSPs)、Servlet、標(biāo)簽庫(kù)以及面向?qū)ο蟮募夹g(shù)水準(zhǔn)。 Struts這個(gè)名字來源于在建筑和舊式飛機(jī)中使用的支持金屬架。它的目的是為了幫助我們減少在運(yùn)用MVC設(shè)計(jì)模型來開發(fā)Web應(yīng)用的時(shí)

9、間。 因此我們選擇Struts。Struts鼓勵(lì)按照Model 2方式構(gòu)建應(yīng)用的體系。Model 2是MVC基本設(shè)計(jì)模式的一種變體。MVC設(shè)計(jì)模式的優(yōu)點(diǎn)是,它使得Model、View和Controller各個(gè)部分之間相對(duì)獨(dú)立。Struts在一個(gè)中心位置裝配ActionServlet、ActionMapping和各種Action類,處理所有傳入的HttpServletRequest。ActionServlet把各個(gè)傳入的HttpServletRequest分發(fā)給Action類,而ActionMapping對(duì)象可通過Struts-config.xml配置文件控制,它告訴ActionServlet如

10、何分發(fā)請(qǐng)求。 本圖示意了Struts各個(gè)部分之間的通信過程Controller的功能:在客戶端、View和Model之間起協(xié)調(diào)、仲裁的作用。只有Controller才會(huì)與Model和View聯(lián)系,在這中間它就象是一個(gè)交換機(jī),而Model和View之間不會(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ù)的地

11、方。把數(shù)據(jù)保存到數(shù)據(jù)庫(kù)也應(yīng)當(dāng)是Model的功能之一。當(dāng)Controller處理好一個(gè)HttpServletRequest,它把請(qǐng)求轉(zhuǎn)發(fā)給View。View的唯一任務(wù)是表現(xiàn)數(shù)據(jù),在Struts中,View一般使用JSP技術(shù)。在Struts中,Controller和View之間的所有通信都通過HttpServletRequest、HttpSession和ServletContext間接完成,對(duì)于這些操作來說,首選的技術(shù)莫過于Servlet,Struts直接把HttpServletRequest傳遞給Servlet或者是JSP,不過Servlet容器會(huì)自動(dòng)把JSP轉(zhuǎn)換成Servlet。Struts框

12、架將其側(cè)重點(diǎn)放在了Controller與View層。View由JSP定制標(biāo)記庫(kù)和JSP頁(yè)面共同構(gòu)造,其中ActionForm類是一種類似JavaBean的ValueObject對(duì)象,帶有set和get方法,用來保存客戶的狀態(tài)。按照Struts的MVC概念,ActionForm位于View和Controller之間的中間地帶。Struts提供了一組完備的專用標(biāo)記,用來從JSP訪問ActionForm里面的數(shù)據(jù)。Controller由ActionServlet、ActionMapping和各種Action類相互配合來完成。其中Action類給開發(fā)人員自由發(fā)揮的空間比較大,因此,在開發(fā)過程中完整地遵

13、從MVC的概念A(yù)ction類的使用方式是一個(gè)關(guān)鍵。對(duì)于Struts的解剖。圖解說明:其中不同顏色代表MVC的不同部分:紅色(控制器)、紫色(模型)和綠色(視圖)l 首先,控制器(ActionServlet)進(jìn)行初始化工作,讀取配置文件(struts-config.xml),為不同的Struts模塊初始化相應(yīng)的ModuleConfig對(duì)象。比如配置文件中的Action映射定義都保存在ActionConfig集合中。相應(yīng)地有ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig集合等。l 控制器接收HTTP請(qǐng)求

14、,并從ActionConfig中找出對(duì)應(yīng)于該請(qǐng)求的Action子類,如果沒有對(duì)應(yīng)的Action,控制器直接將請(qǐng)求轉(zhuǎn)發(fā)給JSP或者靜態(tài)頁(yè)面。否則控制器將請(qǐng)求分發(fā)至具體Action類進(jìn)行處理。l 在控制器調(diào)用具體Action的execute方法之前,ActionForm對(duì)象將利用HTTP請(qǐng)求中的參數(shù)來填充自己(可選步驟,需要在配置文件中指定)。具體的ActionForm對(duì)象應(yīng)該是ActionForm的子類對(duì)象,它其實(shí)就是一個(gè)JavaBean。此外,還可以在ActionForm類中調(diào)用validate方法來檢查請(qǐng)求參數(shù)的合法性,并且可以返回一個(gè)包含所有錯(cuò)誤信息的ActionErrors對(duì)象。如果執(zhí)行

15、成功,ActionForm自動(dòng)將這些參數(shù)信息以JavaBean(一般稱之為form bean)的方式保存在Servlet Context中,這樣它們就可以被其它Action對(duì)象或者JSP調(diào)用。Struts將這些ActionForm的配置信息都放在FormBeanConfig集合中,通過它們Struts能夠知道針對(duì)某個(gè)客戶請(qǐng)求是否需要?jiǎng)?chuàng)建相應(yīng)的ActionForm實(shí)例。l Action很簡(jiǎn)單,一般只包含一個(gè)execute方法,它負(fù)責(zé)執(zhí)行相應(yīng)的業(yè)務(wù)邏輯,如果需要,它也進(jìn)行相應(yīng)的數(shù)據(jù)檢查。執(zhí)行完成之后,返回一個(gè)ActionForward對(duì)象,控制器通過該ActionForward對(duì)象來進(jìn)行轉(zhuǎn)發(fā)工作。

16、我們主張將獲取數(shù)據(jù)和執(zhí)行業(yè)務(wù)邏輯的功能放到具體的JavaBean當(dāng)中,而Action只負(fù)責(zé)完成與控制有關(guān)的功能。遵循該原則,所以在上圖中將Action對(duì)象歸為控制器部分。本圖給出了客戶端從發(fā)出請(qǐng)求到獲得響應(yīng)整個(gè)過程的圖解說明。以上我們從原理上剖析了Struts,關(guān)于具體如何應(yīng)用Struts框架框,請(qǐng)參看附錄A。2、Hibernate數(shù)據(jù)持久化技術(shù) Hibernate 是一種object/relational mapping (ORM)的持久化技術(shù)。 曾經(jīng),包括現(xiàn)在也有許多J2EE項(xiàng)目在直接使用SQL/JDBC實(shí)現(xiàn)持久化。眾所周知的DAO模式讓我們把復(fù)雜的JDBC編碼和大量SQL隱藏到業(yè)務(wù)邏輯和

17、領(lǐng)域模型之后,但這種方式實(shí)現(xiàn)的是有限的分離,最致命的是應(yīng)用由一種數(shù)據(jù)庫(kù)向另一種數(shù)據(jù)庫(kù)遷移時(shí)可移植性非常差。另外它要求開發(fā)者對(duì)項(xiàng)目中使用的關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)非常熟悉,而且要精通SQL。 當(dāng)前可供選擇的較為流行的數(shù)據(jù)持久化技術(shù)也同樣有很多:EJB、Hibernate、JDO、OJB、Cayenne、SimpleORM、JAXOR等等。 不選用EJB的理由 EJB在J2EE應(yīng)用里是一個(gè)重量級(jí)的組件,它由容器提供了分布、事務(wù)等多種企業(yè)級(jí)應(yīng)用需要的特性。我們不選用它主要是因?yàn)椋簂 兼容性問題。規(guī)范一模一樣,實(shí)現(xiàn)各有不同,當(dāng)從某一種EJB容器向另一種EJB容器移植時(shí)維護(hù)的成本會(huì)很高。l 性能問題。l 不支

18、持動(dòng)態(tài)Query的問題。Entity Bean最終的執(zhí)行代碼是在部署編譯時(shí)生成的,很難實(shí)現(xiàn)動(dòng)態(tài)Query。l 如果一個(gè)應(yīng)用對(duì)事務(wù)處理要求很高,訪問量非常大需要實(shí)現(xiàn)分布式集群時(shí)EJB才是必須的。選用Hibernate的理由 Hibernate是當(dāng)前最活躍,應(yīng)用最廣,更新最快,文檔最完整,功能最齊備的一個(gè)數(shù)據(jù)持久化的開源項(xiàng)目。選用它的理由主要有:l Hibernate并不直接反映數(shù)據(jù)庫(kù)中的表和列,它通過一些持久化類(JavaBeans)來映射到數(shù)據(jù)庫(kù)中的表上。這些持久化類與我們通常使用的JavaBeans沒有任何不同,它們即可以由Hibernate來持久化,同樣重要的是它們也可以完全與Hibern

19、ate無(wú)關(guān)地被使用。這是它與其它持久化模型(比如EJB)的一個(gè)重要的區(qū)別即Hibernate的持久化類是純JavaBeans,它可以在任何地方被使用,而不需要容器。l Hibernate提供了一種對(duì)象導(dǎo)向的查詢語(yǔ)言(HQL)。幾乎支持所有的SQL語(yǔ)法,傳統(tǒng)數(shù)據(jù)庫(kù)可以做的它就可以做。l Hibernate提供了數(shù)據(jù)分段提取控制功能。l 將Hibernate放在SLSB后,它同樣可以實(shí)現(xiàn)分布式應(yīng)用,同樣可以利用容器提供的JAT事務(wù)服務(wù)。因此我們選擇Hibernate。Hibernate概要結(jié)構(gòu)圖:Hibernate詳細(xì)結(jié)構(gòu)圖:Hibernate使用概要l 手工創(chuàng)建或使用工具自動(dòng)生成Hibernat

20、e的持久化類;文件示例:package eg;import java.util.Set;import java.util.Date;/* * hibernate.class * table="CATS" */public class Cat private Long id; / identifier private Date birthdate; private Cat mate; private Set kittens private Color color; private char sex; private float weight; /* * hibernate.i

21、d * generator-class="native" * column="CAT_ID" */ public Long getId() return id; private void setId(Long id) this.id=id; /* * hibernate.many-to-one * column="MATE_ID" */ public Cat getMate() return mate; void setMate(Cat mate) this.mate = mate; /* * perty *

22、 column="BIRTH_DATE" */ public Date getBirthdate() return birthdate; void setBirthdate(Date date) birthdate = date; /* * perty * column="WEIGHT" */ public float getWeight() return weight; void setWeight(float weight) this.weight = weight; /* * perty * co

23、lumn="COLOR" * not-null="true" */ public Color getColor() return color; void setColor(Color color) this.color = color; /* * hibernate.set * lazy="true" * order-by="BIRTH_DATE" * hibernate.collection-key * column="PARENT_ID" * hibernate.collection-one

24、-to-many */ public Set getKittens() return kittens; void setKittens(Set kittens) this.kittens = kittens; / addKitten not needed by Hibernate public void addKitten(Cat kitten) kittens.add(kitten); /* * perty * column="SEX" * not-null="true" * update="false"

25、*/ public char getSex() return sex; void setSex(char sex) this.sex=sex; l 手工創(chuàng)建或使用工具自動(dòng)生成Hibernate的xml映射文件;文件示例:<?xml version="1.0"?><!DOCTYPE hibernate-mapping PUBLIC "-/Hibernate/Hibernate Mapping DTD 2.0/EN" "<hibernate-mapping> <class name="eg.Cat&qu

26、ot; table="CATS" discriminator-value="C"> <id name="id" column="uid" type="long"> <generator class="hilo"/> </id> <discriminator column="subclass" type="character"/> <property name="bir

27、thdate" type="date"/> <property name="color" not-null="true"/> <property name="sex" not-null="true" update="false"/> <property name="weight"/> <many-to-one name="mate" column="mate_id&qu

28、ot;/> <set name="kittens"> <key column="mother_id"/> <one-to-many class="eg.Cat"/> </set> <subclass name="eg.DomesticCat" discriminator-value="D"> <property name="name" type="string"/> </s

29、ubclass> </class> <class name="eg.Dog"> <!- mapping for Dog could go here -> </class></hibernate-mapping>l 初始化ConfigurationConfiguration cfg = new Configuration() .addFile("Cat.hbm.xml") .addFile("DomesticCat.hbm.xml");或Configuration cfg

30、 = new Configuration().addClass(eg.Cat.class).addClass(eg. DomesticCat.class) l 獲得SessionFactorySessionFactory sessions = cfg.buildSessionFactory();l 進(jìn)行數(shù)據(jù)存取等操作Session sess = sessions.openSession(conn);/ start a new transaction (optional)Transaction tx = sess.beginTransaction();DomesticCat pk = new D

31、omesticCat();pk.setColor(Color.TABBY);pk.setSex('F');pk.setName("PK");pk.setKittens( new HashSet() );pk.addKitten(fritz);sess.save( pk, new Long(1234) );sess.flush(); /force the SQL INSERTsess.refresh(cat); /re-read the state (after the trigger executes)mit();sess.close();l 使用HQL語(yǔ)言

32、查詢Query q = s.createQuery("from foo in class Foo where =:name and foo.size=:size");q.setProperties(fooBean); / fooBean has getName() and getSize()List foos = q.list(); 需要說明的是: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)生。以上我們

33、簡(jiǎn)要介紹了Hibernate的基本特點(diǎn)及使用方法,詳細(xì)內(nèi)容請(qǐng)參看附錄B。3、動(dòng)態(tài)bean技術(shù) 使用動(dòng)態(tài)bean技術(shù)的理由:l 我們不只一次抱怨信息系統(tǒng)中數(shù)據(jù)項(xiàng)變化不定,無(wú)法設(shè)計(jì)和實(shí)現(xiàn)Java Beans。l 我們也不只一次作過這樣的事情:數(shù)據(jù)項(xiàng)增加或減少了,我需要修改信息系統(tǒng)以求適應(yīng)。比如我們按照某個(gè)企業(yè)的要求設(shè)計(jì)出了2000個(gè)Bean來滿足該企業(yè)對(duì)信息系統(tǒng)中業(yè)務(wù)數(shù)據(jù)模型的需要,過了一定時(shí)間后,他們的業(yè)務(wù)發(fā)生了一定的變化,要對(duì)數(shù)據(jù)模型擴(kuò)充一部分?jǐn)?shù)據(jù)項(xiàng),可想而知會(huì)有多么辛苦。動(dòng)態(tài)beans技術(shù)就是為解決此類問題而生,它為解決由于數(shù)據(jù)項(xiàng)變化帶來的設(shè)計(jì)和實(shí)現(xiàn)的變更提供了技術(shù)基礎(chǔ)。動(dòng)態(tài)bean技術(shù)主要

34、概念:l 一個(gè)Bean屬性的定義完全取決于有無(wú)訪問者方法:設(shè)置器(setXXX())和獲取器(getXXX()),而與在類定義中有無(wú)顯示說明字段毫無(wú)關(guān)系。l 為了使Beans能確認(rèn)一個(gè)屬性,其設(shè)置器(setXXX())和獲取器(getXXX())必須遵循下列命名規(guī)則: n 一個(gè)屬性名在訪問方法中必須以大寫字母開頭; n 在其它地方以小寫字母開頭。 l 擴(kuò)展javaBean屬性機(jī)制:定義了五種屬性訪問策略,使得屬性的訪問代碼像腳本一樣在運(yùn)行時(shí)決定,另外一個(gè)進(jìn)步就是它支持List和Map屬性的元素屬性,也就是擴(kuò)展javaBean屬性機(jī)制它不把一個(gè)Bean的某個(gè)List和Map成員看成一個(gè)整體屬性,

35、而是動(dòng)態(tài)地把這個(gè)List和Map成員的元素看成屬性,這樣無(wú)疑提供了一種無(wú)限擴(kuò)展Bean屬性的能力。Common-beanutils 1.6中的propertyUtils實(shí)用類使用Java語(yǔ)言的內(nèi)省反射功能實(shí)現(xiàn)擴(kuò)展屬性的設(shè)置器和獲取器。propertyUtils定義了引用一個(gè)特定Java bean屬性的五種格式:n 簡(jiǎn)單屬性,格式beanNpNpName標(biāo)識(shí)了JavaBean beanName的一個(gè)屬性,這個(gè)屬性的獲取器和設(shè)置器的方法是通過JavaBean的標(biāo)準(zhǔn)內(nèi)省功能決定的。如果要改變簡(jiǎn)單屬性的值,必須要有設(shè)置器操作,可以想象成類似調(diào)用beanName.getpro

36、pName()|setpropName(value); n 嵌套屬性,格式beanNpNpNpName3。像簡(jiǎn)單屬性一樣,第一個(gè)propName1元素被用來選擇一個(gè)屬性獲取器方法,在這個(gè)方法返回的對(duì)象上使用propName2的獲取器方法返回下一個(gè)對(duì)象,最后這個(gè)對(duì)象的屬性propName3被訪問或設(shè)置,可以想象成類似調(diào)用beanName.getpropName1().getpropName2().getpropName3()|setpropName3(value); n 索引屬性,格式beanNpNameindex。屬性propName

37、1可以是一個(gè)數(shù)組, java.util.List或者JavaBean beanName有索引屬性獲取器和設(shè)置器操作。bean只需propName的獲取器方法,可以想象成類似調(diào)用beanName. getpropName (index)|setpropName(index,value); n 映射屬性,格式beanName. propName(key)。propName是一個(gè)java.util.Map實(shí)現(xiàn)。bean只需propName的獲取器方法,可以想象成類似調(diào)用beanName. getpropName ().get("key")|set("key",

38、value); n 組合屬性,格式beanName. propNpNpName3(key)。 l 動(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)bean的步驟如下:n 定義一個(gè)動(dòng)態(tài)屬性Dynaproperty數(shù)組,動(dòng)態(tài)屬性Dynaproperty定義了一個(gè)屬性的名字和對(duì)象類型; n 用定義好的動(dòng)態(tài)屬性數(shù)組實(shí)例化一個(gè)動(dòng)態(tài)類; n 由動(dòng)態(tài)類返回一個(gè)動(dòng)態(tài)bean; n 可以用propertyUtils訪問和設(shè)置動(dòng)態(tài)bean的屬性。 下面是定義

39、和訪問動(dòng)態(tài)bean的代碼:/ TestDynaBean.javaimport mons.beanutils.*;import java.util.*;public class TestDynaBean public static void main(String args) TestBean bean = new TestBean();Object value = null;try Dynaproperty px = new Dynaproperty("subordinate", bean.getClass(), new Dynaproperty("firstNa

40、me", Class.forName("java.lang.String"), new Dynaproperty("lastName", Class.forName("java.lang.String"); DynaClass dynaClass = new BasicDynaClass("employee",null, px ); DynaBean employee = dynaClass.newInstance(); propertyUtils.setproperty(employee,"s

41、ubordinate", bean); propertyUtils.setproperty(employee,"subordinate.listIndexed0","dy bean set"); propertyUtils.setproperty(employee,"firstName", "Fred"); propertyUtils.setproperty(employee,"lastName", "Flintstone"); System.out.println

42、("subordinate.listIndexed0:"); System.out.println(propertyUtils.getproperty(employee,"subordinate.listIndexed0"); System.out.println("firstName:" + propertyUtils.getproperty(employee, "firstName"); System.out.println("lastName:" + propertyUtils.getpr

43、operty(employee, "lastName");catch (Exception e )intln(e.toString(); 從配置文件配置動(dòng)態(tài)bean的動(dòng)態(tài)屬性好處在于既能固定又能更改動(dòng)態(tài)Bean的屬性,這些屬性是這個(gè)動(dòng)態(tài)Bean對(duì)外界的宣布的"訪問協(xié)議"。動(dòng)態(tài)屬性Dynaproperty的主要構(gòu)造函數(shù)接受兩個(gè)參數(shù):第一個(gè)為屬性名稱,為字符串性,第二個(gè)為屬性的類型,為Class類型。從配置文件讀取的資料普通為字符串型,我們可以用ClassLoader把配置文件中字符串型的屬性類型轉(zhuǎn)化成Class類型的屬性類型。下面struts 1.1 中s

44、truts-example.war的 formbeans.xml中的片斷體現(xiàn)了如何在配置文件中定一個(gè)動(dòng)態(tài)bean的動(dòng)態(tài)屬性:<form-bean name="logonForm" type="org.apache.struts.validator.DynaValidatorForm"><form-property name="username" type="java.lang.String"/><form-property name="password" type=

45、"java.lang.String"/></form-bean>下面RequestUtils的代碼片斷體現(xiàn)了如何從字符串表示的屬性類型轉(zhuǎn)化成Class型的屬性類型:public static Class applicationClass(String className) throws ClassNotFoundException / Look up the class loader to be used ClassLoader classLoader = Thread.currentThread().getContextClassLoader(); if

46、 (classLoader = null) classLoader = RequestUtils.class.getClassLoader(); / Attempt to load the specified class return (classLoader.loadClass(className); 這就是關(guān)于動(dòng)態(tài)bean的所有奧秘,RequestUtils類代碼片斷public static ActionForm createActionForm就是這樣創(chuàng)建動(dòng)態(tài)bean的。三、在BONC-JONE平臺(tái)上進(jìn)行開發(fā)1、BONC-JONE平臺(tái)目錄說明注意:mon、com.bonc.securi

47、ty包屬于開發(fā)平臺(tái)基本支持包,其中的文件不允許開發(fā)人員改動(dòng)。2、如何使用BONC-JONE運(yùn)行起來 將開發(fā)平臺(tái)從source safe拉下來后,只需要將src目錄下的bonc_perties文件中boncHome=的路徑改為你所下載目錄的實(shí)際路徑,如:boncHome=D:DevelopWorkjavaboncCrmexamplerootWEB-INF,做了這樣的設(shè)置后,系統(tǒng)啟動(dòng)時(shí)就會(huì)到這個(gè)目錄下去找我們的項(xiàng)目配置文件bonc_config.xml。 如果你使用的是Jbuilder,還應(yīng)該將lib目錄下的所有包文件,加入到你工程的Required Libraries中。 做完以

48、上工作bonc-jone應(yīng)該就可以正常運(yùn)行了。3、開發(fā)有關(guān)規(guī)范性要求及典型步驟l 應(yīng)用的包的組織規(guī)則n 客戶關(guān)系項(xiàng)目中所有與應(yīng)用模塊相關(guān)的包均應(yīng)在com.bonc.crm包下,如果開發(fā)的是其他項(xiàng)目則根據(jù)項(xiàng)目名稱來定義這個(gè)包名稱,可能是這樣的:com.bonc.sample等。n 在com.bonc.crm包之下,以模塊名稱來分包,比如:模塊名稱是“留言模塊”,就要定義一個(gè)與其對(duì)應(yīng)的包c(diǎn)om.bonc.crm.module.leaveword。n 在各模塊包下再分為bean包(存放Form bean及其他本模塊可能要用到的 bean)action包(存放Action類)與bussinessman

49、ager業(yè)務(wù)管理包(存放業(yè)務(wù)管理接口類),比如:com.bonc.crm. 、com.bonc.crm. 與com.bonc.crm. module.leaveword.bussinessmanager包。n 在各模塊的業(yè)務(wù)管理包下再定義業(yè)務(wù)管理實(shí)現(xiàn)類包(impl包存放業(yè)務(wù)管理接口的實(shí)現(xiàn)類),比如:com.bonc.crm. module.leaveword.bussinessmanager.impl。n 包定義的要求:全部小寫字母定義。l 應(yīng)用開發(fā)中主要編寫的類的作用n Form bean類:建議開發(fā)中盡量使用動(dòng)態(tài)Form bean(即根據(jù)struts的配置文件生成的動(dòng)態(tài)bean),特殊情況

50、下才寫Form bean類。該類是一個(gè)ValueObject對(duì)象,主要的作用是包裝客戶端請(qǐng)求,將數(shù)據(jù)從view層傳給Action類,由Action類轉(zhuǎn)給業(yè)務(wù)處理類進(jìn)行處理;或者由Action類更改或填充其中的數(shù)據(jù),然后將其傳給view層來顯示。n Action類:Action類主要完成三方面的功能,其一是做登陸及權(quán)限驗(yàn)證,其二是做數(shù)據(jù)校驗(yàn),其三(也是最主要的)負(fù)責(zé)完成與控制有關(guān)的功能。需要注意的是盡可能不要此類中包含業(yè)務(wù)處理功能。n 業(yè)務(wù)管理接口類:該類是對(duì)業(yè)務(wù)對(duì)象進(jìn)行操作的抽象,是一個(gè)接口,對(duì)該業(yè)務(wù)對(duì)象的操作均應(yīng)通過它來進(jìn)行。n 業(yè)務(wù)管理抽象類:這種類實(shí)現(xiàn)或部分實(shí)現(xiàn)業(yè)務(wù)管理接口中定義的方法,

51、業(yè)務(wù)操作的大部分代碼均應(yīng)該寫在這個(gè)類中。由于這個(gè)類是個(gè)抽象類,所以它不能夠被實(shí)例化。n 業(yè)務(wù)管理實(shí)現(xiàn)類:這種類是業(yè)務(wù)管理抽象類的繼承類,通常情況下其中無(wú)實(shí)際代碼。l 應(yīng)用開發(fā)中關(guān)鍵的配置文件的意義及功能n web.xml文件:是Web應(yīng)用最基本的部署描述配置文件。部署Web應(yīng)用首先要配置web.xml文件。開發(fā)人員需要在Web.xml部署描述文件中配置:有效的部署描述文件必須包含DTD聲明:<!DOCTYPE web-app PUBLIC "-/Sun Microsystems, Inc./DTD Web Application 2.2/EN" "web-a

52、pp標(biāo)記是部署描述文件的根元素,它的子元素包括:元素描述icon此元素指定在GUI工具中表示此Web應(yīng)用的大圖標(biāo)和小圖標(biāo),包含一個(gè)small-icon和一個(gè)large-icon元素,可使用GIF或JPEG格式的圖像display-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

53、在servlet和url模式間進(jìn)行映射session-config聲明此Web應(yīng)用的Session參數(shù)mime-mapping定義擴(kuò)展名和mime type間的映射welcome-file-list包含welcome-file子元素的順序列表error-page包含一個(gè)錯(cuò)誤代碼或違例類型與web應(yīng)用中資源的映射taglib用于描述一個(gè)JSP標(biāo)記庫(kù)resource-ref包含一個(gè)對(duì)外部資源的引用聲明security-constraint用于為一個(gè)或多個(gè)Web資源集合指定相應(yīng)的安全約束login-config用于配置身份鑒定的方法,此應(yīng)用使用域名,以及通過表單登錄機(jī)制則需要設(shè)置此屬性securit

54、y-role包含使用于web應(yīng)用中<security-constriant>元素的安全角 色的聲明env-entry包含應(yīng)用環(huán)境變量的聲明ejb-ref用于聲明對(duì)EJB的引用ServletContext初始化參數(shù):context-param標(biāo)記的子元素包括:param-name :參數(shù)名 param-value :參數(shù)值description :參數(shù)的描述信息 例如: <context-param>   <param-name>my_context_param_name</param-name>  

55、0;<param-value>Context Param Value</param-value>   <description>param description</description> </context-param>Session配置 session-config標(biāo)記的子元素包括:session-timeout :session超時(shí)時(shí)間 例如: <session-config>   <session-timeout>   

56、       30   </session-timeout> </session-config>Servlet/JSP定義 servlet 標(biāo)記的子元素包括:icon :在GUI工具中的顯示圖標(biāo)servlet-name :servlet名稱 display-name :在GUI工具中的顯示名稱 description :描述信息servlet-class | jsp-file :servlet類名稱;jsp文件的完全路徑 init-param :初始化參數(shù)列表 load-on-startup :web

57、應(yīng)用啟動(dòng)時(shí)裝載 security-role-ref:定義安全引用角色 servlet-mapping標(biāo)記的子元素包括:servlet-name :servlet名稱 例如:<servlet>   <icon>     <small-icon>small.gif</small-icon>     <large-icon>largel.gif</large-icon>   </icon>   &l

58、t;servlet-name>my_servlet</servlet-name>   <display-name>my_servlet</display-name>   <description>my_servlet</description>   <servlet-class>com.apusic.test.MyServlet</servlet-class>   <init-param><param-name>my_init_param</param-name><param-value

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論