1、Ecology系统程序员开发指南Ecology系统程序员开发指南文件编号:FFPD-0100- JSWD- 001 生效日期: 2003-08-25 受控编号:FFPD-0100- JSWD- 001 密级:版次:1.1修改状态:总页数正文附录编制:杨国生审核:刘煜批准:刘煜文件修改控制修改记录编号修改状态修改页码及条款修改人审核人批准人修改日期A1新建V1.0杨国生刘煜刘煜2003-08-25目 录1. 引言 41.1 概述 41.2 定义 41.3 参考资料 42. 开发规范 53. 底层包应用及范例 73.1 最基本的继承类 73.2 怎样记录日志 83.3 怎样获取属性文件的值 113
2、.4 怎样获取系统的运行目录 133.5 怎样访问和运行数据库脚本 143.6 如何上传一个文件 183.7 如何访问已经上传的文件 223.8 如何使用缓存提高系统效率 233.9 其它底层类基本方法 321. 引言1.1 概述本需求文档为泛微协同商务系统(Ecology)程序员开发指导文档,讲述了开发的规范,底层工具包的应用,常用功能的开发。通过本文档,开发人员应掌握1.2 定义1.3 参考资料书籍资料编号资料名称简介1Thinking in javaJava 思想一本很不错的书2Java Servlet ProgramingJava Servlet 编程3J2EE 大全J2EE 的一本学
3、习书Intenet上杂志、专业著作、技术标准以及他们的网址。网址简介JSUN 的java 网站www.java-java 中文站 (较多的书籍, 代码)www.javastudy.orgjava 学习网 2. 开发规范程序文件头部加上文件描述,包括标题,描述,公司,作者,版本,创建日期,修改记录,如下:/* * Title: 数据库链接池集合 * Description: 所有的数据库链接池的集合,用链接池名称区别每一个 * 链接池 * Company: 泛微软件 * author : 杨国生 * version 1.0 * create date : 2001-10-23 * modify
4、log: * 2002-09-13 杨国生 增加链接池Encode参数 * * */各个明显部分间加空行,各方法间加空行,方法前面加方法的注释,遵从JavaDoc规范,与所释方法间不加空行。注释用中文给出:/* 从指定名称的链接池中获得一个可用连接.若没有可用连接,且已有连接 * 数小于最大连接数限制, 则创建并返回新连接.否则, 在指定的时间内等* 待其它线程释放连接.如指定的时间内没有链接返回,则返回空。 * * param name 连接池名字 * param time 以毫秒计的等待时间 * return WeaverConnection 可用连接或null */ public Wea
5、verConnection getConnection(String name, int time) DBConnectionPool pool = (DBConnectionPool) pools.get( name ) ; if (pool = null) pool = createPools( name ) ; if (pool != null) clients + ; return pool.getConnection( time ) ; return null; 大括号 不换行, 需要换行。当中代码要缩进。缩进为4个空格,必须以空格代替Tab键。圆括号()与前面的方法名间留一个空格,
6、括号内的每个参数前留一个空格,最后一个参数后也留一个空格。逗号后面,分号前面,运算符号和赙值符号的前后,留一个空格。类、接口名大写字母开头,后面单词首字母大写。尽量不用下划线。如UserGroup(Class)。对象实例、变量小写字母开头,后面单词大写。如userSQLBean(UserSQL对象的实例) , locationName(变量)。方法名小写字母开头,首单词一般为动词,后面单词大写开头。如User.getUserName,UserSQLBean.formatSQLSearch。开发代码不能使用当前开发环境已经不建议使用的方法。在开发环境升级的时候,需要重新编译原有系统的代码,如发现
7、原有系统存在升级的环境中不建议使用的方法,应进行更新。3. 底层包应用及范例本章对ecology系统的底层工具包进行讲解,开发人员可以从这里学到怎样利用底层的工具包进行开发3.1 最基本的继承类每一个java bean 都需要继承 weaver.general.BaseBean 类 ,每一个 servlet 都需要继承weaver.general. DynamicServlet。这两个类都实现了记录日志和获取属性文件值的方法。继承这两个类的其它类可直接应用这些方法来记录日志,获取属性文件某一个属性的值。方法的实现见后面的例子。继承了weaver.general. DynamicServlet类
8、的servlet已经是一个servlet了,只需要实现weaver.general. DynamicServlet类的抽象方法doProcess就可以实现 doGet 和doPost 方法了。继承的例子如下:java bean 的继承public class ResourceComInfo extends BaseBean public void doSomething() /某一个方法 方法的处理 writeLog(s) ; / 写日志 servlet 的继承public class HelloServlet extends DynamicServlet public void doProc
9、ess(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 对请求的处理. 3.2 怎样记录日志继承了weaver.general.BaseBean 或weaver.general. DynamicServlet的类,可以直接使用 writeLog方法记录日志信息。注意这里是使用,而不是调用,因为这个方法是这两个被继承类中的方法。注意writeLog 方法的使用:/* 将某个对象写入Log文件* param obj 被写入的对象*/ public void
10、writeLog(Object obj) 我们看到,可以被记入日志的是任意一个java对象。这些java对象将被自动转换成字符串对象(String)记入到日志文件中。日志文件将每天生成一个,以日志文件名称中的日期来区别,比如:ecology20030812.log,代表2003年8月12日的日志。每一条日志的记录格式为 :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
11、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 (异常)的对象才会记录到日志文件中。模式的设置在weaver.properties 属性文
12、件中的DEBUG_MODE 属性来指定,如下:DEBUG_MODE = true / 为调试模式DEBUG_MODE = false / 为在线模式正式上线的系统需要将模式设置为在线模式。记录日志的例子如下:public class ResourceComInfo extends BaseBean private void setResourceInfo() throws Exception try 业务处理过程.String debugInfo = This is test ; / 在调试模式下将会记入日志文件 writeLog(debug info is + debugInfo) ; ca
13、tch(Exception e) / 在任何模式下出现异常,都将会记入日志文件 writeLog(e) ; throw e ; 记录的日志文件形式为:2003.03.11-06:52:05 weaver.hrm.resource. ResourceComInfo - debug info is This is test如果有异常,将会记录为:2003.03.11-06:52:05 weaver.hrm.resource. ResourceComInfo - java.sql.SQLException: MicrosoftSQLServer JDBC DriverSQLServer形式参数 id
14、_1 定义为 OUTPUT,但实际参数却未声明为 OUTPUT。 at com.microsoft.jdbc.base.BaseExceptions.getException(Unknown Source) at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processErrorToken(Unknown Source) at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReplyToken(Unknown Source) at com.microsoft.jdbc.sqlserver.td
15、s.TDSRPCRequest.processReplyToken(Unknown Source) at com.microsoft.jdbc.sqlserver.tds.TDSRequest.processReply(Unknown Source) at com.microsoft.jdbc.sqlserver.SQLServerImplStatement.getNextResultType(Unknown Source) at com.microsoft.jdbc.base.BaseSmonExecute(Unknown Source) at com.microsoft.jdbc.base
16、.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)
17、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) a
18、t 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。说明调用数据
19、库脚本的时候参数的数量有出入。定期检查日志文件,可以发现代码中的各种错误。3.3 怎样获取属性文件的值继承了weaver.general.BaseBean 或weaver.general. DynamicServlet的类,可以直接使用getPropValue方法获取属性文件的值。注意这里是使用,而不是调用,因为这个方法是这两个被继承类中的方法。注意getPropValue方法的使用:/* 从配置文件中获取某个属性的值* param fname 属性文件名称* param key 值* return String 属性值*/ public String getPropValue(String
20、fname , String key)getPropValue 方法指定了从某一个属性文件fname 中获取键值key 的值。这里的属性文件必须存放在系统运行目录下的prop 目录下,文件名称为参数fname指定的文件名,不包括属性文件的后缀名,属性文件的后缀名必须为 .properties。比如:系统的运行目录为 d:ecology,那么属性文件必须放在d:ecologyprop 目录下,取名为 thefilename.properties ,其中thefilename是任意的。在属性文件中某一个键值的值用等号来赋值,等号后面的值必须放在一行,如果一行不够写(或者为了查看的方便),可以用 来
21、链接多行。否则其它行的值不能被键值取得。等号左右都可以有空格,对键值和键值的值没有影响。比如 :thekeyname = thevalue将键值的值放到多行:thekeyname = thevalue1 thevalue2 thevalue3 thevalue4 这时候thekeyname 的值为thevalue1thevalue2thevalue3 ,thevalue4 取不到,因为thevalue3后面没有 在程序中要取得上述属性文件中键值thekeyname的值,使用方法:getPropValue(“thefilename” , “thekeyname”) ;获取属性文件的值的例子如下:
22、public class ResourceComInfo extends BaseBean private void setResourceInfo() throws Exception 业务处理过程.String keyValue = getPropValue(“thefilename” , “thekeyname”) ;/ 将键值thekeyname的值keyValue记入日志文件 writeLog(keyvalue is + keyValue) ; 小密密:系统的主属性文件 weaver.properties 的文件名“weaver” 作为系统常量放在weaver.general.GCO
23、NST 类中,可以使用getConfigFile() 方法来返回 “weaver ”,在编程的过程中,如果需要用到weaver.properties属性文件中的键值,请用GCONST. getConfigFile() 来获取,当主属性文件名称因为需要改变得时候,不必改变所有用到这个属性文件的类,只需要改变GCONST类中常量的值3.4 怎样获取系统的运行目录weaver.general.GCONST 类提供了一个静态方法getRootPath() ,返回系统的运行目录,比如系统的运行目录为d 盘的ecology目录,将返回d:ecology获取系统的运行目录的例子如下:public class
24、 TestBean extends BaseBean import weaver.general.GCONST ;public void getSysRunPath() String sysRunPath = GCONST. GetRootPath() ;/ 将系统的运行目录sysRunPath的值记入日志文件 writeLog(sysRunPath is + sysRunPath) ; 3.5 怎样访问和运行数据库脚本这是所有编程人员都关心的一个问题。在ecology系统中,大量的数据库访问,链接的建立和持续性,事务的处理,链接池的维护等问题都被封装在weaver.conn 包下面的各个类中
25、,应用程序的实现者不需要去关心这些问题,而只需要调用weaver.conn.RecordSet 类来执行各种数据库操作。weaver.conn.RecordSet 类实现了从数据库链接池中获取链接,执行指定的数据库脚本或者存储过程,并在脚本或者存储过程执行完毕后将链接及时地归还到链接池中。Ecology系统的链接池管理请参见 weaver.conn.ConnectionPool , weaver.conn.DBConnectionPool ,weaver.conn.ConnCheckerTimer 类的API 文档,weaver.conn.ConnectionPool 用于管理ecology系
26、统中的所有数据库链接池(ecology系统可以同时链接多个数据库,每一个数据库均有一个对应的数据库链接池,由weaver.conn.DBConnectionPool负责管理,而weaver.conn.ConnectionPool则是这些链接池的大管家,负责所有链接池的协调和统一对外接口),weaver.conn.DBConnectionPool用于建立和管理对某一个数据库的链接池,weaver.conn.ConnCheckerTimer用于监控各个链接池的状况,定期对数据库链接池中不符合要求的链接进行清理,并监视是否需要在某一链接池中建立新的链接。调用weaver.conn.RecordSet
27、,实现对数据的操作,下面进行详细的说明:weaver.conn.RecordSet类采用 java.sql 中的 CallableStatement 和 Statement 执行数据库操作。客户端直接调用该类进行数据库操作。不需要考虑数据库链接的建立。其中客户端指所有调用该类进行数据库操作的应用程序,不特指用户的客户端。RecordSet 执行数据库操作有两种形式,一种为调用存储过程,另一种为直接执行SQL语句。与ConnStatement不同 ,RecordSet 执行SQL语句不分查询和修改,都在一条语句中执行。RecordSet执行脚本的方式如下:1、使用默认的链接池执行SQL语句: R
28、ecordSet 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执行存储过程
29、 PD_Example_UpdateById存储过程PD_Example_UpdateById 如下:CREATE PROCEDURE PD_Example_UpdateById (name varchar(100), id int, 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_
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1