XML
- 书写规范:非生成的SQL一律使用大写,缩进、对齐必须工整
- 注释规范
<!-- 描述说明 作者 时间-->
例:
<!-- 后台考试管理分页查询,带排序规则 zhaoj 2016年12月6日 17:17:57-->
<select id="relationQueryByPageWithSort" resultMap="result">
SELECT
EXAM_SCOPE.*
FROM
EXAM_SCOPE
<where>
<include refid="ExamScopeQueryInBo" />
</where>
</select>
通用Java规范
- 编码前,务必熟读Java代码规范,规范文档地址详见SVN http://218.17.157.105:8055/repos/vcomponent/Document/0.项目管理/0.项目规范/JAVA规范.doc;
- 编码前,务必导入eclipse注释模板,模版地址详见SVN http://218.17.157.105:8055/repos/vcomponent/Document/0.项目管理/0.项目规范/codetemplates.xml;
- 接口和实现类均要写上注释;
- Java中对属性、方法、类进行修改时,请加上自己的名字,如:
你(userName)修改前的代码如下:
/**
* 切面方法体环绕
*
* @date 2016年11月25日 上午10:11:33
* @author zhaoj
* @since V1.0.3
* @return
*/
private Object aroundAdvice() {
return null;
}
修改后应加入注释@author userName
,
/**
* 切面方法体环绕
*
* @date 2016年11月25日 上午10:11:33
* @author zhaoj
* @author userName
* @since V1.0.3
* @return
*/
private Object aroundAdvice() {
return null;
}
Bo(Bean Object)
- 字段名规范
- 不随意增加基础类型字段,如:ExamUser对象有属性名为
id
的属性,则切勿再添加属性名为ids
、id1
、id2
、idNotEqual
一类的重复属性,一律使用id属性; - 在扩展对象类型字段时,新增的业务实体属性名与业务实体名一致,避免重复定义,且只能做声明,不能初始化,如:
public class ExamUser extends AbstractExamUser{
private ExamCourse examCourse;
private ExamPolicy examPolicy;
private ExamType examType;
private ExamStudentAnswer examStudentAnswer;
//下面的初始化是极其不推荐的,切勿使用
//private ExamStudentAnswer examStudentAnswer = new ExamStudentAnswer ();
}
- Bo需重写
toString()
方法;
Dao(Data Access Object)
- BaseDao实现类中已经封装了非常丰富的表操作,在写新的接口之前,要先思考一个问题:在不影响功能和性能的情况下,使用生成的代码能否满足需求;
Service
- 统一通过
getDao()
的方式调用Dao层代码,如:
public class ExamScopeServiceImpl extends BizBaseServiceImpl<ExamScope> implements ExamScopeService{
@Resource
private ExamQuestionDao examQuestionDao;
public List<ExamScope> studentQuery(ExamScope bo) {
return getDao().studentQuery(bo);
}
public Integer queryCount(ExamScope bo) {
return examQuestionDao.queryCount(bo);
}
}
- 涉及到事务的操作,务必方法上加上
@Transactional
注解; - Service层尽量只注入Dao,不推荐注入Service,避免形成闭回环,如:
public class AService{
//不推荐
@Resource
private BService bService ;
}
public class BService{
//不推荐
@Resource
private AService aService ;
}
- BaseService实现类中已经封装了非常丰富的表操作,在写新的接口之前,要先思考一个问题:在不影响功能和性能的情况下,使用生成的代码能否满足需求?
Controller
- 统一通过
getService()
的方式调用Service层代码,如:
public class ExamUserController extends BizBaseController<ExamUser> {
@Override
public ModelAndView showMain(){
Paginator<ExamUser> paginator = new Paginator<ExamUser>();
List<ExamUser> list = getService().queryByPageWithSort(paginator, new SortData(Direction.ASC,properties,"EXAM_USER.ID"));
ModelAndView mv = getModelAndView(getClassRequestMapping() + "/showMain");
mv.addObject("resultList", list)
mv.addObject("paginator",paginator)
mv.addObject("sortData",sortData);
return mv;
}
}
- Controller层尽量只注入Service,不推荐注入Dao
-
@RequestMapping
中的value值与函数名需保持一致
public class ExamUserController extends BizBaseController<ExamUser> {
@RequestMapping(value = "/showMain")
public ModelAndView showMain(){
Paginator<ExamUser> paginator = new Paginator<ExamUser>();
List<ExamUser> list = getService().queryByPageWithSort(paginator, new SortData(Direction.ASC,properties,"EXAM_USER.ID"));
ModelAndView mv = getModelAndView(getClassRequestMapping() + "/showMain");
mv.addObject("resultList", list)
mv.addObject("paginator",paginator)
mv.addObject("sortData",sortData);
return mv;
}
}
- 后台验证的问题必须引起注意:入参合法性判断,此处的合法性包括:输入规则合法(例如正则表达式后台验证)及数据冲突合法性(例如双浏览器操作)
- 确定如下函数名均不能满足你,再去定义一个新的函数:
//主页面
showMain()
//带条件的显示主页面,主要用于“返回”按钮
showMain(T, Paginator<T>, SortData)
//搜索、分页查询
list(T, Paginator<T>, SortData)
//添加页面
add()
//编辑
edit(Integer)
//保存
save(T)
//单个删除
delete(Integer)
//查看
show(Integer)
//批量删除
batchDelete(Integer[])
//批量更新
batchUpdate(Integer[], T)
//批量插入
batchInsert(T[])
- 统一调用
getModelAndView(String modelName)
方法构建视图,如:
getModelAndView(String)
- 统一调用
addObject(String attributeName, Object attributeValue)
方法组装模版数据,如:
ModelAndView mv = getModelAndView(getClassRequestMapping() + "/showMain");
mv.addObject("resultList", list);
- 推荐使用如下方式获取Bean
//推荐使用
ExamUser examUser1 = AppContext..getBean(ExamUser.class);
//不推荐使用
//ExamUser examUser2 = (ExamUser)AppContext.getBean("examUser");
- 统一使用如下方式获取当前用户
//Controller、Service、Dao层通用
AppContext.getCurrentUserId();
- 在合适的场景下,使用
queryCount(T bo)
去代替query(T bo)
- Servive注入时,加
@Resource
注解即可,无需@Resource(name="vslObjectServiceImpl")
,Service
注入Dao
同理:
@Controller
@RequestMapping("/admin/vslObject")
public class VslObjectController extends BizBaseController<VslObject> {
//@Resource(name="vslObjectServiceImpl")
@Resource
VslObjectService service;
}
- 每个带有
@RequestMapping
注解的方法都应加上@LogMark(memo="备注")
,用于记录日志;
HTML
- 标签必须对齐
- 学会用Google浏览器中调整简单样式
- Freemarker在页面上的常用操作:
//格式化数字输出
<#setting number_format="#">
//获取枚举国际化propertis文件中键为“Bool.YES”的值
${resourceBundle("Bool.YES")}
//---------------------------------------宏及常用宏的使用---------------------------------------
//引入宏
<#import "/common/tag.htm" as tag>
//截取字符串
<@tag.substr content="${item.examQuestion.content!}
//根据枚举生成select下拉框
<@enum.select id="bo.result" type="com.vnetoo.common.enums.Bool" header="true" default=""/>
//根据枚举生成radio单选框
<@enum.radio id="bo.type" type="com.vnetoo.common.enums.Bool" default="${bo.type}"/>
//根据枚举生成checkbox复选框
<@enum.checkbox id="bo.type" type="com.vnetoo.common.enums.Bool" default="${bo.type}"/>
JS
- 学会用
console.log()
- 学会用Google浏览器 F12中打断点,可以利用
console.log()
来打断点 - 学会在Google浏览器 F12查看变量
- 学会用Google浏览器 改样式
- 选择器要重点熟悉