泛微協(xié)同商務(wù)系統(tǒng)(Ecology)_系統(tǒng)底層包開(kāi)發(fā)指南_第1頁(yè)
泛微協(xié)同商務(wù)系統(tǒng)(Ecology)_系統(tǒng)底層包開(kāi)發(fā)指南_第2頁(yè)
泛微協(xié)同商務(wù)系統(tǒng)(Ecology)_系統(tǒng)底層包開(kāi)發(fā)指南_第3頁(yè)
泛微協(xié)同商務(wù)系統(tǒng)(Ecology)_系統(tǒng)底層包開(kāi)發(fā)指南_第4頁(yè)
泛微協(xié)同商務(wù)系統(tǒng)(Ecology)_系統(tǒng)底層包開(kāi)發(fā)指南_第5頁(yè)
已閱讀5頁(yè),還剩21頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡(jiǎn)介

1、底層包開(kāi)發(fā)指南目錄1. 引言 1.1 概述 1.2 定義 2. 底層包應(yīng)用及范例 2.1 最基本的繼承類(lèi) 2.2 怎樣記錄日志 2.3 怎樣獲取屬性文件的值 2.4 怎樣獲取系統(tǒng)的運(yùn)行目錄 2.5 怎樣訪(fǎng)問(wèn)和運(yùn)行數(shù)據(jù)庫(kù)腳本 2.6 如何上傳一個(gè)文件 2.7 如何訪(fǎng)問(wèn)已經(jīng)上傳的文件 2.8 如何使用緩存提高系統(tǒng)效率 2.9 其它底層類(lèi)基本方法 1. 引言1.1 概述本文檔為泛微協(xié)同商務(wù)系統(tǒng)( Ecology )程序員開(kāi)發(fā)指導(dǎo)文檔,講述 底層工具包的應(yīng)用,常用功能的開(kāi)發(fā)。2. 底層包應(yīng)用及范例利用底層的工具包進(jìn)行開(kāi)發(fā)開(kāi)發(fā)人員可以從這里學(xué)到怎樣2.1 最基本的繼承類(lèi) 繼承的例子如下:java bea

2、n 的繼承public class ResourceComInfo extends BaseBean public void doSomething() / 某一個(gè)方法方法的處理 writeLog(s) ; / 寫(xiě)日志2.2 怎樣記錄日志注意 writeLog 方法的使用:/* 將某個(gè)對(duì)象寫(xiě)入 Log 文件* param obj 被寫(xiě)入的對(duì)象*/public void writeLog(Object obj)2003年 8月 12日的日志。當(dāng)天的日志為 ecology.log 。每一條日志的記錄 格式為 :YYYY.MM.DD-HH:MM:S記S 錄日志的類(lèi)名 日志信息 比如:20032004

3、-01-10' and A.reportdate <= '2004-03-10' andA.inputstatus >= '0' and A.inputstatus<>'9' and A.modtype='0' 日志的記錄有兩種模式,第一種為調(diào)試模式,第二種為在線(xiàn)模式。在第一種 模式下,所有的 java 對(duì)象都會(huì)記錄到日志文件中,包括調(diào)試信息,在第二 種模式下,只有為 Exception (異常)的對(duì)象才會(huì)記錄到日志文件中。模式 的設(shè)置在 /ecology/WEB-INF/ log4jinit.pr

4、operties 屬性文件中的 log4j.rootLogger 屬性來(lái)指定,如下: log4j.rootLogger = INFO,A2#if you want to open the trace from open source,just add # aheadof line#don't modify the file property 上面的日志表明將所有的信息答應(yīng)到文件日志文件中 ,其中日志的模式為: #FATAL 0#ERROR 3#WARN 4 只有 WARN,ERROR,FAT輸AL出#INFO 6 所有的 log 都輸出#DEBUG 7記錄日志的例子如下:public

5、class ResourceComInfo extends BaseBean private void setResourceInfo() throws Exception try業(yè)務(wù)處理過(guò)程 .String debugInfo = "This is test" ;/ 在調(diào)試模式下將會(huì)記入日志文件writeLog("debug info is "+ debugInfo) ;catch(Exception e) / 在任何模式下出現(xiàn)異常,都將會(huì)記入日志文件writeLog(e) ;throw e ; 記錄的日志文件形式為: 2007-10-15 16:51

6、:50,125 DEBUG weaver.hrm.resource. ResourceComInfo - debug info is This is test 如果有異常,將會(huì)記錄為: 2007-10-15 16:51:50,125 ERROR weaver.hrm.resource. ResourceComInfo -at weaver.hrm.resource. ResourceComInfo (ResourceComInfo.java:59) 從上面的日志信息,可以看到 ResourceComInfo 類(lèi)的 59 行代碼運(yùn)行的時(shí)候 出現(xiàn)錯(cuò)誤,這個(gè)錯(cuò)誤是執(zhí)行數(shù)據(jù)庫(kù)操作的腳本錯(cuò)誤,具體的錯(cuò)誤

7、信息是:形 式參數(shù) 'id_1' 定義為 OUTPU,T 但實(shí)際參數(shù)卻未聲明為 OUTPUT。說(shuō)明調(diào) 用數(shù)據(jù)庫(kù)腳本的時(shí)候參數(shù)的數(shù)量有出入。開(kāi)發(fā)過(guò)程中請(qǐng)將日志級(jí)別設(shè)置為 INFO,通過(guò)日志可檢查程序在哪里出錯(cuò)了。2.3 怎樣獲取屬性文件的值 getPropValue 方法獲取屬性文件的值。 注意這里是使用, 而不是調(diào)用, 因?yàn)?這個(gè)方法是這兩個(gè)被繼承類(lèi)中的方法。注意 getPropValue 方法的使用:/* 從配置文件中獲取某個(gè)屬性的值* param fname 屬性文件名稱(chēng)* param key 值* return String 屬性值*/public String getP

8、ropValue(String fname , String key) getPropValue 方法指定了從某一個(gè)屬性文件 fname 中獲取鍵值 key 的值。 這里的屬性文件必須存放在系統(tǒng)運(yùn)行目錄下的 WEB-INF/prop 目錄下,文件 名稱(chēng)為參數(shù) fname 指定的文件名,不包括屬性文件的后綴名,屬性文件的后 綴名必須為 .properties 。比如: 系統(tǒng)的運(yùn)行目錄為 ,那么屬性文件必須放在 d:ecologyWEB-INFprop 目錄下,取名為 perties , 其中 thefilename 是任意的。在屬性文件中某一個(gè)鍵值的值用等號(hào)來(lái)賦值,

9、等號(hào)后面的值必須放在一行, 如果一行不夠?qū)?或者為了查看的方便),可以用 來(lái)鏈接多行。否則其 它行的值不能被鍵值取得。等號(hào)左右都可以有空格,對(duì)鍵值和鍵值的值沒(méi)有 影響。比如 :thekeyname = thevalue將鍵值的值放到多行:thekeyname = thevalue1 thevalue2 thevalue3thevalue4這時(shí)候 thekeyname 的值為 thevalue1thevalue2thevalue3 ,thevalue4 取 不到,因?yàn)?thevalue3 后面沒(méi)有 在程序中要取得上述屬性文件中鍵值 thekeyname 的值,使用方法: getPropValue

10、( “ thefilename ” , “ thekeyname”) ;獲取屬性文件的值的例子如下:public class ResourceComInfo extends BaseBean private void setResourceInfo() throws Exception 業(yè)務(wù)處理過(guò)程 .String keyValue = getPropValue( “ thefilename ” , “thekeyname”) ;/ 將鍵值 thekeyname 的值 keyValue 記入日志文件 writeLog("keyvalue is "+ keyValue) ;系

11、統(tǒng)的主屬性文件 perties 的文件名“ weaver” 作為系統(tǒng)常量 放在 weaver.general.GCONST 類(lèi)中,可以使用 getConfigFile() 方法來(lái)返 回 “ weaver ”,在編程的過(guò)程中,如果需要用到 perties 屬性 文件中的鍵值,請(qǐng)用 GCONSTg. etConfigFile()來(lái)獲取,當(dāng)主屬性文件名稱(chēng)因?yàn)樾枰淖兊脮r(shí)候,不必改變所有用到這個(gè)屬性文件的類(lèi),只需要改變 GCONS類(lèi)T 中常量的值2.4 怎樣獲取系統(tǒng)的運(yùn)行目錄weaver.general.GCONST 類(lèi)提供了一個(gè)靜態(tài)方法 getRootPath

12、() ,返回系統(tǒng) 的運(yùn)行目錄,比如系統(tǒng)的運(yùn)行目錄為 d 盤(pán)的 ecology 目錄,將返回 d:ecology獲取系統(tǒng)的運(yùn)行目錄的例子如下:public class TestBean extends BaseBean import weaver.general.GCONST ;public void getSysRunPath()String sysRunPath = GCONST. GetRootPath() ;/ 將系統(tǒng)的運(yùn)行目錄 sysRunPath 的值記入日志文件 writeLog("sysRunPath is "+ sysRunPath) ;2.5 怎樣訪(fǎng)問(wèn)和運(yùn)

13、行數(shù)據(jù)庫(kù)腳本Ecology 系統(tǒng)的鏈接池管理請(qǐng)參見(jiàn) weaver.conn.ConnectionPool , weaver.conn.DBConnectionPool , weaver.conn.ConnCheckerTimer 類(lèi)的 API 文檔, weaver.conn.ConnectionPool 用于管理 ecology 系統(tǒng)中的所有 數(shù)據(jù)庫(kù)鏈接池 (ecology 系統(tǒng)可以同時(shí)鏈接多個(gè)數(shù)據(jù)庫(kù), 每一個(gè)數(shù)據(jù)庫(kù)均有一 個(gè)對(duì)應(yīng)的數(shù)據(jù)庫(kù)鏈接池,由 weaver.conn.DBConnectionPool 負(fù)責(zé)管理,而 weaver.conn.ConnectionPool 則是這些鏈接池的大管

14、家, 負(fù)責(zé)所有鏈接池的 協(xié)調(diào)和統(tǒng)一對(duì)外接口 ) ,weaver.conn.DBConnectionPool 用于建立和管理對(duì) 某一個(gè)數(shù)據(jù)庫(kù)的鏈接池, weaver.conn.ConnCheckerTimer 用于監(jiān)控各個(gè)鏈接 池的狀況,定期對(duì)數(shù)據(jù)庫(kù)鏈接池中不符合要求的鏈接進(jìn)行清理,并監(jiān)視是否 需要在某一鏈接池中建立新的鏈接。RecordSet 執(zhí)行數(shù)據(jù)庫(kù)操作有兩種形式,一種為調(diào)用存儲(chǔ)過(guò)程,另一種為直 接執(zhí)行 SQL語(yǔ)句。與 ConnStatement 不同 ,RecordSet 執(zhí)行 SQL語(yǔ)句不分 查詢(xún)和修改,都在一條語(yǔ)句中執(zhí)行。 RecordSet 執(zhí)行腳本的方式如下: 1、使用默認(rèn)的鏈接

15、池執(zhí)行 SQL語(yǔ)句:RecordSet rs = new RecordSet() ;rs.executeSql(" select * from TB_Example ") ;while( rs.next() ) String thename = rs.getString("name") ;其它處理代碼 2、使用指定的鏈接池 ecologytest 執(zhí)行 SQL語(yǔ)句RecordSet rs = new RecordSet() ;rs.executeSql(" update TB_Example set name = 'the new va

16、lue' " , "ecologytest" ) ;3 、使用指定的鏈接池 ecologytest 執(zhí)行存儲(chǔ)過(guò)程 PD_Example_UpdateById 存儲(chǔ)過(guò)程 PD_Example_UpdateById 如下:CREATE PROCEDURE PD_Example_UpdateById (name varchar(100), id int,flag integer output,msg varchar(80) output)ASupdate TB_Example set name = name where id= idGORecordSet rs

17、= new RecordSet() ;String newname = ;String id = ;String procpara = newname + Util.getSeparator() + id ; rs.executeProc( "PD_Example_UpdateById" , procpara , "ecologytest" ) ;4、在一個(gè)客戶(hù)程序多個(gè)執(zhí)行之間,查詢(xún)結(jié)果可以保留到下一次查詢(xún) RecordSet rs = new RecordSet() ;rs.executeSql(" select * from TB_Exam

18、ple ") ;rs.executeSql(" update TB_Example set name = 'the new value '") ; while( rs.next() ) String thename = rs.getString("name") ; /得到修改前查詢(xún)的值其它處理代碼 . rs.executeSql(" select * from TB_Example ") ; while( rs.next() ) String thename = rs.getString("name

19、") ; /得到修改后查詢(xún)的值其它處理代碼 訪(fǎng)問(wèn)和運(yùn)行數(shù)據(jù)庫(kù)腳本的例子: public class ResourceComInfo extends BaseBean private void setResourceInfo() throws Exception 業(yè)務(wù)處理過(guò)程 .String sqlStr= “ select * from Hrmresorce ” ;RecordSet rt = new RecordSet() ; rt.executeSql(sqlStr) ; while(rt.next() String id =Util.null2String(rt.getStri

20、ng("id");String loginid = Util.null2String(rt.getString("loginid");String lastname = Util.null2String(rt.getString("lastname");/ 將數(shù)據(jù)庫(kù)的值記入日志文件writeLog("id is "+ id) ; writeLog("loginid is "+ loginid) ; writeLog("lastname is "+ lastname) ; 其它

21、關(guān)于系統(tǒng)數(shù)據(jù)庫(kù)信息的管理 a) 、weaver.conn.ConnectionPool 類(lèi)的管理和設(shè)置: 所有的數(shù)據(jù)庫(kù)鏈接池的集合,用鏈接池名稱(chēng)區(qū)別每一個(gè)鏈接池 . 支持對(duì)一個(gè) 或多個(gè)由屬性文件定義的數(shù)據(jù)庫(kù)連接池的訪(fǎng)問(wèn) . 客戶(hù)程序可以調(diào)用 getInstance() 方法訪(fǎng)問(wèn)本類(lèi)的唯一實(shí)例。 對(duì)于一個(gè)鏈接池集合來(lái)說(shuō),可以有多個(gè)鏈接池,分別鏈接不同的數(shù)據(jù)庫(kù)。應(yīng) 用程序指定鏈接池的名稱(chēng)來(lái)調(diào)用不同的鏈接池。 如果應(yīng)用程序沒(méi)有指定鏈接 池的名稱(chēng),將使用默認(rèn)的鏈接池。默認(rèn)鏈接池的指定有兩種方式: 1、在 Application Server 設(shè)置的初始參數(shù) serverName 的值 ,以 Resin

22、 為 例:<init-param serverName='ecology'/> <load-on-startup/></servlet>2、如果 Application Server 沒(méi)有相應(yīng)設(shè)置,則系統(tǒng)使用屬性文件 ( perties )中設(shè)置的默認(rèn)鏈接池名稱(chēng):DefaultPoolName = ecology 對(duì)于所有的鏈接池, 系統(tǒng)需要加載相應(yīng)的 JDBC Driver 來(lái)建立與相應(yīng)數(shù)據(jù)庫(kù) 的鏈接。這些 Driver 在屬性文件(perties )中指定,多個(gè) Driver 中間用空格隔開(kāi): 對(duì)于

23、每一個(gè)鏈接池需要用到的參數(shù)在屬性文件( perties )中指 定,屬性文件中參數(shù)的名稱(chēng)以鏈接池的名稱(chēng)開(kāi)頭,中間加入小數(shù)點(diǎn),比如鏈 接池 ecology 的參數(shù)指定為 : 05:1433;DatabaseName=ecology /db url ecology.user = sa /db user name ecology.password = 123456 /db user password ecology.charset = ISO_1/db encode ecology.maxconn = 10 /max conn in conn pool/the m

24、ax use times of a connecology.minconn = 2 /min conn in conn pool ecology.maxusecount = 30ecology.maxidletime = 30 (分) ecology.maxalivetime = 2 時(shí)間 (分)/the max unuse time of a conn/ 一個(gè)鏈接被調(diào)用后的最大未歸回ecology.checktime = 500/ 檢查的頻率 (秒)b) 、weaver.conn. DBConnectionPool 類(lèi)的管理和設(shè)置:數(shù)據(jù)庫(kù)鏈接池,所有創(chuàng)建的鏈接存放在鏈接池中,在客戶(hù)端鏈接數(shù)據(jù)

25、庫(kù)時(shí)從 鏈接池中取出鏈接,客戶(hù)端在完成數(shù)據(jù)庫(kù)操作后將鏈接返回鏈接池。 鏈接池創(chuàng)建鏈接需要用到的參數(shù)在屬性文件 (perties )中指定, 屬性文件中參數(shù)的名稱(chēng)以鏈接池的名稱(chēng)開(kāi)頭,中間加入小數(shù)點(diǎn),比如鏈接池 ecology 的參數(shù)指定為 :05:1433;DatabaseName=AIS2002 /db urlecology.user = sa/db user nameecology.password = 123456 /db user password ecology.charset = ISO_1 /db encode ecology.maxconn =

26、 10 /max conn in conn pool ecology.minconn = 2 /min conn in conn pool ecology.maxusecount = 30/the max use times of a connecology.maxidletime = 30 (分) ecology.maxalivetime = 2 時(shí)間 (分) ecology.checktime = 500 / 檢查的頻率 (秒)/the max unuse time of a conn/ 一個(gè)鏈接被調(diào)用后的最大未歸回2.6 如何上傳一個(gè)文件B/S 架構(gòu)的文件上傳采用的是 multipart

27、/form-data* 進(jìn)行上傳一個(gè)文件的操作* param uploadname 需要上傳的文件字段名稱(chēng)* return String 返回保存文件信息的 imagefileid*/public String uploadFiles(String uploadname)/* 進(jìn)行上傳一個(gè)文件的操作* param uploadnames 需要上傳的多個(gè)文件字段名稱(chēng)* return String 返回保存多個(gè)文件信息的 imagefileid 數(shù)組*/public String uploadFiles(String uploadnames) 這里,需要注意兩點(diǎn),一個(gè)是傳給 uploadFiles

28、 方法的參數(shù), 是上傳文件 字段的名稱(chēng),而不是文件的名稱(chēng)(這個(gè)時(shí)候你并不知道文件的名稱(chēng))。比如 在 jsp 或者 html 頁(yè)面中文件瀏覽的字段代碼為:<input type=file size=70 name="accessory1">那么這里的文件字段的名稱(chēng)為 "accessory1" 。 第二點(diǎn)是這個(gè)方法返回的信 息是保存在數(shù)據(jù)庫(kù)表 ImageFile 中關(guān)于這個(gè)文件信息的鍵值 imagefileid , 這個(gè)表的結(jié)構(gòu)如下:Column(s) of "ImageFile" TableNameDatatypeNull

29、OptionCommentimagefileidintNOT NULL文件 idimagefilenamevarchar(200)NULL文件名稱(chēng)imagefiletypevarchar(50)NULL文件 MIME類(lèi)型filerealpathvarchar(255)NULL文件存放目錄imagefileusedintNULL文件使用次數(shù)iszipchar(1)NULL是否壓縮0:否1:是isencryptchar(1)NULL是否加密0:否1:是imagefileimageNULL文件(存在在數(shù)據(jù)庫(kù)中 的文件內(nèi)容,現(xiàn)已不使 用)從表結(jié)構(gòu)可以看出,我們得到了某一個(gè)文件信息的 imagefile

30、id 上傳文件的例子:<HTML><HEAD><TITLE>文件上傳 </TITLE></HEAD><BODY><P>這是一個(gè)文件上傳的例子 </P><FORM id=weaver name=weaver action="" method=post enctype="multipart/form-data"><! 注意,這里需要用 enctype="multipart/form-data" 表明使用 multipart/f

31、orm-data 協(xié)議 -> <input type="text" size="70" name="filedesc"><input type="file" size="70" name="accessory1"><input type="file" size="70" name="accessory2"><input type="submit" n

32、ame=" 提交 "></FORM></BODY></HTML>將上面這段代碼保存為一個(gè) html 文件 FileUploadTest.htm ,放在 ecology 運(yùn)行目錄下的 /test/ 目錄下。在這個(gè)頁(yè)面中,有一個(gè)輸入框和兩個(gè)文件框可 以輸入信息。注意,在環(huán)境的配置中,需要告訴 web 服務(wù)器將 /weaver/ 的 請(qǐng)求轉(zhuǎn)給應(yīng)用服務(wù)器作為 servlet 處理,關(guān)于配置的信息, 請(qǐng)參考 Apache 和 Resin 的配置文檔。package weaver.test;/* Title:多文件上傳處理類(lèi)* Descript

33、ion:多文件上傳測(cè)試* Copyright: Copyright (c) 2001* Company: weaver* author liuyu* version 1.0*/ import weaver.file. FileUpload;public class MutiFileUpload extends DynamicServlet public void doProcess(HttpServletRequest request,HttpServletResponse response) throws ServletException, IOException FileUpload fu

34、 = new FileUpload(request) ;String fileDesc = fu.getParameter("filedesc") ; /* 1*/String fileFieldNames = " accessory1"," accessory2" String fileIds = fu.uploadFiles(fileFieldNames) ;String fileNames = fu.getFileNames() ; / 將請(qǐng)求信息記入日志文件 writeLog("fileDesc is "+

35、 fileDesc) ;/*3*/for (int i=0; i< fileIds.length; i+) String fileId = fileIdsi ;If(fileId = null) continue ;String fileName = fileNamesi ;writeLog("fileId is "+ fileId) ; writeLog("fileName is "+ fileName) ; response.sendRedirect("/test/FileUploadTest.htm");以上代碼需要注意的

36、幾個(gè)地方:注釋 1:由于使用了 multipart/form-data協(xié)議, 這里獲取請(qǐng)求中的信息必須使用 fu. getParameter() 方法,而不能使用 request.getParameter() 方法,否則不能得到 filedesc 的值!注釋 2:使用 uploadFiles 方法上傳 accessory1 和 accessory2 中的文件, 同時(shí)返回保存在 ImageFile 表中的文件基本信息的鍵值 imagefileid ,可以 將這個(gè) imagefileid 記錄到其它地方以便今后調(diào)用。注釋 3:使用 getFileNames 方法獲取上傳文件的真實(shí)名稱(chēng)(包括后綴名)

37、 將代碼保存到 /src/weaver/test/MutiFileUpload.java 文件中。訪(fǎng)問(wèn) FileUploadTest.htm 來(lái)測(cè)試一下,看看日志文件中的記錄是否正確。頁(yè)面 提交,文件上傳完畢后將再次返回 FileUploadTest.htm 頁(yè)面。你可以查看 ImageFile 表來(lái)檢查文件的具體存放位置等信息。 文件的存放位置在系統(tǒng)設(shè)置模塊中設(shè)置,如果沒(méi)有設(shè)置,將存放在系統(tǒng)運(yùn)行 目錄下的 filesystem 目錄下。2.7 如何訪(fǎng)問(wèn)已經(jīng)上傳的文件在 jsp 頁(yè)面或者 html 頁(yè)面中訪(fǎng)問(wèn)已經(jīng)上傳的文件非常簡(jiǎn)單,只需要調(diào)用 weaver.file.FileDownload

38、類(lèi),并傳遞需要訪(fǎng)問(wèn)的文件 id ,這個(gè)文件 id , 就是在文件上傳中返回的 imagefileid 。訪(fǎng)問(wèn)上傳的文件有兩種方式,一種是非下載方式,這種方式如果瀏覽器能夠 顯示訪(fǎng)問(wèn)的文件類(lèi)型,那么就會(huì)在瀏覽器中直接顯示。另一種是下載方式, 無(wú)論訪(fǎng)問(wèn)的文件是什么類(lèi)型,都使用彈出下載窗口的形式下載。對(duì)非下載方式的鏈接訪(fǎng)問(wèn)<A href= "/weaver/weaver.file.FileDownload?fileid=<%=fileid%>"> 文 件 1</A>對(duì)下載方式的鏈接訪(fǎng)問(wèn)<A href= "/weaver/weav

39、er.file.FileDownload?fileid=<%=fileid%>&download=1"> 文件 1</A>如果知道要訪(fǎng)問(wèn)的文件是圖片,并需要在瀏覽頁(yè)面中直接顯示這個(gè)圖片,可 以使用下面的代碼訪(fǎng)問(wèn)<IMG SRC="/weaver/weaver.file.FileDownload?fileid=<%=fileid%>"> 當(dāng)然如果對(duì)于對(duì)應(yīng)的文檔,你沒(méi)有權(quán)限,那么這個(gè)地址會(huì)讓你返回到登錄頁(yè) 面2.8 如何通過(guò) EXCEL 導(dǎo)入數(shù)據(jù) 我們可以通過(guò) EXCEL導(dǎo)入一些數(shù)據(jù)實(shí)現(xiàn)系統(tǒng)的初始化, 導(dǎo)入

40、一個(gè) EXCEL需要 用到 weaver.file. ExcelParse ,在 ECOLOG中Y導(dǎo)入一個(gè) EXCEL很簡(jiǎn)單, weaver.file. ExcelParse 進(jìn)行了封裝,通過(guò)調(diào)用其中的方法: init(String filename) 和 getValue(String sheetname , String rownum , String columnnum)就可以實(shí)現(xiàn) 實(shí)例 <HTML> <HEAD><TITLE>EXCEL導(dǎo)入</TITLE> </HEAD><BODY> <P>這是一個(gè) E

41、XCEL導(dǎo)入的例子 </P><FORM id=weaver name=weaver action="export.jsp" method=post enctype="multipart/form-data"><! 注意,這里需要用 enctype="multipart/form-data" 表明使用 multipart/form-data 協(xié)議 -><input type="text" size="70" name="filedesc"

42、;> <input type="file" size="70" name="accessory1"> <input type="file" size="70" name="accessory2"> <input type="submit" name=" 提交 "> </FORM></BODY> </HTML> 下面是 export.jsp 的例子 FileUp

43、loadToPath fu = new FileUploadToPath(request) ; / 上傳 EXCEL文件String filename = fu.uploadFiles("excelfile") ; /獲取 EXCEL路徑ExcelParse.init( filename ) ; /進(jìn)行 EXCEL文件初始化int recordercount = 0 ;while( true ) recordercount + ;/ 以下一行一行按列讀取 EXCEL中的數(shù)據(jù) getValue 方法中的第一個(gè)參數(shù)不 要變化,固定為 1,第二個(gè)參數(shù)是行號(hào),第三個(gè)參數(shù)是列號(hào)Str

44、ing workcode = Util.null2String( ExcelParse.getValue("1",""+recordercount , "1" ) ).trim() ;String lastname = Util.null2String( ExcelParse.getValue("1",""+recordercount , "2" ) ).trim() ;String sex = Util.null2String( ExcelParse.getValue(&q

45、uot;1",""+recordercount , "3" ) ).trim() ;String department =Util.null2String( ExcelParse.getValue("1", ""+recordercount ,"4" ) ).trim() ;String subcompany =Util.null2String( ExcelParse.getValue("1", ""+recordercount ,"5

46、" ) ).trim() ;Stringjobtitle = Util.null2String(ExcelParse.getValue("1",""+recordercount , "6" ) ).trim() ;Stringmanager = Util.null2String(ExcelParse.getValue("1",""+recordercount , "7" ) ).trim() ;String status = Util.null2String( Ex

47、celParse.getValue("1",""+recordercount , "8" ) ).trim() ;ExcelParse.getValue("1",ExcelParse.getValue("1",ExcelParse.getValue("1",ExcelParse.getValue("1",第一行為標(biāo)題,一般表示已經(jīng)是最后一行,Stringlocation = Util.null2String(""+recordercou

48、nt , "9" ) ).trim() ;Stringloginid = Util.null2String(""+recordercount , "10" ) ).trim() ;Stringpassword = Util.null2String(""+recordercount , "11" ) ).trim() ;Stringseclevel = Util.null2String(""+recordercount , "12" ) ).trim() ;

49、if( recordercount = 1 ) continue ; / 不處理if( lastname.equals("") ) break ; / 處理結(jié)束導(dǎo)入數(shù)據(jù)業(yè)務(wù)處理過(guò)程 ./ 以上取出 EXCEL文件中2.9 導(dǎo)出 EXCEL 文件 在實(shí)際應(yīng)用在我們常常會(huì)把一些系統(tǒng)統(tǒng)計(jì)數(shù)據(jù)導(dǎo)出成 EXCEL供進(jìn)一步的分析, 在 ECOLOG系Y 統(tǒng)中提供了導(dǎo)出 EXCEL文件的方法, weaver.file. ExcelSheet ,weaver.file. ExcelRow 進(jìn)行了封裝 實(shí)例ExportExcelTest.jsp<% page language=&quo

50、t;java" contentType="text/html; charset=GBK" %><% page import="weaver.file. param HashKey 主鍵名稱(chēng)* param RecKey 子主鍵名稱(chēng)," %> <iframe id="ExcelOut" name="ExcelOut" border=0 frameborder=nonoresize=NORESIZE height="0%" width="0%"&g

51、t;</iframe> <%ExcelSheet es = new ExcelSheet() ; / 對(duì)象ExcelRow er = es.newExcelRow () ; / / 以下為 EXCEL添加多個(gè)列er.addStringValue(er.addStringValue(EXCEL第 1 列的值”EXCEL第 2 列的值”初始化一個(gè) EXCEL的 sheet 準(zhǔn)備新增 EXCEL中的一行 ) ;) ;er.addStringValue( “ EXCEL第 n 列的值” ) ; es.addExcelRow(er) ; / 加入一行 ExcelFile.init()

52、;ExcelFile.setFilename( “導(dǎo)出 EXCEL文件的名字” ) ;ExcelFile.addSheet( “sheet 的名字” , es) ; / 為 EXCEL文件插入一個(gè) SHEET%><a href= ” >到處 EXCEL文件 </a>2.10 如何使用緩存提高系統(tǒng)效率 對(duì)于一些常用的信息,比如人員的名稱(chēng),如果每次訪(fǎng)問(wèn)的時(shí)候都查詢(xún)數(shù)據(jù)庫(kù) 來(lái)獲取,將極大的影響系統(tǒng)的性能。 我們可以將這些信息放到系統(tǒng)的緩存中, 在用到的時(shí)候,從系統(tǒng)緩存中獲取。 (使用緩存是典型的用空間換時(shí)間的系 統(tǒng)優(yōu)化方式)系統(tǒng)提供了 weaver.general.St

53、aticObj 類(lèi)來(lái)保存這些信息。 weaver.general.StaticObj 類(lèi)使用 HashTable 來(lái)管理緩存信息, 其主要的 方法如下:StaticObj 將數(shù)據(jù)庫(kù)中常用的數(shù)據(jù)放入緩存中,以加快系統(tǒng)的反應(yīng)速度。客 戶(hù)程序可以調(diào)用 getInstance() 方法訪(fǎng)問(wèn)本類(lèi)的唯一實(shí)例。StaticObj 有兩層緩存,分別為 mainKey - value 和 mainKey - subkey value ,由 mainKey 可以取得第一層的對(duì)象,由 mainKey - subkey 可以取 得第二層的值,在第二層的值存在的情況下,第一層的值為 Hashtable 。 /* * r

54、eturn Object 對(duì)于的第二層對(duì)象值 */ public Object getRecordFromObj (String HashKey, String RecKey)* 返回唯一實(shí)例 . 如果是第一次調(diào)用此方法 , 則創(chuàng)建實(shí)例* return StaticObj 唯一實(shí)例*/public static StaticObj getInstance() * 獲取 mainKey 對(duì)應(yīng)的第一層對(duì)象值* param key 主鍵名稱(chēng)* return Object 對(duì)于的第一層對(duì)象值 */public Object getObject(String key) /*設(shè)置 mainKey 對(duì)應(yīng)的第

55、一層對(duì)象值* param key 主鍵名稱(chēng)* param obj mainKey 對(duì)應(yīng)的第一層對(duì)象值 */public void putObject(String key, Object obj) /*從緩存中清除 mainKey 對(duì)應(yīng)的第一層對(duì)象值* param key 主鍵名稱(chēng)*/public void removeObject(String key)* 獲取 mainKey - subkey 對(duì)應(yīng)的第二層對(duì)象值設(shè)置 mainKey - subkey 對(duì)應(yīng)的第二層對(duì)象值* param HashKey 主鍵名稱(chēng)* param RecKey 子主鍵名稱(chēng)* param obj mainKey -

56、 subkey對(duì)于的第二層對(duì)象值*/public void putRecordToObj (String HashKey, String RecKey, Object obj)/* 從緩存中清除 mainKey - subkey 對(duì)應(yīng)的第二層對(duì)象值* param HashKey 主鍵名稱(chēng)* param RecKey 子主鍵名稱(chēng) */ public void removeRecordFromObj (String HashKey, String RecKey) /*從緩存中清除 所有對(duì)象值*/public void clearRecord()ResourceComInfo 類(lèi)主要提供人力資源信息

57、中常用的一些信息的緩存, 比如 人員名稱(chēng),所在部門(mén)。對(duì)于這些信息,都需要一個(gè)鍵值。常見(jiàn)的鍵值是這些 信息在數(shù)據(jù)庫(kù)表中的 Primary Key,比如人力資源 ID,其它模塊和功能在關(guān) 聯(lián)人力資源信息的時(shí)候, 只記錄人力資源的 ID,當(dāng)需要獲取人力資源的其它 信息,如人員名稱(chēng),所在部門(mén)的時(shí)候,從 ResourceComInfo 類(lèi)提供的統(tǒng)一接 口中獲取。import java.util.*;import weaver.conn.*;import weaver.general.*;/* Title:人力資源緩存信息接口類(lèi)* Description: 對(duì)其它模塊和功能提供統(tǒng)一的獲取人力資源信息的接

58、口* Copyright: Copyright (c) 2002* Company: weaver* author liuyu* version 1.0*/public class ResourceComInfo extends BaseBean /* 1 */private ArrayList ids = null;/保存人力資源鍵值 ID 隊(duì)列private ArrayList loginids =null;/保存人力資源登錄名 隊(duì)列private ArrayList lastnames= null;/保存人力資源名稱(chēng) 隊(duì)列private ArrayList departmentids =

59、null; /保存人力資源部門(mén) 隊(duì)列private ArrayList seclevels= null;/保存人力資源安全級(jí)別 隊(duì)列private ArrayList statuses =null;/保存人力資源狀態(tài) 隊(duì)列private StaticObj staticobj =null;/公共緩存類(lèi)/* 2 */private int current_index = -1;/當(dāng)前人力資源記錄的指針private int array_size = 0;/人力資源記錄的數(shù)量/* 人力資源緩存信息接口類(lèi)構(gòu)造方法并調(diào)用 getResourceInfo* 構(gòu)造方法中將獲取公共緩存類(lèi)的唯一實(shí)例, 方法獲

60、取緩存信息,* 同時(shí)賦值人力資源記錄的數(shù)量*/public ResourceComInfo() throws Exception staticobj = StaticObj.getInstance(); getResourceInfo() ; array_size = ids.size();/* 獲取人力資源緩存信息方法* 檢查是否有人力資源緩存信息, 如果沒(méi)有, 將調(diào)用 setResourceInfo 方法從數(shù)據(jù)庫(kù)中獲取人力資源信息并放入緩存中* 將緩存中的信息賦予相應(yīng)的隊(duì)列*/private void getResourceInfo() throws Exception/* 3 */if(

61、staticobj.getObject("ResourceInfo") = null) setResourceInfo();/ 將緩存中的信息賦予相應(yīng)的隊(duì)列ids = (ArrayList)(staticobj.getRecordFromObj("ResourceInfo", "ids");loginids =(ArrayList)(staticobj.getRecordFromObj("ResourceInfo","loginids");lastnames =(ArrayList)(staticobj.getRecordFromObj("ResourceInfo","lastnames");depar

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論