Ecology系统程序员开发指南Word文档下载推荐.docx
《Ecology系统程序员开发指南Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《Ecology系统程序员开发指南Word文档下载推荐.docx(30页珍藏版)》请在冰豆网上搜索。
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='
日志的记录有两种模式,第一种为调试模式,第二种为在线模式。
在第一种模式下,所有的java对象都会记录到日志文件中,包括调试信息,在第二种模式下,只有为Exception(异常)的对象才会记录到日志文件中。
模式的设置在weaver.properties属性文件中的DEBUG_MODE属性来指定,如下:
DEBUG_MODE=true//为调试模式
DEBUG_MODE=false//为在线模式
正式上线的系统需要将模式设置为在线模式。
记录日志的例子如下:
privatevoidsetResourceInfo()throwsException{
try{
业务处理过程……….
StringdebugInfo="
Thisistest"
;
//在调试模式下将会记入日志文件
writeLog("
debuginfois"
+debugInfo);
}
catch(Exceptione){
//在任何模式下出现异常,都将会记入日志文件
writeLog(e);
throwe;
记录的日志文件形式为:
05weaver.hrm.resource.ResourceComInfo-debuginfoisThisistest
如果有异常,将会记录为:
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)
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行代码运行的时候出现错误,这个错误是执行数据库操作的脚本错误,具体的错误信息是:
形式参数'
说明调用数据库脚本的时候参数的数量有出入。
定期检查日志文件,可以发现代码中的各种错误。
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”);
获取属性文件的值的例子如下:
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的值记入日志文件
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语句
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
Stringnewname=.......;
Stringid=......;
Stringprocpara=newname+Util.getSeparator()+id;
rs.executeProc("
PD_Example_UpdateById"
procpara,"
procpara是存储过程的参数值组成的字符串变量,多个参数值之间用weaver.general.Util.getSeparator()分开
4、在一个客户程序多个执行之间,查询结果可以保留到下一次查询
select*fromTB_