最近定了下项目的开发规范,贴出来
一、项目设计
本项目分为3层,表现层(Struts1.2.7)、业务层(Spring2.0)、持久层(Hibernate3.0)。由Struts来管理视图层并对异常进行捕获,由Spring来管理业务逻辑及事务的管理,Hibernate封装了所有数据以及数据库的操作与分页等。
如图:
二、包的命名规范
包的命名规范总体来说主要是按照模块的名称来命名。并且每个包的名称都必须是小写的字母。一个系统中有用户模块、日志模块等,每个模块都是一个包,然后在包的下面包含此模块下所有的类。
譬如应用中有一个test模块,则在公共包下建立一个test包
例如:com.portal.test
在test包下包括如下子包
2.1、action包
该包放置各种struts的action,此包的命名规范是必须以Action结尾,例如我们要写个登陆的Action那么这个类得名称是LoginAction。
例如:com.portal.test.action.LoginAction
2.2、service包
该包放置业务操作类,譬如用户管理类,一般情况将该用户操作类提取一个接口,此接口以Service来结尾,并放入到service包下面,然后在service包下新建一个impl包,在impl包中才放置用户操作接口的实现类,实现类以ServiceImpl来结尾。该接口实现类中调用DAO接口对数据库进行操作,而调用该实现类的方法在struts的action中通过此类的父接口调用。
下面以test下面所有与用户相关的操作来定义一个业务类。接口:IUserService;实现类:UserServiceImpl。并且接口全部以大写字母“I”开头
例如:com.portal.test.service.IUserService
com.portal.test.service.impl.UserServiceImpl
2.3、vo包(value object)
vo包个人理解是在struts中使用的非POJO对象,而这些对象往往要通过一些复杂的查询操作才能查询出来,如HQL的多表级联查询,或者在Hibernate中调用JDBC查询出来的一些数据,都可以封装到vo对象里面。在jsp页面中展现。vo对象主要应用与表现层,主要含有Setter,Getter属性和其他辅助方法,例如hashCode和equals等方法。
例如:com.portal.test.vo
2.4、dao包
Dao层有1个父类是AbstractBaseDao,一个接口是IBaseDao,这两个类之间的方法是一一对应的。在dao包下面所有的接口都要继承IBaseDao,在dao.impl包下所有的类都要实现对应的dao包下面的接口,继承AbstractBaseDao类,具体见示例。
所有多表之间的级联查询都要放到此包下面。如果只需要对其中的一张表进行操作,请具体查看2.5内容。具体的命名可以根据自己的业务逻辑来定。
例如:com.portal.test.dao com.portal.test.dao.impl
以上4点都必须在test包下面,test包下应该具备这最基本的4个包,一般情况不需要重新添加新的包。特殊情况除外。以下所提到的包都不在test包的下面。而在主项目下面的包。
2.5、dao(data access object)包
该包放置各类dao(data access object),也就是放置对数据库访问的实现类,原则上是每个表对应一个dao的处理类,每个处理类对应一个类和一个接口,例如user表对应的接口是IUserDao,对应的类是UserDaoImpl,并且通过Spring的IOC的方式把此对象注入到业务层中。业务层中用接口来调用。与2.4的区别是此包下面所有的查询操作都是针对一张表进行的,而2.4是针对多表之间的级联查询的。此包下面所有的dao都是公用的,而2.4只是针对个人的模块来使用的。
例如:com.portal.dao com.portal.dao.impl
2.6、pojo包
该包中放置hibernate反向工程生成的bean和该bean对应的.hbm.xml文件。
例如:com.portal.pojo
三、配置文件的命名规范
Struts和Spring都是通过模块名称来命名的,每个模块对应的一个Struts配置文件和一个Spring配置文件。Struts和Hibernate都是通过Spring(IOC)来注入对象的。
3.1、web.xml配置文件
开发人员不允许自私动web.xml,如果需要写servlet,过滤器等,需要在web.xml配置时,需要向项目组长说明,方可添加。
3.2、Struts配置文件
Struts所有的配置文件放在WEB-INF/struts-config目录下。开发人员不要新建Struts配置文件,所有配置Struts配置文件都是由项目组长来添加。Struts的配置文件是根据模块来划分的,每个人都会对自己所开发的模块来维护一个Struts的配置文件。Struts配置文件根据模块名称来命名。
例如:struts_test.xml
3.3、Spring配置文件
Struts所有的配置文件放在WEB-INF/spring-config目录下。开发人员也不要新建Spring配置文件,所有Spring配置文件都是由项目组长来添加。Spring的配置文件是根据模块来划分的,每个人都会对自己所开发的模块来维护一个Spring的配置文件。Spring配置文件根据模块名称来命名。
例如:spring_test.xml
需要说明的是要把所有写到2.5中的Dao放入到spring_dao.xml配置文件中。也就是在spring_dao中只是存放只针对一个表所生成的Dao类,而2.4中的Dao存放到对应的spring模块的配置文件中。
3.4、Spring和Struts配置文件命名规范
1、Struts配置文件path的命名规范
Struts配置文件path的命名规范是由下划线“_”右面的部分加上本类所对应功能来命名。例如struts_test.xml,所以的配置文件应该由test和类得功能来命名。并且每个action都要写清楚注释。
例如:
<!-- 分页测试 -->
<action path="/test/page"
type="com.portal.test.action.PageAction.java" validate="false">
<forward name="success" path="/page.jsp" />
<forward name="error" path="/page.jsp" />
</action>
2、spring配置文件id的命名规范
注意一提的是spring中id的命名规范,在spring_dao.xml中dao对应的id的命名规范是此dao类得全称,并且第一个字母小写。例如UserDao在spring_dao.xml中的id应该是userDao。Service层中在spring中配置文件的编写是接口去掉第一个字母“I”,并且第一个字母小写,例如IUserService应该是userService。
并且在spring_dao.xml中谁加的一定要写清楚注释。
例如:spring_test.xml中
<bean name="/test/page" class="com.portal.test.action.PageAction">
<property name="testService">
<ref bean="testService"/>
</property>
</bean>
<bean id="testService" class="com.portal.test.service.impl.TestServiceImpl">
<property name="infoDao">
<ref bean="infoDao"/>
</property>
<property name="userDao">
<ref bean="userDao"/>
</property>
</bean>
spring_dao.xml中
<!-- 王朋与2011-7-5添加 -->
<bean id="infoDao" class="com.portal.dao.InfoDao">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<bean id="userDao" class="com.portal.dao.UserDao">
<property name="sessionFactory">
<ref bean="sessionFactory"/>
</property>
</bean>
<!-- 本次添加内容结束 -->
四、异常处理
在dao和service中遇到异常往上抛,在表现层捕获异常。特殊情况除外。
统一的错误处理类,返回到页面在页面展示
五、日志处理
待定
六、方法的命名规范
Java命名规范统一采用驼峰命名法。
6.1、j2ee各层方法的命名
项目各个层之间的命名方法,一般项目主要是以增删改查为基础。
增加以save开头,删除以del开头,修改以update开头,查询以query开头,统计以count开头,查询一个对象以get开头。
以增加来说,比如我们要在User表中添加一行数据那么在业务层的方法应该是saveUser
然后由业务层的方法调用dao层得方法,dao中有save方法直接调用。
以查询来说,比如我们要以User的name和pwd来查询那么在业务层得方法是queryUserByNamePwd,在dao层得命名是queryByNamePwd,字段多可以以字段的第一个字母来定。这样就其他开发人员就可以直接调用已经写好的方法,减轻不必要的代码生成。
以此类推。
以上都是针对一个表操作的命名,多表之间的级联查询中的dao放在自己的模块下面,命名自己可以按照查询功能来命名。要把查询各表的注释写清楚。
原则上Dao方法都是公用的,一旦提交svn就不能在修改,别人都可以通过方法名称直接调用。
6.2、变量和常量命名
在变量命名时要注意以下几点:
· 选择有意义的名字,注意每个单词首字母要大写。
· 在一段函数中不使用同一个变量表示前后意义不同的两个数值。
· i、j、k等只作为小型循环的循环索引变量。
· 避免用Flag来命名状态变量。
· 用Is来命名逻辑变量,如:blnFileIsFound。通过这种给布尔变量肯定形式的命名方式,使得其它开发人员能够更为清楚的理解布尔变量所代表的意义。
· 如果需要的话,在变量最后附加计算限定词,如:curSalesSum。
· 命名不相包含,curSales和curSalesSum。
· Static Final 变量的名字应该都大写,并且指出完整含义。
· 通过在结尾处放置一个量词,就可创建更加统一的变量,它们更容易理解,也更容易搜索。例如,请使用 strCustomerFirst和strCustomerLast,而不要使用strFirstCustomer和strLastCustomer。常用的量词后缀有First(一组变量中的第一个)、Last(一组变量中的最后一个)、Next(一组变量中的下一个变量)、Prev(一组变量中的上一个)、Cur(一组变量中的当前变量)。
· 为每个变量选择最佳的数据类型,这样即能减少对内存的需求量,加快代码的执行速度,又会降低出错的可能性。用于变量的数据类型可能会影响该变量进行计算所产生的结果。在这种情况下,编译器不会产生运行期错误,它只是迫使该值符合数据类型的要求。这类问题极难查找。
· 尽量缩小变量的作用域。如果变量的作用域大于它应有的范围,变量可继续存在,并且在不再需要该变量后的很长时间内仍然占用资源。它们的主要问题是,任何类中的任何方法都能对它们进行修改,并且很难跟踪究竟是何处进行修改的。占用资源是作用域涉及的一个重要问题。对变量来说,尽量缩小作用域将会对应用程序的可靠性产生巨大的影响。
关于常量的命名方法,在JAVA代码中,无论什么时候,均提倡应用常量取代数字、固定字符串。也就是说,程序中除0,1以外,尽量不应该出现其他数字。常量可以集中在程序开始部分定义或者更宽的作用域内,名字应该都使用大写字母,并且指出该常量完整含义。如果一个常量名称由多个单词组成,则应该用下划线“_”来分割这些单词
例如:NUM_DAYS_IN_WEEK、MAX_VALUE。
七、事务处理
事务处理采用Spring的声明式的事务处理方法,所有的事务都交给spring来处理,并在service层中进行控制。必须按照包的命名规范才能控制事务,详情见spring.xml。在编码中涉及到事务处理要在业务层来处理。每个业务层的单个方法认为是一个事物。
八、注释规范
1、类的注释应该标明以下几点
/**
*
* 功能:<br/>
* @author <br/>
* @date <br/>
* 修改人:<br/>
*
*/
2、方法的注释应该标明以下几点
/**
* 功能:比较两个日期类型的字符串,格式为(yyyy-mm-dd)<br/>
* @author <br/>
* @param cale1 日期一<br/>
* @param cale2 日期二<br/>
* @return 如果cale1大于cale2,返回1
* 如果cale1小于cale2,返回-1
* 如果相等,返回0
* 如果格式错误,返回-2
*/
public static int compareCalendar(String cale1, String cale2) {
Calendar calendar1 = getDate(cale1);
Calendar calendar2 = getDate(cale2);
if (calendar1 == null || calendar2 == null) {
return -2;
}
return calendar1.compareTo(calendar2);
}
3、块注释(Block Comments)
块注释通常用于提供对文件,数据结构和算法的描述。块注释被置于每个文件的开始处以及每个算法之前。比如方法内部。在功能和方法内部的块注释应该和它们所描述的代码具有一样的缩进格式。区别方法注释是块注释不生成文档,对一些复杂算法方法内部一些特殊变量的说明等等。
例如:
/*
* Here is a block comment.
*/
或者
//
九、编程风格
统一采用左括号的方式,每个符号直接有空格。具体看以下示例:
9.1、返回语句(return Statements)
一个带返回值的return语句不使用小括号"()",除非它们以某种方式使返回值更为显见。例如:
return;
return myDisk.size();
return (size ? size : defaultSize);
9.2、if,if-else,if else-if else语句(if, if-else, if else-if else Statements)
if-else语句应该具有如下格式:
if (condition) {
statements;
}
if (condition) {
statements;
} else {
statements;
}
if (condition) {
statements;
} else if (condition) {
statements;
} else{
statements;
}
注意:if语句总是用"{"和"}"括起来,避免使用如下容易引起错误的格式:
if (condition) //AVOID! THIS OMITS THE BRACES {}!
statement;
9.3、 for语句(for Statements)
一个for语句应该具有如下格式:
for (initialization; condition; update) {
statements;
}
一个空的for语句(所有工作都在初始化,条件判断,更新子句中完成)应该具有如下格式:
for (initialization; condition; update);
当在for语句的初始化或更新子句中使用逗号时,避免因使用三个以上变量,而导致复杂度提高。若需要,可以在for循环之前(为初始化子句)或for循环末尾(为更新子句)使用单独的语句。
9.4、 while语句(while Statements)
一个while语句应该具有如下格式
while (condition) {
statements;
}
一个空的while语句应该具有如下格式:
while (condition);
9.5、 do-while语句(do-while Statements)
一个do-while语句应该具有如下格式:
do {
statements;
} while (condition);
9.6、 switch语句(switch Statements)
一个switch语句应该具有如下格式:
switch (condition) {
case ABC:
statements;
/* falls through */
case DEF:
注:测试用数据库是mysql,在file文佳夹下面有sql语句。如果有任何问题,请和我联系。