Ecology系统程序员开发指南.docx

上传人:b****3 文档编号:4982148 上传时间:2022-12-12 格式:DOCX 页数:30 大小:34.20KB
下载 相关 举报
Ecology系统程序员开发指南.docx_第1页
第1页 / 共30页
Ecology系统程序员开发指南.docx_第2页
第2页 / 共30页
Ecology系统程序员开发指南.docx_第3页
第3页 / 共30页
Ecology系统程序员开发指南.docx_第4页
第4页 / 共30页
Ecology系统程序员开发指南.docx_第5页
第5页 / 共30页
点击查看更多>>
下载资源
资源描述

Ecology系统程序员开发指南.docx

《Ecology系统程序员开发指南.docx》由会员分享,可在线阅读,更多相关《Ecology系统程序员开发指南.docx(30页珍藏版)》请在冰豆网上搜索。

Ecology系统程序员开发指南.docx

Ecology系统程序员开发指南

 

Ecology系统程序员开发指南

 

文件编号:

FFPD-0100-JSWD-001

生效日期:

2003-08-25

受控编号:

FFPD-0100-JSWD-001

密级:

版次:

1.1

修改状态:

总页数

正文

附录

编制:

杨国生

审核:

刘煜

批准:

刘煜

 

文件修改控制

修改记录编号

修改

状态

修改页码及条款

修改人

审核人

批准人

修改日期

A1

新建V1.0

杨国生

刘煜

刘煜

2003-08-25

 

目录

 

1.引言4

1.1概述4

1.2定义4

1.3参考资料4

2.开发规范5

3.底层包应用及范例7

3.1最基本的继承类7

3.2怎样记录日志8

3.3怎样获取属性文件的值11

3.4怎样获取系统的运行目录13

3.5怎样访问和运行数据库脚本14

3.6如何上传一个文件18

3.7如何访问已经上传的文件22

3.8如何使用缓存提高系统效率23

3.9其它底层类基本方法32

 

1.引言

1.1概述

本需求文档为泛微协同商务系统(Ecology)程序员开发指导文档,讲述了开发的规范,底层工具包的应用,常用功能的开发。

通过本文档,开发人员应掌握

1.2定义

1.3参考资料

书籍资料

编号

资料名称

简介

1

Thinkinginjava

Java思想-一本很不错的书

2

JavaServletPrograming

JavaServlet编程

3

J2EE大全

J2EE的一本学习书

Intenet上杂志、专业著作、技术标准以及他们的网址。

网址

简介

J

SUN的java网站

www.java-

java中文站(较多的书籍,代码)

www.javastudy.org

java学习网

2.开发规范

程序文件头部加上文件描述,包括标题,描述,公司,作者,版本,创建日期,修改记录,如下:

/**

*Title:

数据库链接池集合

*Description:

所有的数据库链接池的集合,用链接池名称区别每一个

*链接池

*Company:

泛微软件

*@author:

杨国生

*@version1.0

*createdate:

2001-10-23

*modifylog:

*2002-09-13杨国生增加链接池Encode参数

*

*

*/

各个明显部分间加空行,各方法间加空行,方法前面加方法的注释,遵从JavaDoc规范,与所释方法间不加空行。

注释用中文给出:

/**

*从指定名称的链接池中获得一个可用连接.若没有可用连接,且已有连接

*数小于最大连接数限制,则创建并返回新连接.否则,在指定的时间内等

*待其它线程释放连接.如指定的时间内没有链接返回,则返回空。

*

*@paramname连接池名字

*@paramtime以毫秒计的等待时间

*@returnWeaverConnection可用连接或null

*/

publicWeaverConnectiongetConnection(Stringname,inttime){

DBConnectionPoolpool=(DBConnectionPool)pools.get(name);

if(pool==null)pool=createPools(name);

if(pool!

=null){

clients++;

returnpool.getConnection(time);

}

returnnull;

}

大括号{不换行,}需要换行。

当中代码要缩进。

缩进为4个空格,必须以空格代替Tab键。

圆括号()与前面的方法名间留一个空格,括号内的每个参数前留一个空格,最后一个参数后也留一个空格。

逗号后面,分号前面,运算符号和赙值符号的前后,留一个空格。

类、接口名大写字母开头,后面单词首字母大写。

尽量不用下划线。

如UserGroup(Class)。

对象实例、变量小写字母开头,后面单词大写。

如userSQLBean(UserSQL对象的实例),locationName(变量)。

方法名小写字母开头,首单词一般为动词,后面单词大写开头。

如User.getUserName,UserSQLBean.formatSQLSearch。

开发代码不能使用当前开发环境已经不建议使用的方法。

在开发环境升级的时候,需要重新编译原有系统的代码,如发现原有系统存在升级的环境中不建议使用的方法,应进行更新。

3.底层包应用及范例

本章对ecology系统的底层工具包进行讲解,开发人员可以从这里学到怎样利用底层的工具包进行开发

3.1最基本的继承类

每一个javabean都需要继承weaver.general.BaseBean类,每一个servlet都需要继承weaver.general.DynamicServlet。

这两个类都实现了记录日志和获取属性文件值的方法。

继承这两个类的其它类可直接应用这些方法来记录日志,获取属性文件某一个属性的值。

方法的实现见后面的例子。

继承了weaver.general.DynamicServlet类的servlet已经是一个servlet了,只需要实现weaver.general.DynamicServlet类的抽象方法doProcess就可以实现doGet和doPost方法了。

继承的例子如下:

javabean的继承

publicclassResourceComInfoextendsBaseBean{

publicvoiddoSomething(){//某一个方法

方法的处理………

writeLog(s);//写日志

}

}

servlet的继承

publicclassHelloServletextendsDynamicServlet{

publicvoiddoProcess(HttpServletRequestrequest,HttpServletResponseresponse)throwsServletException,IOException{

对请求的处理………..

}

}

3.2怎样记录日志

继承了weaver.general.BaseBean或weaver.general.DynamicServlet的类,可以直接使用writeLog方法记录日志信息。

注意这里是使用,而不是调用,因为这个方法是这两个被继承类中的方法。

注意writeLog方法的使用:

/**

*将某个对象写入Log文件

*@paramobj被写入的对象

*/

publicvoidwriteLog(Objectobj)

我们看到,可以被记入日志的是任意一个java对象。

这些java对象将被自动转换成字符串对象(String)记入到日志文件中。

日志文件将每天生成一个,以日志文件名称中的日期来区别,比如:

ecology20030812.log,代表2003年8月12日的日志。

每一条日志的记录格式为:

YYYY.MM.DD-HH:

MM:

SS记录日志的类名–日志信息

比如:

2003.03.11-06:

52:

05weaver.datacenter.OutReportResult-sqlisselectROUND(sum(F_sksr),5)fromT_yyrbA,CRM_CustomerInfowhereCRM_CustomerInfo.id=A.crmidandCRM_CustomerInfo.idin(5)andA.reportdate>='2004-01-10'andA.reportdate<='2004-03-10'andA.inputstatus>='0'andA.inputstatus<>'9'andA.modtype='0'

日志的记录有两种模式,第一种为调试模式,第二种为在线模式。

在第一种模式下,所有的java对象都会记录到日志文件中,包括调试信息,在第二种模式下,只有为Exception(异常)的对象才会记录到日志文件中。

模式的设置在weaver.properties属性文件中的DEBUG_MODE属性来指定,如下:

DEBUG_MODE=true//为调试模式

DEBUG_MODE=false//为在线模式

正式上线的系统需要将模式设置为在线模式。

记录日志的例子如下:

publicclassResourceComInfoextendsBaseBean{

privatevoidsetResourceInfo()throwsException{

try{

业务处理过程……….

StringdebugInfo="Thisistest";

//在调试模式下将会记入日志文件

writeLog("debuginfois"+debugInfo);

}

catch(Exceptione){

//在任何模式下出现异常,都将会记入日志文件

writeLog(e);

throwe;

}

}

}

记录的日志文件形式为:

2003.03.11-06:

52:

05weaver.hrm.resource.ResourceComInfo-debuginfoisThisistest

如果有异常,将会记录为:

2003.03.11-06:

52:

05weaver.hrm.resource.ResourceComInfo-java.sql.SQLException:

[Microsoft][SQLServerJDBCDriver][SQLServer]形式参数'@id_1'定义为OUTPUT,但实际参数却未声明为OUTPUT。

atcom.microsoft.jdbc.base.BaseExceptions.getException(UnknownSource)

atcom.microsoft.jdbc.sqlserver.tds.TDSRequest.processErrorToken(UnknownSource)

atcom.microsoft.jdbc.sqlserver.tds.TDSRequest.processReplyToken(UnknownSource)

atcom.microsoft.jdbc.sqlserver.tds.TDSRPCRequest.processReplyToken(UnknownSource)

atcom.microsoft.jdbc.sqlserver.tds.TDSRequest.processReply(UnknownSource)

atcom.microsoft.jdbc.sqlserver.SQLServerImplStatement.getNextResultType(UnknownSource)

atcom.microsoft.jdbc.base.BaseSmonExecute(UnknownSource)

atcom.microsoft.jdbc.base.BaseStatement.executeInternal(UnknownSource)

atcom.microsoft.jdbc.base.BasePreparedStatement.execute(UnknownSource)

atweaver.conn.RecordSet.executeProc(RecordSet.java:

155)

atweaver.conn.RecordSet.executeProc(RecordSet.java:

109)

atweaver.hrm.resource.ResourceComInfo(ResourceComInfo.java:

59)

atcom.caucho.jsp.JavaPage.service(JavaPage.java:

87)

atcom.caucho.jsp.JavaPage.subservice(JavaPage.java:

81)

atcom.caucho.jsp.Page.service(Page.java:

410)

atcom.caucho.server.http.Invocation.service(Invocation.java:

319)

atcom.caucho.server.http.RunnerRequest.handleRequest(RunnerRequest.java:

333)

atcom.caucho.server.http.RunnerRequest.handleConnection(RunnerRequest.java:

266)

atcom.caucho.server.TcpConnection.run(TcpConnection.java:

140)

atjava.lang.Thread.run(Thread.java:

484)

从上面的日志信息,可以看到ResourceComInfo类的59行代码运行的时候出现错误,这个错误是执行数据库操作的脚本错误,具体的错误信息是:

形式参数'@id_1'定义为OUTPUT,但实际参数却未声明为OUTPUT。

说明调用数据库脚本的时候参数的数量有出入。

定期检查日志文件,可以发现代码中的各种错误。

3.3怎样获取属性文件的值

继承了weaver.general.BaseBean或weaver.general.DynamicServlet的类,可以直接使用getPropValue方法获取属性文件的值。

注意这里是使用,而不是调用,因为这个方法是这两个被继承类中的方法。

注意getPropValue方法的使用:

/**

*从配置文件中获取某个属性的值

*@paramfname属性文件名称

*@paramkey值

*@returnString属性值

*/

publicStringgetPropValue(Stringfname,Stringkey)

getPropValue方法指定了从某一个属性文件fname中获取键值key的值。

这里的属性文件必须存放在系统运行目录下的prop目录下,文件名称为参数fname指定的文件名,不包括属性文件的后缀名,属性文件的后缀名必须为.properties。

比如:

系统的运行目录为d:

\ecology\,那么属性文件必须放在d:

\ecology\prop\目录下,取名为thefilename.properties,其中thefilename是任意的。

在属性文件中某一个键值的值用等号来赋值,等号后面的值必须放在一行,如果一行不够写(或者为了查看的方便),可以用\来链接多行。

否则其它行的值不能被键值取得。

等号左右都可以有空格,对键值和键值的值没有影响。

比如:

thekeyname=thevalue

将键值的值放到多行:

thekeyname=thevalue1\

thevalue2\

thevalue3

thevalue4

这时候thekeyname的值为thevalue1thevalue2thevalue3,thevalue4取不到,因为thevalue3后面没有\

在程序中要取得上述属性文件中键值thekeyname的值,使用方法:

getPropValue(“thefilename”,“thekeyname”);

获取属性文件的值的例子如下:

publicclassResourceComInfoextendsBaseBean{

privatevoidsetResourceInfo()throwsException{

业务处理过程……….

StringkeyValue=getPropValue(“thefilename”,“thekeyname”);

//将键值thekeyname的值keyValue记入日志文件

writeLog("keyvalueis"+keyValue);

}

}

小密密:

系统的主属性文件weaver.properties的文件名“weaver”作为系统常量放在weaver.general.GCONST类中,可以使用getConfigFile()方法来返回“weaver”,在编程的过程中,如果需要用到weaver.properties属性文件中的键值,请用GCONST.getConfigFile()来获取,当主属性文件名称因为需要改变得时候,不必改变所有用到这个属性文件的类,只需要改变GCONST类中常量的值

3.4怎样获取系统的运行目录

weaver.general.GCONST类提供了一个静态方法getRootPath(),返回系统的运行目录,比如系统的运行目录为d盘的ecology目录,将返回d:

\ecology\

获取系统的运行目录的例子如下:

publicclassTestBeanextendsBaseBean{

importweaver.general.GCONST;

publicvoidgetSysRunPath(){

StringsysRunPath=GCONST.GetRootPath();

//将系统的运行目录sysRunPath的值记入日志文件

writeLog("sysRunPathis"+sysRunPath);

}

}

3.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语句:

RecordSetrs=newRecordSet();

rs.executeSql("select*fromTB_Example");

while(rs.next()){

Stringthename=rs.getString("name");

其它处理代码....……

}

2、使用指定的链接池ecologytest执行SQL语句

RecordSetrs=newRecordSet();

rs.executeSql("updateTB_Examplesetname='thenewvalue'","ecologytest");

3、使用指定的链接池ecologytest执行存储过程PD_Example_UpdateById

存储过程PD_Example_UpdateById如下:

CREATEPROCEDURE[PD_Example_UpdateById]

(@namevarchar(100),

@idint,

@flagintegeroutput,

@msgvarchar(80)output)

AS

updateTB_Examplesetname=@namewhereid=@id

GO

RecordSetrs=newRecordSet();

Stringnewname=.......;

Stringid=......;

Stringprocpara=newname+Util.getSeparator()+id;

rs.executeProc("PD_Example_UpdateById",procpara,"ecologytest");

procpara是存储过程的参数值组成的字符串变量,多个参数值之间用weaver.general.Util.getSeparator()分开

4、在一个客户程序多个执行之间,查询结果可以保留到下一次查询

RecordSetrs=newRecordSet();

rs.executeSql("select*fromTB_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 法律文书 > 调解书

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1