版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
Java項(xiàng)目開發(fā)平臺(tái)開發(fā)規(guī)范__________北京東方國信電子有限公司CRM事業(yè)部時(shí)間:2023-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ī)范性規(guī)定及典型環(huán)節(jié) 19四、重要函數(shù)及使用技術(shù)方法說明 43如何使用自定義標(biāo)簽庫? 43如何使用日記類寫日記? 45如何進(jìn)行資源注冊(cè)? 48如何進(jìn)行登陸權(quán)限驗(yàn)證? 48如何進(jìn)行字符轉(zhuǎn)換? 48如何對(duì)資源文獻(xiàn)進(jìn)行字符轉(zhuǎn)換? 48如何配置、讀取應(yīng)用配置信息? 48如何打包boncpersistenceobj.jar文獻(xiàn)? 48數(shù)據(jù)操作方法的原理是如何的? 48如何將任意文獻(xiàn)上傳到數(shù)據(jù)庫中,又如何下載? 48如何保證在頁面清空的字段能對(duì)的提交到數(shù)據(jù)庫? 48如何使用日期控件? 49如何使用DBQuery類進(jìn)行數(shù)據(jù)查詢? 49如何自動(dòng)生成Hibernate持久化beans及map文獻(xiàn)? 49如何使用分頁技術(shù)? 51附錄: 54附A:Struts學(xué)習(xí)精要參考 54附B:Hibernate學(xué)習(xí)精要參考 54附C:技術(shù)備忘 54一、開發(fā)平臺(tái)概述BONC-JONE開發(fā)平臺(tái)是北京東方國信電子技術(shù)有限公司遵循“簡(jiǎn)樸、有效、先進(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的縮寫。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ù)表達(dá);Controller則負(fù)責(zé)View和Model之間的流程控制,也就是完畢兩個(gè)方向的動(dòng)作:1.將用戶界面(View)的操作映射到具體的Model,以完畢具體的業(yè)務(wù)邏輯;2.將通過Model解決完的業(yè)務(wù)數(shù)據(jù)及時(shí)反映到用戶界面(View)上。其系統(tǒng)組成結(jié)構(gòu)圖如下:平臺(tái)輔助API表達(dá)層Struts+Tiles平臺(tái)輔助API表達(dá)層Struts+Tiles業(yè)務(wù)層業(yè)務(wù)層業(yè)務(wù)管理接口+業(yè)務(wù)管理抽象類+業(yè)務(wù)管理實(shí)現(xiàn)類業(yè)務(wù)Beans技術(shù)業(yè)務(wù)Beans技術(shù)JDBC持久化層JDBC持久化層Hibernate連接池技術(shù)連接池技術(shù)數(shù)據(jù)庫DataBase數(shù)據(jù)庫DataBaseBONC-JONE開發(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)中相稱流行了。BONC-JONE開發(fā)平臺(tái)重要層次分為:表達(dá)層、業(yè)務(wù)層、持久化層及一些各層公用的工具類庫。分層的系統(tǒng)設(shè)計(jì)思想的重點(diǎn)在于:一個(gè)分層的系統(tǒng)在各相關(guān)層的實(shí)現(xiàn)代碼間定義了接口,從而允許一個(gè)層的實(shí)現(xiàn)代碼的變化不會(huì)影響到其它的層。分層系統(tǒng)結(jié)構(gòu)還限制隔層依賴的發(fā)生,各層的通訊是由頂向下管理的。某一層僅依賴于直接位于它下面的那一層。每一層對(duì)其他層的存在都是不知道的,除非那一層緊鄰其下。即使是對(duì)緊鄰其下的層它也僅需要知道如何使用接口與其通訊就可以了,而無需知道其實(shí)現(xiàn)細(xì)節(jié)。BONC-JONE開發(fā)平臺(tái)通過Struts+Tiles技術(shù)實(shí)現(xiàn)了MVC模式中的表達(dá)層和控制層,通過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、EJB、WEBSERVICE等多項(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、Controller這三部分功能來講,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)行模塊的隔離,而不需要把具有不同功能的代碼混雜在一起導(dǎo)致混亂。對(duì)于項(xiàng)目開發(fā)而言,有助于在項(xiàng)目小組內(nèi)按照小組成員各自的擅長進(jìn)行分工,有助于三個(gè)部分并行開發(fā)、加快項(xiàng)目進(jìn)度。當(dāng)前可供選擇的較為流行的MVC框架有六種之多:Struts、Maverick、WebWork、Turbine、RealMothods、AOP(aspect-orientedprogramming)。它們應(yīng)用的領(lǐng)域及實(shí)現(xiàn)的側(cè)重點(diǎn)各有不同。但以Struts應(yīng)用最廣,是基于MVC模式的Web應(yīng)用最經(jīng)典框架,當(dāng)推首選。Struts最早是作為ApacheJakarta項(xiàng)目的組成部分問世。項(xiàng)目的創(chuàng)建者希望通過對(duì)該項(xiàng)目的研究,改善和提高JavaServerPages(JSPs)、Servlet、標(biāo)簽庫以及面向?qū)ο蟮募夹g(shù)水準(zhǔn)。Struts這個(gè)名字來源于在建筑和舊式飛機(jī)中使用的支持金屬架。它的目的是為了幫助我們減少在運(yùn)用MVC設(shè)計(jì)模型來開發(fā)Web應(yīng)用的時(shí)間。因此我們選擇Struts。Struts鼓勵(lì)按照Model2方式構(gòu)建應(yīng)用的體系。Model2是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配置文獻(xiàn)控制,它告訴ActionServlet如何分發(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部分的組件,由于這些組件才是真正解決數(shù)據(jù)的地方。把數(shù)據(jù)保存到數(shù)據(jù)庫也應(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框架將其側(cè)重點(diǎn)放在了Controller與View層。View由JSP定制標(biāo)記庫和JSP頁面共同構(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ā)過程中完整地遵從MVC的概念A(yù)ction類的使用方式是一個(gè)關(guān)鍵。對(duì)于Struts的解剖。圖解說明:其中不同顏色代表MVC的不同部分:紅色(控制器)、紫色(模型)和綠色(視圖)一方面,控制器(ActionServlet)進(jìn)行初始化工作,讀取配置文獻(xiàn)(struts-config.xml),為不同的Struts模塊初始化相應(yīng)的ModuleConfig對(duì)象。比如配置文獻(xiàn)中的Action映射定義都保存在ActionConfig集合中。相應(yīng)地有ControlConfig集合、FormBeanConfig集合、ForwardConfig集合和MessageResourcesConfig集合等。控制器接受HTTP請(qǐng)求,并從ActionConfig中找出相應(yīng)于該請(qǐng)求的Action子類,假如沒有相應(yīng)的Action,控制器直接將請(qǐng)求轉(zhuǎn)發(fā)給JSP或者靜態(tài)頁面。否則控制器將請(qǐng)求分發(fā)至具體Action類進(jìn)行解決。在控制器調(diào)用品體Action的execute方法之前,ActionForm對(duì)象將運(yùn)用HTTP請(qǐng)求中的參數(shù)來填充自己(可選環(huán)節(jié),需要在配置文獻(xiàn)中指定)。具體的ActionForm對(duì)象應(yīng)當(dāng)是ActionForm的子類對(duì)象,它其實(shí)就是一個(gè)JavaBean。此外,還可以在ActionForm類中調(diào)用validate方法來檢查請(qǐng)求參數(shù)的合法性,并且可以返回一個(gè)包含所有錯(cuò)誤信息的ActionErrors對(duì)象。假如執(zhí)行成功,ActionForm自動(dòng)將這些參數(shù)信息以JavaBean(一般稱之為formbean)的方式保存在ServletContext中,這樣它們就可以被其它Action對(duì)象或者JSP調(diào)用。Struts將這些ActionForm的配置信息都放在FormBeanConfig集合中,通過它們Struts可以知道針對(duì)某個(gè)客戶請(qǐng)求是否需要?jiǎng)?chuàng)建相應(yīng)的ActionForm實(shí)例。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ā)工作。我們主張將獲取數(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/relationalmapping(ORM)的持久化技術(shù)。曾經(jīng),涉及現(xiàn)在也有許多J2EE項(xiàng)目在直接使用SQL/JDBC實(shí)現(xiàn)持久化。眾所周知的DAO模式讓我們把復(fù)雜的JDBC編碼和大量SQL隱藏到業(yè)務(wù)邏輯和領(lǐng)域模型之后,但這種方式實(shí)現(xiàn)的是有限的分離,最致命的是應(yīng)用由一種數(shù)據(jù)庫向另一種數(shù)據(jù)庫遷移時(shí)可移植性非常差。此外它規(guī)定開發(fā)者對(duì)項(xiàng)目中使用的關(guān)系數(shù)據(jù)庫管理系統(tǒng)非常熟悉,并且要精通SQL。當(dāng)前可供選擇的較為流行的數(shù)據(jù)持久化技術(shù)也同樣有很多:EJB、Hibernate、JDO、OJB、Cayenne、SimpleORM、JAXOR等等。不選用EJB的理由EJB在J2EE應(yīng)用里是一個(gè)重量級(jí)的組件,它由容器提供了分布、事務(wù)等多種公司級(jí)應(yīng)用需要的特性。我們不選用它重要是由于:兼容性問題。規(guī)范一模同樣,實(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)用對(duì)事務(wù)解決規(guī)定很高,訪問量非常大需要實(shí)現(xiàn)分布式集群時(shí)EJB才是必須的。選用Hibernate的理由Hibernate是當(dāng)前最活躍,應(yīng)用最廣,更新最快,文檔最完整,功能最齊備的一個(gè)數(shù)據(jù)持久化的開源項(xiàng)目。選用它的理由重要有:Hibernate并不直接反映數(shù)據(jù)庫中的表和列,它通過一些持久化類(JavaBeans)來映射到數(shù)據(jù)庫中的表上。這些持久化類與我們通常使用的JavaBeans沒有任何不同,它們即可以由Hibernate來持久化,同樣重要的是它們也可以完全與Hibernate無關(guān)地被使用。這是它與其它持久化模型(比如EJB)的一個(gè)重要的區(qū)別即Hibernate的持久化類是純JavaBeans,它可以在任何地方被使用,而不需要容器。Hibernate提供了一種對(duì)象導(dǎo)向的查詢語言(HQL)。幾乎支持所有的SQL語法,傳統(tǒng)數(shù)據(jù)庫可以做的它就可以做。Hibernate提供了數(shù)據(jù)分段提取控制功能。將Hibernate放在SLSB后,它同樣可以實(shí)現(xiàn)分布式應(yīng)用,同樣可以運(yùn)用容器提供的JAT事務(wù)服務(wù)。因此我們選擇Hibernate。Hibernate概要結(jié)構(gòu)圖:Hibernate具體結(jié)構(gòu)圖:Hibernate使用概要手工創(chuàng)建或使用工具自動(dòng)生成Hibernate的持久化類;文獻(xiàn)示例:packageeg;importjava.util.Set;importjava.util.Date;/***@hibernate.class*table="CATS"*/publicclassCat{privateLongid;//identifierprivateDatebirthdate;privateCatmate;privateSetkittensprivateColorcolor;privatecharsex;privatefloatweight;/***@hibernate.id*generator-class="native"*column="CAT_ID"*/publicLonggetId(){returnid;}privatevoidsetId(Longid){this.id=id;}/***@hibernate.many-to-one*column="MATE_ID"*/publicCatgetMate(){returnmate;}voidsetMate(Catmate){this.mate=mate;}/***@perty*column="BIRTH_DATE"*/publicDategetBirthdate(){returnbirthdate;}voidsetBirthdate(Datedate){birthdate=date;}/***@perty*column="WEIGHT"*/publicfloatgetWeight(){returnweight;}voidsetWeight(floatweight){this.weight=weight;}/***@perty*column="COLOR"*not-null="true"*/publicColorgetColor(){returncolor;}voidsetColor(Colorcolor){this.color=color;}/***@hibernate.set*lazy="true"*order-by="BIRTH_DATE"*@hibernate.collection-key*column="PARENT_ID"*@hibernate.collection-one-to-many*/publicSetgetKittens(){returnkittens;}voidsetKittens(Setkittens){this.kittens=kittens;}//addKittennotneededbyHibernatepublicvoidaddKitten(Catkitten){kittens.add(kitten);}/***@perty*column="SEX"*not-null="true"*update="false"*/publicchargetSex(){returnsex;}voidsetSex(charsex){this.sex=sex;}}手工創(chuàng)建或使用工具自動(dòng)生成Hibernate的xml映射文獻(xiàn);文獻(xiàn)示例:<?xmlversion="1.0"?><!DOCTYPEhibernate-mappingPUBLIC"-//Hibernate/HibernateMappingDTD2.0//EN"""><hibernate-mapping><classname="eg.Cat"table="CATS"discriminator-value="C"><idname="id"column="uid"type="long"><generatorclass="hilo"/></id><discriminatorcolumn="subclass"type="character"/><propertyname="birthdate"type="date"/><propertyname="color"not-null="true"/><propertyname="sex"not-null="true"update="false"/><propertyname="weight"/><many-to-onename="mate"column="mate_id"/><setname="kittens"><keycolumn="mother_id"/><one-to-manyclass="eg.Cat"/></set><subclassname="eg.DomesticCat"discriminator-value="D"><propertyname="name"type="string"/></subclass></class><classname="eg.Dog"><!--mappingforDogcouldgohere--></class></hibernate-mapping>初始化ConfigurationConfigurationcfg=newConfiguration().addFile("Cat.hbm.xml").addFile("DomesticCat.hbm.xml");或Configurationcfg=newConfiguration().addClass(eg.Cat.class).addClass(eg.DomesticCat.class)獲得SessionFactorySessionFactorysessions=cfg.buildSessionFactory();進(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.flush();//forcetheSQLINSERTsess.refresh(cat);//re-readthestate(afterthetriggerexecutes)mit();sess.close();使用HQL語言查詢Queryq=s.createQuery("fromfooinclassFoowhere=:nameandfoo.size=:size");q.setProperties(fooBean);//fooBeanhasgetName()andgetSize()Listfoos=q.list();需要說明的是:Hibernate產(chǎn)生的所有SQL是運(yùn)營時(shí)產(chǎn)生的,說的更準(zhǔn)確一些是在你系統(tǒng)啟動(dòng)時(shí)產(chǎn)生。所有我們需要的只是一個(gè)包含映射元數(shù)據(jù)的xml映射文獻(xiàn)。xml映射文獻(xiàn)可以你手工來維護(hù),也可以通過植入源代碼的注釋來產(chǎn)生。以上我們簡(jiǎn)要介紹了Hibernate的基本特點(diǎn)及使用方法,具體內(nèi)容請(qǐng)參看附錄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)JavaBeans。我們也不只一次作過這樣的事情:數(shù)據(jù)項(xiàng)增長或減少了,我需要修改信息系統(tǒng)以求適應(yīng)。比如我們按照某個(gè)公司的規(guī)定設(shè)計(jì)出了2023個(gè)Bean來滿足該公司對(duì)信息系統(tǒng)中業(yè)務(wù)數(shù)據(jù)模型的需要,過了一定期間后,他們的業(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ù)重要概念:一個(gè)Bean屬性的定義完全取決于有無訪問者方法:設(shè)立器(setXXX())和獲取器(getXXX()),而與在類定義中有無顯示說明字段毫無關(guān)系。為了使Beans能確認(rèn)一個(gè)屬性,其設(shè)立器(setXXX())和獲取器(getXXX())必須遵循下列命名規(guī)則:一個(gè)屬性名在訪問方法中必須以大寫字母開頭;在其它地方以小寫字母開頭。擴(kuò)展javaBean屬性機(jī)制:定義了五種屬性訪問策略,使得屬性的訪問代碼像腳本同樣在運(yùn)營時(shí)決定,此外一個(gè)進(jìn)步就是它支持List和Map屬性的元素屬性,也就是擴(kuò)展javaBean屬性機(jī)制它不把一個(gè)Bean的某個(gè)List和Map成員當(dāng)作一個(gè)整體屬性,而是動(dòng)態(tài)地把這個(gè)List和Map成員的元素當(dāng)作屬性,這樣無疑提供了一種無限擴(kuò)展Bean屬性的能力。Common-beanutils1.6中的propertyUtils實(shí)用類使用Java語言的內(nèi)省反射功能實(shí)現(xiàn)擴(kuò)展屬性的設(shè)立器和獲取器。propertyUtils定義了引用一個(gè)特定Javabean屬性的五種格式:簡(jiǎn)樸屬性,格式beanNpNpName標(biāo)記了JavaBeanbeanName的一個(gè)屬性,這個(gè)屬性的獲取器和設(shè)立器的方法是通過JavaBean的標(biāo)準(zhǔn)內(nèi)省功能決定的。假如要改變簡(jiǎn)樸屬性的值,必須要有設(shè)立器操作,可以想象成類似調(diào)用beanName.[getpropName()|setpropName(value)];嵌套屬性,格式beanNpNpNpName3。像簡(jiǎn)樸屬性同樣,第一個(gè)propName1元素被用來選擇一個(gè)屬性獲取器方法,在這個(gè)方法返回的對(duì)象上使用propName2的獲取器方法返回下一個(gè)對(duì)象,最后這個(gè)對(duì)象的屬性propName3被訪問或設(shè)立,可以想象成類似調(diào)用beanName.getpropName1().getpropName2().[getpropName3()|setpropName3(value)];索引屬性,格式beanNpName[index]。屬性propName1可以是一個(gè)數(shù)組,java.util.List或者JavaBeanbeanName有索引屬性獲取器和設(shè)立器操作。bean只需propName的獲取器方法,可以想象成類似調(diào)用beanName.[getpropName(index)|setpropName(index,value)];映射屬性,格式beanNpName(key)。propName是一個(gè)java.util.Map實(shí)現(xiàn)。bean只需propName的獲取器方法,可以想象成類似調(diào)用beanName.getpropName().[get("key")|set("key",value);組合屬性,格式beanNpNpName2[index].propName3(key)。動(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的環(huán)節(jié)如下:定義一個(gè)動(dòng)態(tài)屬性Dynaproperty數(shù)組,動(dòng)態(tài)屬性Dynaproperty定義了一個(gè)屬性的名字和對(duì)象類型;用定義好的動(dòng)態(tài)屬性數(shù)組實(shí)例化一個(gè)動(dòng)態(tài)類;由動(dòng)態(tài)類返回一個(gè)動(dòng)態(tài)bean;可以用propertyUtils訪問和設(shè)立動(dòng)態(tài)bean的屬性。下面是定義和訪問動(dòng)態(tài)bean的代碼://TestDynaBean.javaimportmons.beanutils.*;importjava.util.*;publicclassTestDynaBean{publicstaticvoidmain(String[]args){ TestBeanbean=newTestBean(); Objectvalue=null; try{ Dynaproperty[]px={ newDynaproperty("subordinate",bean.getClass()), newDynaproperty("firstName",Class.forName("java.lang.String")), newDynaproperty("lastName",Class.forName("java.lang.String")) }; DynaClassdynaClass=newBasicDynaClass("employee",null, px); DynaBeanemployee=dynaClass.newInstance(); propertyUtils.setproperty(employee,"subordinate",bean); propertyUtils.setproperty(employee,"subordinate.listIndexed[0]","dybeanset"); propertyUtils.setproperty(employee,"firstName","Fred"); propertyUtils.setproperty(employee,"lastName","Flintstone"); System.out.println("subordinate.listIndexed[0]:"); System.out.println(propertyUtils.getproperty(employee,"subordinate.listIndexed[0]")); System.out.println("firstName:"+propertyUtils.getproperty(employee,"firstName")); System.out.println("lastName:"+propertyUtils.getproperty(employee,"lastName")); }catch(Exceptione){ System.out.println(e.toString()); }}}從配置文獻(xiàn)配置動(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類型。從配置文獻(xiàn)讀取的資料普通為字符串型,我們可以用ClassLoader把配置文獻(xiàn)中字符串型的屬性類型轉(zhuǎn)化成Class類型的屬性類型。下面struts1.1中struts-example.war的formbeans.xml中的片斷體現(xiàn)了如何在配置文獻(xiàn)中定一個(gè)動(dòng)態(tài)bean的動(dòng)態(tài)屬性:<form-beanname="logonForm"type="org.apache.struts.validator.DynaValidatorForm"><form-propertyname="username"type="java.lang.String"/><form-propertyname="password"type="java.lang.String"/></form-bean>下面RequestUtils的代碼片斷體現(xiàn)了如何從字符串表達(dá)的屬性類型轉(zhuǎn)化成Class型的屬性類型:publicstaticClassapplicationClass(StringclassName)throwsClassNotFoundException{//LookuptheclassloadertobeusedClassLoaderclassLoader=Thread.currentThread().getContextClassLoader();if(classLoader==null){classLoader=RequestUtils.class.getClassLoader();}//Attempttoloadthespecifiedclassreturn(classLoader.loadClass(className));}這就是關(guān)于動(dòng)態(tài)bean的所有奧秘,RequestUtils類代碼片斷publicstaticActionFormcreateActionForm就是這樣創(chuàng)建動(dòng)態(tài)bean的。三、在BONC-JONE平臺(tái)上進(jìn)行開發(fā)1、BONC-JONE平臺(tái)目錄說明注意:mon、com.bonc.security包屬于開發(fā)平臺(tái)基本支持包,其中的文獻(xiàn)不允許開發(fā)人員改動(dòng)。2、如何使用BONC-JONE運(yùn)營起來將開發(fā)平臺(tái)從sourcesafe拉下來后,只需要將src目錄下的bonc_perties文獻(xiàn)中boncHome=的途徑改為你所下載目錄的實(shí)際途徑,如:boncHome=D:\\DevelopWork\\java\\boncCrm\\exampleroot\\WEB-INF,做了這樣的設(shè)立后,系統(tǒng)啟動(dòng)時(shí)就會(huì)到這個(gè)目錄下去找我們的項(xiàng)目配置文獻(xiàn)bonc_config.xml。假如你使用的是Jbuilder,還應(yīng)當(dāng)將lib目錄下的所有包文獻(xiàn),加入到你工程的RequiredLibraries中。做完以上工作bonc-jone應(yīng)當(dāng)就可以正常運(yùn)營了。3、開發(fā)有關(guān)規(guī)范性規(guī)定及典型環(huán)節(jié)應(yīng)用的包的組織規(guī)則客戶關(guān)系項(xiàng)目中所有與應(yīng)用模塊相關(guān)的包均應(yīng)在com.bonc.crm包下,假如開發(fā)的是其他項(xiàng)目則根據(jù)項(xiàng)目名稱來定義這個(gè)包名稱,也許是這樣的:com.bonc.sample等。在com.bonc.crm包之下,以模塊名稱來分包,比如:模塊名稱是“留言模塊”,就要定義一個(gè)與其相應(yīng)的包c(diǎn)om.bonc.crm.module.leaveword。在各模塊包下再分為bean包(存放Formbean及其他本模塊也許要用到的bean)action包(存放Action類)與bussinessmanager業(yè)務(wù)管理包(存放業(yè)務(wù)管理接口類),比如:com.bonc.crm.module.leaveword.action、com.bonc.crm.module.leaveword.bean與com.bonc.crm.module.leaveword.bussinessmanager包。在各模塊的業(yè)務(wù)管理包下再定義業(yè)務(wù)管理實(shí)現(xiàn)類包(impl包存放業(yè)務(wù)管理接口的實(shí)現(xiàn)類),比如:com.bonc.crm.module.leaveword.bussinessmanager.impl。包定義的規(guī)定:所有小寫字母定義。應(yīng)用開發(fā)中重要編寫的類的作用Formbean類:建議開發(fā)中盡量使用動(dòng)態(tài)Formbean(即根據(jù)struts的配置文獻(xiàn)生成的動(dòng)態(tài)bean),特殊情況下才寫Formbean類。該類是一個(gè)ValueObject對(duì)象,重要的作用是包裝客戶端請(qǐng)求,將數(shù)據(jù)從view層傳給Action類,由Action類轉(zhuǎn)給業(yè)務(wù)解決類進(jìn)行解決;或者由Action類更改或填充其中的數(shù)據(jù),然后將其傳給view層來顯示。Action類:Action類重要完畢三方面的功能,其一是做登陸及權(quán)限驗(yàn)證,其二是做數(shù)據(jù)校驗(yàn),其三(也是最重要的)負(fù)責(zé)完畢與控制有關(guān)的功能。需要注意的是盡也許不要此類中包含業(yè)務(wù)解決功能。業(yè)務(wù)管理接口類:該類是對(duì)業(yè)務(wù)對(duì)象進(jìn)行操作的抽象,是一個(gè)接口,對(duì)該業(yè)務(wù)對(duì)象的操作均應(yīng)通過它來進(jìn)行。業(yè)務(wù)管理抽象類:這種類實(shí)現(xiàn)或部分實(shí)現(xiàn)業(yè)務(wù)管理接口中定義的方法,業(yè)務(wù)操作的大部分代碼均應(yīng)當(dāng)寫在這個(gè)類中。由于這個(gè)類是個(gè)抽象類,所以它不可以被實(shí)例化。業(yè)務(wù)管理實(shí)現(xiàn)類:這種類是業(yè)務(wù)管理抽象類的繼承類,通常情況下其中無實(shí)際代碼。應(yīng)用開發(fā)中關(guān)鍵的配置文獻(xiàn)的意義及功能web.xml文獻(xiàn):是Web應(yīng)用最基本的部署描述配置文獻(xiàn)。部署Web應(yīng)用一方面要配置web.xml文獻(xiàn)。開發(fā)人員需要在Web.xml部署描述文獻(xiàn)中配置:有效的部署描述文獻(xiàn)必須包含DTD聲明:<!DOCTYPEweb-appPUBLIC"-//SunMicrosystems,Inc.//DTDWebApplication2.2//EN""">web-app標(biāo)記是部署描述文獻(xiàn)的根元素,它的子元素涉及:元素描述icon此元素指定在GUI工具中表達(dá)此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)用部署描述中使用該元素,就表達(dá)該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間的映射welcome-file-list包含welcome-file子元素的順序列表error包含一個(gè)錯(cuò)誤代碼或違例類型與web應(yīng)用中資源的映射taglib用于描述一個(gè)JSP標(biāo)記庫resource-ref包含一個(gè)對(duì)外部資源的引用聲明security-constraint用于為一個(gè)或多個(gè)Web資源集合指定相應(yīng)的安全約束login-config用于配置身份鑒定的方法,此應(yīng)用使用域名,以及通過表單登錄機(jī)制則需要設(shè)立此屬性security-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>
<param-value>ContextParamValue</param-value>
<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)servlet-name:servlet名稱display-name:在GUI工具中的顯示名稱description:描述信息servlet-class|jsp-file:servlet類名稱;jsp文獻(xiàn)的完全途徑init-param:初始化參數(shù)列表load-on-startup:web應(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>
<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>InitParamValue</param-value><description>paramdescripton</description>
</init-param>
<load-on-startup>1</load-on-startup>
<security-role-ref>
<description>roledescription</description>
<role-name>my_security_role_name</role-name>
<role-link>SecurityRoleLink</role-link>
</security-role-ref></servlet>Servlet/JSP映射url-pattern:servlet映射的URL模板<servlet-mapping>
<servlet-name>my_servlet</servlet-name>
<url-pattern>/my_url_pattern</url-pattern></servlet-mapping>MIME類型映射mime-mapping的子元素涉及:extension:擴(kuò)展名mime-type:MIME類型例如:<mime-mapping>
<extension>txt</extension>
<mime-type>text/plain</mime-type></mime-mapping>歡迎文獻(xiàn)列表welcome-file-list標(biāo)記的子元素涉及:welcome-file:作為缺省的歡迎文獻(xiàn)名例如:<welcome-file-list>
<welcome-file>
index.jsp
</welcome-file>
<welcome-file>
index.html
</welcome-file>
<welcome-file>
index.htm
</welcome-file></welcome-file-list>錯(cuò)誤頁面error標(biāo)記的子元素涉及:error-code|exception-type:HTTP的錯(cuò)誤代碼;異常類型location:資源在Web應(yīng)用中的位置例如:<error>
<error-code>404</error-code>
<location>ErrorPage.jsp</location></error><error>
<exception-type>ExceptionType</exception-type>
<location>ErrorPage.jsp</location></error>安全security-constraint標(biāo)記的子元素涉及:web-resource-collection:用于區(qū)分資源子集和web應(yīng)用內(nèi)使用安全約束的這類資源的HTTP方法。如HTTP方法未被指定,安全約束將合用于所有的HTTP方法。auth-constraint:指定允許訪問此資源集合的用戶角色。在此處使用的角色必須在<security-role-ref>元素中進(jìn)行定義user-data-constraint:于指出客戶端和容器間的數(shù)據(jù)互換的保護(hù)方式login-config標(biāo)記的子元素涉及:auth-method:用于為Web應(yīng)用配置身份鑒定機(jī)制。作為對(duì)使用身份鑒定約束保護(hù)的任何Web資源取得訪問的先決條件,用戶必須使用已配置的身份鑒定機(jī)制進(jìn)行鑒定。此元素的合法值為“BASIC”、“DIGEST”、“FORM”或“CLENT-CERT”realm-name:指定在HTTP基礎(chǔ)授權(quán)中的域名form-login-config:定義Web應(yīng)用中使用的登陸頁面可被找到的位置security-role標(biāo)記的子元素涉及:description:描述信息role-name:安全角色的名字例如:<security-constraint>
<web-resource-collection>
<web-resource-name>Name</web-resource-name>
<description>descript</description>
<url-pattern>/security/*</url-pattern>
</web-resource-collection>
<auth-constraint>
<role-name>default</role-name>
</auth-constraint></security-constraint><login-config>
<auth-method>BASIC</auth-method>
<realm-name>Default</realm-name></login-config><security-role>
<description>roledesc</description>
<role-name>default</role-name></security-role>標(biāo)簽庫配置:Taglib標(biāo)記的子元素涉及:taglib-uri:統(tǒng)一資源標(biāo)記符(URI)參數(shù),可以自由命名。taglib-location:標(biāo)簽庫描述文獻(xiàn)的實(shí)際位置。例如:<taglib><taglib-uri>/WEB-INF/BoncTagLib.tld</taglib-uri><taglib-location>/WEB-INF/BoncTagLib.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri><taglib-location>/WEB-INF/struts-bean.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/struts-html.tld</taglib-uri><taglib-location>/WEB-INF/struts-html.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/struts-logic.tld</taglib-uri><taglib-location>/WEB-INF/struts-logic.tld</taglib-location></taglib><taglib><taglib-uri>/WEB-INF/struts-tiles.tld</taglib-uri><taglib-location>/WEB-INF/struts-tiles.tld</taglib-location></taglib></web-app>看來web.xml的配置是很多的,但在開發(fā)中我們需要進(jìn)行的配置并不多。在bonc-jone開發(fā)平臺(tái)的web.xml中基本不需要開發(fā)人員變動(dòng)已有的配置。唯一需要由開發(fā)人員進(jìn)行的配置是增長各模塊的struts配置文獻(xiàn)途徑,例如:<web-app><servlet><servlet-name>action</servlet-name><servlet-class>org.apache.struts.tiles.ActionComponentServlet</servlet-class><init-param><param-name>config</param-name><param-value>/WEB-INF/struts-config.xml,/WEB-INF/struts-config-yourmoduel.xml,/WEB-INF/struts-config-other.xml</param-value></init-param>…</servlet>…</web-app>Struts配置文獻(xiàn):是Struts框架的中心配置文獻(xiàn),通俗地說是Struts應(yīng)用的地圖。以下是Struts配置文獻(xiàn)的基本結(jié)構(gòu):<?xmlversion="1.0"encoding="ISO-8859-1"?><!--StrutsConfigXML-SampleStrutsApp--><!--=====================================--><!--AutoGeneratedfrom:c:\dev\javaworld\app\sample.vsd--><!--AutoGeneratedon
:02-18-202323:05:47--><!--AutoGeneratedby
:StrutsGUIv2.11
(c)2023Alien-Factory--><!--
:See''fordetails--><!--GETYOURSTICKYFINGERSOFF!i.e.Donotedit.--><!DOCTYPEstruts-configPUBLIC
"-//ApacheSoftwareFoundation//DTDStrutsConfiguration1.0//EN"
""><struts-config>
<!--======================FormBeanDefinitions===================-->
<form-beans><form-beanname="testForm"type="org.apache.struts.action.DynaActionForm"dynamic="true"><form-propertyname="testproperyt"type="java.lang.String"/> </form-bean>
</form-beans>
<!--=================GlobalForwardDefinitions===================-->
<global-forwards>
</global-forwards>
<!--=======================ActionDefinitions=====================-->
<action-mappings><action
path="/Login"
type="com.agilquest.onboard.presentation.actions.LoginAction"name=”testForm”validate="true"scope="request">
<description>Authenticatesandauthorizesauser.</description><forwardname="success"path="tile.loginPage"/></action>
</action-mappings></struts-config>開發(fā)人員進(jìn)行開發(fā)時(shí)重要是配置form-beans中的form-bean及action-mappings中的action。注意:在bonc-jone開發(fā)平臺(tái)中,WEB-INF目錄下的struts-config.xml配置文獻(xiàn)是不允許開發(fā)人員更改的。開發(fā)人員應(yīng)當(dāng)將自己開發(fā)的模塊獨(dú)立形成一個(gè)struts配置文獻(xiàn),按照struts-config-模塊名稱.xml的方式來命名,并將其加入web.xml的配置中,具體方法見web.xml的配置。tiles-defs.xml配置文獻(xiàn):是使用tiles框架及其標(biāo)簽庫技術(shù)需要配置的文獻(xiàn)。以下是tiles-defs.xml配置文獻(xiàn)的基本結(jié)構(gòu):<?xmlversion="1.0"encoding="UTF-8"?><!DOCTYPEtiles-definitionsPUBLIC"-//ApacheSoftwareFoundation//DTDTilesConfiguration1.1//EN"""><!--DefinitionsforTiles--><!--Thisfilecontainsdefinitionscommontoallstrutsmodule.Inparticular,itcontainsthemainlayoutandthecommonmenus.Thereisalsothemainpageasaportal.--><tiles-definitions> <!--===================================================--> <!--Masterdefinitions--> <!--==================================================--> <!--Pagelayoutusedasrootforallpages.--> <definitionname="rootLayout"path="/layouts/rootLayout.jsp"> <putname="checkMessage"value="/do/checkMessagenews"/> <putname="titleString"value="CHANGE-ME"/> <putname="topBanner"value="/app/menu/topbar.jsp"/> <putname="firstMenus"value="/do/queryMenus?selfAction=queryFirstMenus"/> <putname="secondMenus"value="/do/queryMenus?selfAction=querySecondMenus"/> <putname="main"value="CHANGE-ME"/> <putname="footer"value="/app/menu/footer.jsp"/> </definition> <!--====================================================--> <!--Pagedefinitions --> <!--===================================================--> <definitionname="tile.SearchVip"extends="rootLayout"> <putname="titleString"value="大客戶查詢"/> <putname="main"value="/app/InfoManager/VIPInfo/searchvipForm.jsp"/> </definition></tiles-definitions>當(dāng)開發(fā)人員完畢一個(gè)重要的功能頁面后,想將其按照應(yīng)用的布局嵌入到工作區(qū)中時(shí),使用上述的定義方法即可達(dá)成目的。tile.SearchVip相稱于是一個(gè)應(yīng)用了tiles模板的一個(gè)jsp,但與真正的jsp不同的是必須使用findForward方法來定向到它。bonc-cofig.xml配置文獻(xiàn):是應(yīng)用使用的參數(shù)、業(yè)務(wù)對(duì)象等的真正屬于bonc-jone平臺(tái)自身的配置文獻(xiàn)。定義屬性名稱格式為:.is.blah=value在這個(gè)文獻(xiàn)中應(yīng)存為:<prop><name><is><blah>value</blah></is></name></prop>其所有的屬性必須在"bonc"元素下。這個(gè)文獻(xiàn)要在bonc_perties文獻(xiàn)所定義的boncHome目錄下。bonc_perties文獻(xiàn)要在應(yīng)用的classpath中。開發(fā)人員需要在這個(gè)文獻(xiàn)中做的重要配置舉例如下:定義業(yè)務(wù)管理接口的實(shí)現(xiàn)類<BusinessManager><VIPInfoManager>com.bonc.example.module.Infomanager.vipinfo.businessmanager.impl.VIPInfoManager_cnc</VIPInfoManager></BusinessManager>定義業(yè)務(wù)對(duì)象<BusinessObj> <VIPInfo_inx><bean-property-hibernatename="bm_inx_vip"type="com.bonc.hibernate.persistenceobj.BmInxVip"/> </VIPInfo_inx> <VIPInfo><bean-property-hibernatename="bm_info_vip"type="com.bonc.hibernate.persistenceobj.BmInfoVip"/><bean-property-nestingname="inx"type="InfoManager.VIPInfo.BusinessObj.VIPInfo_inx"/> <bean-propertyname="cust_new_name"type="java.lang.String"initial=""/> </VIPInfo></BusinessObj>應(yīng)用開發(fā)中的典型環(huán)節(jié)、注意事項(xiàng)及規(guī)定以下我們通過一個(gè)例子來說明應(yīng)用開發(fā)中典型環(huán)節(jié)、注意事項(xiàng)及規(guī)定。假設(shè)數(shù)據(jù)庫中已建好一張這樣的數(shù)據(jù)表:表名:bm_Info_Test有三個(gè)字段:編碼id(varchar)、姓名name(varchar)、年齡age(number(2,0))我們可以使用Hibernate的工具自動(dòng)生成(生成方法見第四章)BmInfoTest.java文獻(xiàn)及BmInfoTest.hbm.xml文獻(xiàn)。注意包途徑必須為:com.bonc.hibernate.persistenceobj。一方面我們要做一個(gè)入口頁面,這個(gè)頁面規(guī)定使用者輸入age值,也即數(shù)據(jù)庫表bm_Info_Test的age的值。輸入項(xiàng)不可認(rèn)為空。如不為空,就根據(jù)這個(gè)條件查出所有大于等于輸入值的記錄;如為空,就在這個(gè)頁面上顯示規(guī)定使用者輸入條件的提醒信息。在struts-cofig-test.xml文獻(xiàn)中,我們定義一個(gè)動(dòng)態(tài)formbean(注意bean的動(dòng)態(tài)屬性必須所有使用小寫字母,要與BmInfoTest.java文獻(xiàn)及BmInfoTest.hbm.xml文獻(xiàn)取名完全一致):<form-beanname="ageForm"type="org.apache.struts.
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(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ǔ)空間,僅對(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ì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年重慶大學(xué)工業(yè)母機(jī)創(chuàng)新研究院勞務(wù)派遣工程師招聘?jìng)淇碱}庫(長期有效)及答案詳解參考
- 2026年工程保修合同條款
- 新疆維吾爾自治區(qū)氣象局2026年度事業(yè)單位公開招聘應(yīng)屆畢業(yè)生備考題庫(第二批第1號(hào))及1套完整答案詳解
- 2026年尾礦庫閉庫治理合同
- 高低壓配電施工合同(標(biāo)準(zhǔn)版)
- 中國人民銀行清算總中心直屬企業(yè)銀清科技有限公司2026年度公開招聘?jìng)淇碱}庫及參考答案詳解一套
- 2025年黃岡市文化和旅游局所屬事業(yè)單位專項(xiàng)公開招聘工作人員備考題庫有答案詳解
- 中國鐵路局河北地區(qū)2026年招聘934人備考題庫及答案詳解參考
- 2025年興業(yè)銀行拉薩分行社會(huì)招聘?jìng)淇碱}庫及完整答案詳解1套
- 2025年為棗莊市檢察機(jī)關(guān)公開招聘聘用制書記員的備考題庫完整答案詳解
- 2025大理州強(qiáng)制隔離戒毒所招聘輔警(5人)筆試考試備考題庫及答案解析
- 2025年安全培訓(xùn)計(jì)劃表
- 2026年榆林職業(yè)技術(shù)學(xué)院?jiǎn)握新殬I(yè)技能測(cè)試題庫參考答案詳解
- 2025年沈陽華晨專用車有限公司公開招聘筆試歷年參考題庫附帶答案詳解
- 2026(蘇教版)數(shù)學(xué)五上期末復(fù)習(xí)大全(知識(shí)梳理+易錯(cuò)題+壓軸題+模擬卷)
- 垃圾中轉(zhuǎn)站機(jī)械設(shè)備日常維護(hù)操作指南
- 汽車行業(yè)可信數(shù)據(jù)空間方案
- 畜牧業(yè)機(jī)械化培訓(xùn)課件
- 工程質(zhì)量管理工作制度
- 云南交投集團(tuán)筆試試題及答案
- 東華大學(xué)《大學(xué)物理A》2025 - 2026學(xué)年第一學(xué)期期末試卷(A卷)
評(píng)論
0/150
提交評(píng)論