基于Java平台的应用系统技术架构规范(试行) - v1-_第1页
基于Java平台的应用系统技术架构规范(试行) - v1-_第2页
基于Java平台的应用系统技术架构规范(试行) - v1-_第3页
基于Java平台的应用系统技术架构规范(试行) - v1-_第4页
基于Java平台的应用系统技术架构规范(试行) - v1-_第5页
已阅读5页,还剩18页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、 基于Java平台的应用系统技术架构规范(试行经技术专家委员会研究通过0前言为了降低各种项目和技术的学习和实施成本,规范技术架构和工程结构,提高代码复用率和工作效率,推广成功项目经验,特制定本规范。本规范作为公司开发项目的一般性指导规则,公司的所有与Java相关的项目,在开发时均需严格依照本规范的规定执行。对于客户有特殊强制规定的项目,则按照客户规定执行,但需报技术专家委员会备案。1开发工具u开发工具内核一律采用Eclipse3.5及以上;u JDK的版本为1.5及以上;u代码走查工具采用find bugs、QA Source、PMD;u源文件管理工具采用SVN;u文档管理工具采用SVN;u所

2、有开发工具在同一个项目组内统一版本,WorkSpace统一路径(建议采用Y:Workspace,可采用subst命令虚拟磁盘的方式实现,例如subst Y: E:nk。2架构设计规范总则2.1 J2EE架构约束u架构约束可以选用以下两种架构:1SS I 架构:Struts2.0以上+ Spring3.0 以上+ IBatis2.0以上2SSH架构:Struts2.0以上+ Spring3.0 以上+ Hibernate3.3以上注:IBatis现已改名为MyBatis。说明:架构中的所有JAR包统一从公司获取,项目中不允许随意更改 所使用JAR包的版本。u其他约束所有文件编码一律采用UTF8编

3、码格式。2.2 架构层次系统架构采用3层架构,如下图: 规则1 展现层建议采用Struts标签,推荐结合AJAX和JSON增强用户体验;规则2 持久层使用IBatis或Hibernate;事务由Spring进行控制;规则3 对处于不同容器中的功能层次,建议采用RPC、RMI或Web Services 等技术进行通讯。2.3 工作空间和项目目录结构l工作空间:Y:/Workspace/项目名称l工程名称由公司或客户统一定义l建议采用如下项目目录结构: u应用包结构 其中:工程名称可以是“项目名称”,或是“项目名称.子系统名称”。u机器人代码包(gencode 该包主要为产品的dao包、entit

4、y包、service包等,均由机器人自动生成,不得修改。l dao包主要是对应的数据库操作的Interface,如增、删、改、查等;l entity包主要是对应数据库表生成的实体类,包括对应数据表的mapping 文件;l service包主要是对应dao包中Interface的方法。 注:dao、entity、service包中的interface与class都是不可修改的。u应用包(app 应用包主要是包括assist、service、action。assist包提供通用的功能,仅供Service中的服务使用。该包中包含有model、tools、enums。l model包中方法类为数据模

5、型,开发人员可在此包中定义数据模型;l tools包为工具类定义包,凡是为项目公共调用的工具类皆可定义在此包中;l enums包中为参数枚举类,可自定义对应参数枚举类。service 包中包括iface、impl、fileservice、proxy。l iface包中包括table、process包n table包为服务扩展类包,如原有table Interface中的方法不能够满足开发人员的需求,可自定义所需table Interface;注:自定义table Interface必须继承gencode包中Service包中的相对应Interface,且自定义Interface必须以BizSe

6、rvice开头,如BizServiceXXX。n process包中定义的类为处理服务Interface; 注:定义Interface时皆为Service开头,如:ServiceXXX。l impl包中包括table、process,分别为iface包中相应Interface的实现类;l fileservice包中为文件操作相关类。如需定义相关文件操作类皆可在此包中定义。action包中包括table、process包。l table包为以数据库表为单位的表维护操作Action。定义时必须以Action 开头,如:ActionXXX;l process包为页面请求处理Action。定义时必须以

7、Action开头,如: ActionXXX。ext包是gencode包的扩展包,在性能要求极高或需要实现复杂的关联查询的时候才允许自定义dao或model,存放在ext包里。对于常规的关联查询,仍建议采用建立试图的方法,用代码生成器自动生成程序到gencode包里。u配置文件包 resource包中包括config、spring、struts包。l config包中主要是日志配置文件,上传文件地址配置文件,数据库连接配置文件,国际化文件等。l spring包中主要为spring相关的配置文件。l struts包中主要为struts相关的配置文件。2.4 数据库设计规范数据库设计除了遵循一般意义

8、的范式外,为了便于代码生成,应遵循以下规 范:1 需要一个逻辑主键,名称为ID(ID无业务意义,一方面可以方便业务和显示层的操作,另一方面对数据库的访问效率会有较大程度的提高。2 表字段的注释可以作为页面字段名称,为用户在后期页面开发中减少工作量,而且有利于代码的阅读。3 字段的长度及精度最好有明确的定义,因为数据库的类型和java的没有完全的对应关系,比方在oracle中的numeric类型,在生成工具中会按照他的长度和精度对应不同java类型,为了避免出错,这些属性最好明确设定。4 表及字段名称最好用大写字母,单词之间用下划线分隔,表对应的类名是依据表的名称来组合的,所以必须遵循此规范。5

9、 强烈建议不使用lob等类型的大对象字段。6 建议每个实体表都有CODE、NAME字段。2.5 包、类及方法命名规范标示符类型命名约定例子包l 全部小写net.northking.bpoweb.类,接口l类的名字应该使用名词。l每个单词第一个字母应该大写。l避免使用单词的缩写,除非它的缩写已经广为人知,如HTTP。Class Hello ;Class HelloWorld ;Interface Apple ;方法l第一个单词一般是动词。l第一个字母是小写,但是中间单词的第一个字母是大写。l如果方法返回一个成员变量的值,方法名一般为get+成员变量名,如若返回的值是bool变量,一般以is作为前

10、缀。l如果方法修改一个成员变量的值,方法名一般为:set + 成员变量名。getName(;setName(;isFirst(; 变量 l 第一个字母小写,中间单词的第一个字母大写。l 不要用_或&作为第一个字母。l 尽量使用短而且具有意义的单词。l 单字符的变量名一般只用于生命期非常短暂的变量。i,j,k,m,n 一般用于整型;c,d,e 一般用于字符类型。l 如果变量是集合,则变量名应用复数。String myName; int students; int i; int n; char c;常量 l 所有常量名均全部大写,单词间以_隔开。 int MAX_NUM;2.6 html/jsp

11、层编码规范页面部分属于框架的表现层,代码生成工具默认生成针对数据库表增加、删除、查询、修改的页面。这些页面可以作为参考开发使用也可以优化完善后直接使用。在标签中使用classstyle 属性,在css 文件中指定对应的css 样式,可以控制显示效果。对于通用产品尽可能做到修改css 适应不同客户的风格需求。 3 展现层3.1 展现层介绍展现层由Web 页面和相应的Action 构成,用户通过Web 页面与系统进行交互,Action 用来接收页面请求。Action 通过XxxProxyFactory 获得XxxService 的代理XxxProxy ,并通过XxxProxy 调用后台服务XxxS

12、ervice ,然后把执行结果返回页面。3.2 Action 与ProxyFactory 设计规范l Action 不能直接访问Service ,而是通过ProxyFactory 获得ServiceXxx接口调用。l 如果web 服务器和数据库服务器没有物理隔离,那么XxxProxyFactory的getService 方法可以直接返回XxxServiceImpl 。如果web 服务器不能直接访问数据库服务器,那么XxxProxyFactory 的getService 方法应该返回XxxProxy 的实例。XxxProxy 可以是实现了XxxService 接口的 rmi/web servic

13、e客户端。4业务逻辑层4.1 业务逻辑层介绍业务逻辑层包含业务逻辑接口和实现。本层主要编写相应的业务逻辑,开发人员在本层增加业务逻辑处理代码,已有的代码只是对本表的增、删、改、查,在编写代码时可以调用其他dao中的方法,取对应的数据。4.2 业务逻辑层设计规范l建议每个service接口只有一个doBiz方法,该方法用于完成一个完整的业务逻辑。l doBiz方法是事务的。l service中的方法返回的数据类型应该是wrapper类,传入的参数也应该是wrapper类。l分页查询等通用逻辑应该对具体service隐藏,不能让每个service编写者都考虑这些东西。l业务逻辑和工作流提交建议封装

14、抽象基类,方便具体类的开发者。l如果业务逻辑特别复杂,可以拆分若干个方法或功能类。4.3 Service层方法编码规范l检查所有参数输入的有效性;l检查所有非参数输入的有效性,如数据文件、公共变量等;说明:方法的输入主要有两种:一种是参数输入;另一种是全局变量、数据文件的输入,即非参数输入。方法在使用输入之前,应进行必要的检查。l在同一项目组应明确规定对接口方法参数的合法性检查应由方法的调用者负责,还是由接口方法本身负责,缺省是由方法调用者负责;l对所调用方法的错误返回码要仔细、全面地处理;始终要对数据进行检验,决不要假设你的数据没有问题。l如果一个方法会被多个线程调用,则需要保证该方法的线程

15、安全性;l超过十行代码的方法应该分块加简短注释; 如果发现块注释很难描述,则可能你的代码逻辑混乱。l错误处理和异常处理。通常的思想是只对错误采用异常处理:逻辑和编程错误,设置错误,被破坏的数据,资源耗尽等等。自动服务不能因为硬件故障或者资源失效等异常导致日志磁盘爆满。异常处理时可以采用适当的日志机制来报告异常,包括异常发生的时刻。不要使用异常来控制程序的处理流程。5DAO层5.1 DAO层介绍DAO层指的是数据访问对象,由service层调用,是业务逻辑和数据库之间的桥梁。5.2 DAO层主要功能DAO层属于数据持久层。DAO层主要进行的是针对一个数据库表的CRUD(增删查改操作。每一个DAO

16、类提供的功能包括:1.findAll(取得表中所有记录2.findByCriteria(DetachedCriteria detachedCriteria根据DetachedCriteria取得记录3.findByCriteria(DetachedCriteria detachedCriteria,int first,int max根据DetachedCriteria取得以规定索引开始的一定数量的记录4.findNumByCriteria(DetachedCriteria detachedCriteria获得以传入的DetachedCriteria为筛选条件的记录数5.findByExampl

17、e(Countries instance根据传入的POJO实例属性,查找匹配的记录;如果传入的POJO实例某个属性为空,表示该属性的所有记录都符合过滤条件。6.findById( java.lang.String id 根据传入的id查找记录7.findByProperty(final String propertyName,final Object value根据传入的属性名和对应值,查找匹配记录。8.findBySql(final String sql根据传入的sql语句查找匹配记录。本方法只支持读数据库的sql语句。9.save(Countries transientInstance执行

18、插入操作,将传入的pojo实例转化成数据库记录插入数据库表中。10.update(Countries instance执行更新操作,将传入的pojo实例更新到数据库,按照id进行更新。11.delete(Countries persistentInstance执行删除操作,将传入的pojo实例,按照id删除其数据库中相同id的记录。5.3 DAO层使用规范1.DAO层是直接操作数据库的,对DAO的调用,只能通过Service进行。2.框架默认生成的代码中,一个数据库表对应生成一个DAO。用户在开发的时候,会有多表操作的需求,这种多表操作可以在Service中引入一个需求数据库表的DAO类型变量

19、。这样就可以在本service中对新的表进行操作。3.DAO层扩展方式:DAO基本提供了对单张数据库表的完整操作。应用开发中,DAO层一般不需要进行扩展。如果DAO提供的功能不足以满足需求,应该由框架维护人员进行扩展。应用开发人员不能扩展DAO类;4.如果需要对多个表进行关联查询,则可以根据需要增加相应的类和配置文件,但不允许修改框架自动产生的代码。6安全规范6.1 会话安全l限制会话闲置时间为了防止用户忘记注销,应当限制会话闲置时间,一般不要超过30分钟。 l限制会话生命周期为了防止会话劫持,我们应当强制限制一个会话的生命周期,一般不要超8个小时。生命周期结束后应当重新进行验证。l允许用户自

20、行注销会话应当允许用户安全的结束自己的会话。l会话结束后清除数据一个会话结束后,应该安全的从硬盘和内存中清除相关数据。6.2 密码策略l验证用户设置的密码强度如:验证密码长度、是否包含数字、字符、特殊符号等l允许用户更改自己的密码l使用一种密码过期策略l密码找回应通过其他途径通知l源码中不出现密码l密码加密存储6.3 访问策略l基于角色的访问控制l集中式访问控制建立一个集中的访问控制系统l对关键操作进行二次认证为了防止会话劫持,需要对关键操作进行再次的认证。例如:修改口令等。l细粒度的访问控制6.4 输入验证l集中式输入验证所有输入采用一致的验证方式和策略。l服务器端输入验证所有来自web浏览

21、器的数据都能被修改为任意内容,因此必须在服务器 端进行适当的输入验证,以避免验证被绕过。l建议采用白名单放弃黑名单白名单包含允许内容的模式,黑名单包含不允许内容的模式。使用白名单法更容易,也推荐使用此方法。l验证输入长度、格式、字符合法性等验证时应验证允许输入的最大和最小长度,数字的最大和最小值,允许输入的字符范围和数据类型等。l验证所有的输入建议对用户的所有输入进行验证,避免有遗漏的或未经验证的数据被输入。6.5 数据库连接安全l使用参数化SQL语句正确的使用参数化的SQL语句,就可以通过不允许数据指向改变的方法来防御几乎所有的SQL注入攻击。参数化的SQL语句通常是由SQL字符构造的,但是

22、来自客户的数据是需要与一些绑定参数组合在一起的。也就是说,开发者使用这些绑定参数来准确的向数据库指出哪些应该被当作数据那些应该被当作命令。当程序要执行该语句的时候,它就会告知数据库这些绑定参数的运行值,这样的操作避免了数据被认为是命令语句而被执行的错误。l确保数据库资源能够被释放由于资源泄露可能导致系统出现很难捕捉到的错误,所以应当建立一个资源管理模块并且完全按照规则进行操作。千万不要依赖Java和.NET的垃圾回收器来回收资源。垃圾回收器在进行回收之前还要检测对象是否适合进行垃圾回收。除非虚拟机的内存己经很低,才会进行垃圾回收,这样无法保证即将被回收的对象是处于正常的状态。6.6 文件操作安

23、全l严格控制文件上传文件上传向来是web应用系统最具威胁的安全风险点之一,因此应当严格 控制。n文件类型验证检验上传文件的后缀名,设定允许上传文件类型白名单。n存储路径安全避免允许用户设定或选择存储路径和保存的文件名,严格检测提交数据中是否含有中断符。l严格分配文件访问权限策略使用最严格的访问权限策略来保护上传或新建的文件和目录。l安全的临时文件为了安全的使用临时文件,应该在程序初始化时创建一个只能被该程序读写的文件夹。不要将该文件夹放在用户可访问到的地方,并将所有的临时文件都放在其中。7日志规范日志记录使用log4j规范 是否必须遵循 范例在正式提交的代码中,不允许使用Console输出方式显示日志信息 必须日志文件名采用.log的命名规则。文件大小限制为最多20Mb,即当日志文件超过20Mb时,旧

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论