




免费预览已结束,剩余22页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
泛微协同商务系统(Ecology) 底层包开发指南目 录1.引言41.1概述41.2定义42.底层包应用及范例42.1最基本的继承类42.2怎样记录日志52.3怎样获取属性文件的值82.4怎样获取系统的运行目录102.5怎样访问和运行数据库脚本112.6如何上传一个文件152.7如何访问已经上传的文件192.8如何使用缓存提高系统效率202.9其它底层类基本方法291. 引言1.1 概述本文档为泛微协同商务系统(Ecology)程序员开发指导文档,讲述了开发底层工具包的应用,常用功能的开发。2. 底层包应用及范例本章对ecology系统的底层工具包进行讲解,开发人员可以从这里学到怎样利用底层的工具包进行开发2.1 最基本的继承类系统中每一个java bean 都需要继承 weaver.general.BaseBean 类 。这个类实现了记录日志和获取属性文件值的方法。继承这两个类的其它类可直接应用这些方法来记录日志,获取属性文件某一个属性的值。方法的实现见后面的例子。继承的例子如下:java bean 的继承public class ResourceComInfo extends BaseBean public void doSomething() /某一个方法方法的处理writeLog(s) ;/ 写日志2.2 怎样记录日志继承了weaver.general.BaseBean ,可以直接使用 writeLog方法记录日志信息。注意这里是使用,而不是调用,因为这个方法是这两个被继承类中的方法。注意writeLog 方法的使用:/* 将某个对象写入Log文件* param obj 被写入的对象*/ public void writeLog(Object obj) 我们看到,可以被记入日志的是任意一个java对象。这些java对象将被自动转换成字符串对象(String)记入到日志文件中。日志文件将每天生成一个,以日志文件名称中的日期来区别,比如:ecology_20030812.log,代表2003年8月12日的日志。当天的日志为ecology.log。每一条日志的记录格式为 :YYYY.MM.DD-HH:MM:SS 记录日志的类名 日志信息比如:2003.03.11-06:52:05 weaver.datacenter.OutReportResult - sql is select ROUND(sum(F_sksr),5) from T_yyrb A , CRM_CustomerInfo where CRM_CustomerInfo.id=A.crmid and CRM_CustomerInfo.id in(5) and A.reportdate = 2004-01-10 and A.reportdate = 0 and A.inputstatus9 and A.modtype=0日志的记录有两种模式,第一种为调试模式,第二种为在线模式。在第一种模式下,所有的java对象都会记录到日志文件中,包括调试信息,在第二种模式下,只有为Exception (异常)的对象才会记录到日志文件中。模式的设置在/ecology/WEB-INF/ perties 属性文件中的log4j.rootLogger 属性来指定,如下:log4j.rootLogger = INFO,A2#if you want to open the trace from open source,just add # ahead of = ERRORlog4j.logger.uk = ERRORlog4j.appender.A2=org.apache.log4j.DailyRollingFileAppenderlog4j.appender.A2.DatePattern=_yyyyMMdd.log#dont modify the file propertylog4j.appender.A2.File=ecologylog4j.appender.A2.layout=org.apache.log4j.PatternLayoutlog4j.appender.A2.layout.ConversionPattern=%dyyyy-MM-dd HH:mm:ss,SSS %-5p %c - %m%n上面的日志表明将所有的信息答应到文件日志文件中 ,其中日志的模式为:#FATAL 0 #ERROR 3 #WARN 4 只有WARN,ERROR,FATAL输出#INFO 6 所有的log都输出#DEBUG 7 记录日志的例子如下:public class ResourceComInfo extends BaseBean private void setResourceInfo() throws Exception try业务处理过程.String debugInfo = This is test ; / 在调试模式下将会记入日志文件 writeLog(debug info is + debugInfo) ; catch(Exception e) / 在任何模式下出现异常,都将会记入日志文件 writeLog(e) ; throw e ; 记录的日志文件形式为:2007-10-15 16:51:50,125 DEBUG weaver.hrm.resource. ResourceComInfo - debug info is This is test如果有异常,将会记录为:2007-10-15 16:51:50,125 ERROR weaver.hrm.resource. ResourceComInfo - java.sql.SQLException: MicrosoftSQLServer JDBC DriverSQLServer形式参数 id_1 定义为 OUTPUT,但实际参数却未声明为 OUTPUT。at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source)at com.microsoft.jdbc.sqlserver.tds.TDSRcessErrorToken(Unknown Source)at com.microsoft.jdbc.sqlserver.tds.TDSRcessReplyToken(Unknown Source)at com.microsoft.jdbc.sqlserver.tds.TDSRPCRcessReplyToken(Unknown Source)at com.microsoft.jdbc.sqlserver.tds.TDSRcessReply(Unknown Source)at com.microsoft.jdbc.sqlserver.SQLServerImplStatement.getNextResultType(Unknown Source)at com.microsoft.jdbc.base.BaseSmonExecute(Unknown Source)at com.microsoft.jdbc.base.BaseStatement.executeInternal(Unknown Source)at com.microsoft.jdbc.base.BasePreparedStatement.execute(Unknown Source)at weaver.conn.RecordSet.executeProc(RecordSet.java:155)at weaver.conn.RecordSet.executeProc(RecordSet.java:109)at weaver.hrm.resource. ResourceComInfo (ResourceComInfo.java:59)at com.caucho.jsp.JavaPage.service(JavaPage.java:87)at com.caucho.jsp.JavaPage.subservice(JavaPage.java:81)at com.caucho.jsp.Page.service(Page.java:410)at com.caucho.server.http.Invocation.service(Invocation.java:319)at com.caucho.server.http.RunnerRequest.handleRequest(RunnerRequest.java:333)at com.caucho.server.http.RunnerRequest.handleConnection(RunnerRequest.java:266)at com.caucho.server.TcpConnection.run(TcpConnection.java:140)at java.lang.Thread.run(Thread.java:484)从上面的日志信息,可以看到ResourceComInfo类的59行代码运行的时候出现错误,这个错误是执行数据库操作的脚本错误,具体的错误信息是:形式参数 id_1 定义为 OUTPUT,但实际参数却未声明为 OUTPUT。说明调用数据库脚本的时候参数的数量有出入。 开发过程中请将日志级别设置为INFO,通过日志可检查程序在哪里出错了。2.3 怎样获取属性文件的值继承了weaver.general.BaseBean 的类,可以直接使用getPropValue方法获取属性文件的值。注意这里是使用,而不是调用,因为这个方法是这两个被继承类中的方法。注意getPropValue方法的使用:/* 从配置文件中获取某个属性的值* param fname 属性文件名称* param key 值* return String 属性值*/ public String getPropValue(String fname , String key)getPropValue 方法指定了从某一个属性文件fname 中获取键值key 的值。这里的属性文件必须存放在系统运行目录下的WEB-INF/prop 目录下,文件名称为参数fname指定的文件名,不包括属性文件的后缀名,属性文件的后缀名必须为 .properties。比如:系统的运行目录为 d:ecology,那么属性文件必须放在d:ecologyWEB-INFprop 目录下,取名为 perties ,其中thefilename是任意的。在属性文件中某一个键值的值用等号来赋值,等号后面的值必须放在一行,如果一行不够写(或者为了查看的方便),可以用 来链接多行。否则其它行的值不能被键值取得。等号左右都可以有空格,对键值和键值的值没有影响。比如 :thekeyname = thevalue将键值的值放到多行:thekeyname = thevalue1 thevalue2 thevalue3thevalue4这时候thekeyname 的值为thevalue1thevalue2thevalue3 ,thevalue4 取不到,因为thevalue3后面没有 在程序中要取得上述属性文件中键值thekeyname的值,使用方法:getPropValue(“thefilename” , “thekeyname”) ;获取属性文件的值的例子如下:public class ResourceComInfo extends BaseBean private void setResourceInfo() throws Exception 业务处理过程.String keyValue = getPropValue(“thefilename” , “thekeyname”) ;/ 将键值thekeyname的值keyValue记入日志文件 writeLog(keyvalue is + keyValue) ; 系统的主属性文件 perties 的文件名“weaver” 作为系统常量放在weaver.general.GCONST 类中,可以使用getConfigFile() 方法来返回 “weaver ”,在编程的过程中,如果需要用到perties属性文件中的键值,请用GCONST. getConfigFile() 来获取,当主属性文件名称因为需要改变得时候,不必改变所有用到这个属性文件的类,只需要改变GCONST类中常量的值2.4 怎样获取系统的运行目录weaver.general.GCONST 类提供了一个静态方法getRootPath() ,返回系统的运行目录,比如系统的运行目录为d 盘的ecology目录,将返回d:ecology获取系统的运行目录的例子如下:public class TestBean extends BaseBean import weaver.general.GCONST ;public void getSysRunPath() String sysRunPath = GCONST. GetRootPath() ;/ 将系统的运行目录sysRunPath的值记入日志文件 writeLog(sysRunPath is + sysRunPath) ; 2.5 怎样访问和运行数据库脚本在ecology系统中,大量的数据库访问,链接的建立和持续性,事务的处理,链接池的维护等问题都被封装在weaver.conn 包下面的各个类中,应用程序的实现者不需要去关心这些问题,而只需要调用weaver.conn.RecordSet 类来执行各种数据库操作。weaver.conn.RecordSet 类实现了从数据库链接池中获取链接,执行指定的数据库脚本或者存储过程,并在脚本或者存储过程执行完毕后将链接及时地归还到链接池中。Ecology系统的链接池管理请参见 weaver.conn.ConnectionPool , weaver.conn.DBConnectionPool ,weaver.conn.ConnCheckerTimer 类的API 文档,weaver.conn.ConnectionPool 用于管理ecology系统中的所有数据库链接池(ecology系统可以同时链接多个数据库,每一个数据库均有一个对应的数据库链接池,由weaver.conn.DBConnectionPool负责管理,而weaver.conn.ConnectionPool则是这些链接池的大管家,负责所有链接池的协调和统一对外接口),weaver.conn.DBConnectionPool用于建立和管理对某一个数据库的链接池,weaver.conn.ConnCheckerTimer用于监控各个链接池的状况,定期对数据库链接池中不符合要求的链接进行清理,并监视是否需要在某一链接池中建立新的链接。调用weaver.conn.RecordSet,实现对数据的操作,下面进行详细的说明:weaver.conn.RecordSet类采用 java.sql 中的 CallableStatement 和 Statement 执行数据库操作。客户端直接调用该类进行数据库操作。不需要考虑数据库链接的建立。其中客户端指所有调用该类进行数据库操作的应用程序,不特指用户的客户端。RecordSet 执行数据库操作有两种形式,一种为调用存储过程,另一种为直接执行SQL语句。与ConnStatement不同 ,RecordSet 执行SQL语句不分查询和修改,都在一条语句中执行。RecordSet执行脚本的方式如下:1、使用默认的链接池执行SQL语句: RecordSet rs = new RecordSet() ;rs.executeSql( select * from TB_Example ) ;while( rs.next() ) String thename = rs.getString(name) ;其它处理代码.2、使用指定的链接池ecologytest执行SQL语句RecordSet rs = new RecordSet() ;rs.executeSql( update TB_Example set name = the new value , ecologytest ) ; 3、使用指定的链接池ecologytest执行存储过程 PD_Example_UpdateById存储过程PD_Example_UpdateById 如下:CREATE PROCEDURE PD_Example_UpdateById (namevarchar(100), idint, flag integer output, msg varchar(80) output) AS update TB_Example set name = name where id = idGO RecordSet rs = new RecordSet() ;String newname = . ;String id = . ;String procpara = newname + Util.getSeparator() + id ;rs.executeProc( PD_Example_UpdateById , procpara , ecologytest ) ;procpara 是存储过程的参数值组成的字符串变量,多个参数值之间用 weaver.general.Util.getSeparator() 分开4、在一个客户程序多个执行之间,查询结果可以保留到下一次查询 RecordSet rs = new RecordSet() ;rs.executeSql( select * from TB_Example ) ;rs.executeSql( update TB_Example set name = the new value ) ;while( rs.next() ) String thename = rs.getString(name) ; /得到修改前查询的值其它处理代码.rs.executeSql( select * from TB_Example ) ;while( rs.next() ) String thename = rs.getString(name) ; /得到修改后查询的值其它处理代码. 访问和运行数据库脚本的例子:public class ResourceComInfo extends BaseBean private void setResourceInfo() throws Exception 业务处理过程.String sqlStr = “select * from Hrmresorce” ;RecordSet rt = new RecordSet() ;rt.executeSql(sqlStr) ;while(rt.next() String id = Util.null2String(rt.getString(id); String loginid = Util.null2String(rt.getString(loginid); String lastname = Util.null2String(rt.getString(lastname); / 将数据库的值记入日志文件 writeLog(id is + id) ; writeLog(loginid is + loginid) ; writeLog(lastname is + lastname) ; 其它关于系统数据库信息的管理a)、weaver.conn.ConnectionPool 类的管理和设置: 所有的数据库链接池的集合,用链接池名称区别每一个链接池.支持对一个或多个由属性文件定义的数据库连接池的访问.客户程序可以调用getInstance()方法访问本类的唯一实例。对于一个链接池集合来说,可以有多个链接池,分别链接不同的数据库。应用程序指定链接池的名称来调用不同的链接池。如果应用程序没有指定链接池的名称,将使用默认的链接池。默认链接池的指定有两种方式:1、在Application Server设置的初始参数serverName的值 ,以Resin 为例: 2、如果Application Server没有相应设置,则系统使用属性文件(perties)中设置的默认链接池名称:DefaultPoolName = ecology对于所有的链接池,系统需要加载相应的 JDBC Driver来建立与相应数据库的链接。这些 Driver 在属性文件(perties)中指定,多个Driver中间用空格隔开:DriverClasses = com.microsoft.jdbc.sqlserver.SQLServerDriver 对于每一个链接池需要用到的参数在属性文件(perties)中指定,属性文件中参数的名称以链接池的名称开头,中间加入小数点,比如链接池 ecology 的参数指定为 :ecology.url = jdbc:microsoft:sqlserver:/05:1433;DatabaseName=ecology /db urlecology.user = sa /db user name ecology.password = 123456 /db user password ecology.charset = ISO_1 /db encodeecology.maxconn = 10 /max conn in conn poolecology.minconn = 2 /min conn in conn poolecology.maxusecount = 30 /the max use times of a connecology.maxidletime = 30 /the max unuse time of a conn (分)ecology.maxalivetime = 2 /一个链接被调用后的最大未归回时间 (分)ecology.checktime = 500 /检查的频率 (秒)b)、weaver.conn. DBConnectionPool类的管理和设置:数据库链接池,所有创建的链接存放在链接池中,在客户端链接数据库时从链接池中取出链接,客户端在完成数据库操作后将链接返回链接池。 链接池创建链接需要用到的参数在属性文件(perties)中指定,属性文件中参数的名称以链接池的名称开头,中间加入小数点,比如链接池 ecology 的参数指定为 :ecology.url = jdbc:microsoft:sqlserver:/05:1433;DatabaseName=AIS2002 /db urlecology.user = sa /db user name ecology.password = 123456 /db user password ecology.charset = ISO_1 /db encodeecology.maxconn = 10 /max conn in conn poolecology.minconn = 2 /min conn in conn poolecology.maxusecount = 30 /the max use times of a connecology.maxidletime = 30 /the max unuse time of a conn (分)ecology.maxalivetime = 2 /一个链接被调用后的最大未归回时间 (分)ecology.checktime = 500 /检查的频率 (秒)2.6 如何上传一个文件上传一个文件只需要调用weaver.file.FileUpload 类。weaver.file.FileUpload 类支持各种文件格式的上传,也支持多文件的上传。B/S 架构的文件上传采用的是multipart/form-data 协议,而不是HTTP协议,采用这种协议上传的数据必须通过特殊的处理,而不能用常规的方法来获取,否则不能得到数据。weaver.file.FileUpload 封装了底层处理的代码,应用程序的实现者不需要关心这些细节!weaver.file.FileUpload上传数据的方法有:/* 进行上传一个文件的操作* param uploadname 需要上传的文件字段名称* return String 返回保存文件信息的imagefileid*/public String uploadFiles(String uploadname)/* 进行上传一个文件的操作* param uploadnames需要上传的多个文件字段名称* return String 返回保存多个文件信息的imagefileid数组*/public String uploadFiles(String uploadnames)这里,需要注意两点,一个是传给uploadFiles 方法的参数, 是上传文件字段的名称,而不是文件的名称(这个时候你并不知道文件的名称)。比如在jsp 或者html页面中文件浏览的字段代码为:那么这里的文件字段的名称为accessory1。 第二点是这个方法返回的信息是保存在数据库表 ImageFile 中关于这个文件信息的键值imagefileid ,这个表的结构如下:Column(s) of ImageFile TableNameDatatypeNull OptionCommentimagefileidintNOT NULL文件idimagefilenamevarchar(200)NULL文件名称imagefiletypevarchar(50)NULL文件MIME类型filerealpathvarchar(255)NULL文件存放目录imagefileusedintNULL文件使用次数iszipchar(1)NULL是否压缩0:否1:是isencryptchar(1)NULL是否加密0:否1:是imagefileimageNULL文件(存在在数据库中的文件内容,现已不使用)从表结构可以看出,我们得到了某一个文件信息的imagefileid,就可以从该表中得到相应的文件名称(这里指文件的实际名称,比如test.doc), 文件MIME类型(比如 txt,doc,gif等) ,文件存放目录(这里指在服务器中存放的实际路径信息,包括实际存放的文件名称,比如 e:ecologyfilesystem200308A23143567.zip)。通过这些信息,可以对文件进行操作,当然weaver.file.FileUpload 还提供了其它很多方法来获取文件相关的信息,不需要通过数据表的查询就能得到这些信息。存放在数据表中的信息只是供今后文件处理的时候使用!上传文件的例子:首先,我们要创建一个提交数据的页面,可以是jsp 的页面,也可以是html 的页面,我们将数据提交给 weaver.test.MutiFileUpload 的servlet 类来处理:文件上传这是一个文件上传的例子将上面这段代码保存为一个html 文件FileUploadTest.htm,放在ecology运行目录下的/test/目录下。在这个页面中,有一个输入框和两个文件框可以输入信息。注意,在环境的配置中,需要告诉web服务器将 /weaver/ 的请求转给应用服务器作为servlet处理,关于配置的信息,请参考Apache 和Resin的配置文档。下面我们来编写weaver.test.MutiFileUploadpackage weaver.test;/* * Title: 多文件上传处理类 * Description: 多文件上传测试 * Copyright: Copyright (c) 2001 * Company: weaver * author liuyu * version 1.0 */import javax.servlet.http.HttpServletRequest;import weaver.general.DynamicServlet;import weaver.file. FileUpload;public class MutiFileUpload extends DynamicServlet public void doProcess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException FileUpload fu = new FileUpload(request) ;String fileDesc = fu.getParameter(filedesc) ; /* 1*/String fileFieldNames = accessory1, accessory2 ;String fileIds = fu.uploadFiles(fileFieldNames) ; /*2*/String fileNames = fu.getFileNames() ;/*3*/ 将请求信息记入日志文件 writeLog(fileDesc is + fileDesc) ;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);以上代码需要注意的几个地方:注释1:由于使用了multipart/form-data协议, 这里获取请求中的信息必须使用fu. getParameter() 方法,而不能使用 request.getParameter() 方法,否则不能得到filedesc的值!注释2:使用uploadFiles方法上传accessory1和accessory2中的文件,同时返回保存在ImageFile 表中的文件基本信息的键值imagefileid,可以将这个imagefileid记录到其它地方以便今后调用。注释3:使用getFileNames方法获取上传文件的真实名称(包括后缀名)将代码保存到 /src/weaver/test/MutiFileUpload.java 文件中。访问FileUploadTest.htm 来测试一下,看看日志文件中的记录是否正确。页面提交,文件上传完毕后将再次返回FileUploadTest.htm页面。你可以查看ImageFile表来检查文件的具体存放位置等信息。文件的存放位置在系统设置模块中设置,如果没有设置,将存放在系统运行目录下的 filesystem 目录下。2.7 如何访问已经上传的文件在jsp页面或者html页面中访问已经上传的文件非常简单,只需要调用weaver.file.FileDownload类,并传递需要访问的文件id ,这个文件id,就是在文件上传中返回的 imagefileid。访问上传的文件有两种方式,一种是非下载方式,这种方式如果浏览器能够显示访问的文件类型,那么就会在浏览器中直接显示。另一种是下载方式,无论访问的文件是什么类型,都使用弹出下载窗口的形式下载。对非下载方式的链接访问A href= /weaver/weaver.file.FileDownload?fileid=文件1对下载方式的链接访问A href= /weaver/weaver.file.FileDownload?fileid=&download=1文件1如果知道要访问的文件是图片,并需要在浏览页面中直接显示这个图片,可以使用下面的代码访问IMG SRC=/weaver/weaver.file.FileDownload?fileid=当然如果对于对应的文档,你没有权限,那么这个地址会让你返回到登录页面2.8 如何通过EXCEL导入数据我们可以通过EXCEL导入一些数据实现系统的初始化,导入一个EXCEL需要用到weaver.file. ExcelParse,在ECOLOGY中导入一个EXCEL很简单,weaver.file. ExcelParse进行了封装,通过调用其中的方法:init(String filename)和getValue(String sheetname , String rownum , String columnnum)就可以实现实例EXCEL导入这是一个EXCEL导入的例子下面是export.jsp的例子FileUploadToPath fu = new FileUploadToPath(request) ; / 上传EXCEL文件String filename = fu.uploadFiles(excelfile) ; /获取EXCEL路径ExcelParse.
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 租赁合同担保法律风险规避与合规审查要点
- 大宗固废循环利用技术开发方案
- 数字化在线营销方案策划
- 2025年风电行业市场前瞻:技术创新引领风电运维服务升级报告
- 石嘴山快速门施工方案
- 项目咨询策划方案范文
- DB65T 4332-2020 羊鼻蝇蛆病防治技术规程
- 冻货应急预案(3篇)
- DB65T 4504-2022 马血液梨形虫检测技术规程
- 生物质能源在分布式能源系统中的2025年应用技术创新与市场前景分析报告
- 苯二氮卓药讲课件
- 班主任班级卫生管理培训
- 小学生钻石画社团课件
- 隐私计算在档案中的应用-洞察及研究
- 防止触电事故的安全技术措施
- 中国酒店发展阶段课件
- 2025年重庆市八中科学城中学校小升初自主招生数学试题
- 科技论文写作 第2版 课件 第1-5章 科技论文写作概述-英文科技论文的写作
- 新生儿医患沟通实务要点
- 旅行社地接合同协议书
- 中医失眠治疗
评论
0/150
提交评论