JavaEE Web开发规范汇总

引言

  • 在开发系统资源库项目的过程中,发现自己的代码有多处不规范之处;
  • 本文总结了JavaEE Web的一些开发规范,尤其是RESTful设计模式的一些常见的规范,以警示自己编写代码必须要规范、可维护、可扩展;

数据库设计和命名规范

  • 库表名称、字段名称含义明确,并且使用snake_case命名,避免使用特殊符号和sql关键字;
  • 字段应当具有原子性,不可再分;
  • Table用单数,Column用单数;
  • 代表个数、次数等数量概念的,用count,比如xxx_count;
  • 时间类型统一规定命名为xxx_date的形式,并且带上timezone;
  • boolean类型的命名要用is_xxx格式,比如在业务上删除一条记录时,并不会将本条记录真正从数据库中删除,而是将is_deleted字段置为相应的值;
  • 每个表都要有主键,名称是id,类型为bigint;
  • 一个字段不要有多个用途;
  • varchar的缺省长度是255,varchar(50)并不比varchar(255)节省空间,因为这个空间只在需要时才分配,而不会提前分配,使用varchar(255)可以提升系统的可持续性;
  • 必须避免不同数据库表的数据冗余,数据冗余很容易造成数据的不一致性;
  • 不同的数据库表间应当尽量解耦,这样可以保证每个表只存储他该存储的信息,库表间可用外键连接;
  • 关于数据库表设计,可参考这里

RESTful设计规范

  • 我画了一张图清晰地说明了再用Java开发Web应用时,如果使用RESTful设计模式,应该遵循的架构:

RESTful_java_structure

  • 对上图的说明:
    • REST层只向client提供数据接口,不进行数据查询和处理;
    • Service层向REST提供各种数据和服务,是进行数据处理最重要的一层;
    • DAO层内含有各种SQL语句,以便查询;
    • entity是数据库中一条记录的映射对象;
    • entity manager对象根据相关的配置文件(如persistence.xml),在EJB容器中,负责数据库连接的管理、释放等工作;
    • 数据库保存数据;
    • 不同的REST和Dao之间不要传递数据,如果一个Service需要另一个Service的数据,可相互传递;
  • EntityManager实例化的两种方式:
    1
    2
    3
    4
    5
    //方法一:通过createEntityManagerFactory方法实例化
    EntityManager em = Persistence.createEntityManagerFactory("cn.com.haohandata_ResourceStore_war_1.0-SNAPSHOTPU") .createEntityManager();
    //方法二:通过@PersistenceContext注入
    @PersistenceContext(unitName = "cn.com.haohandata_ResourceStore_war_1.0-SNAPSHOTPU")
    private EntityManager em;

RESTful API设计规范(老师总结)

  • 原则:
    • 资源(URL)永远是名词,操作(HTTP方法)永远是动词;
    • GET永远不应该修改对象内容;
  • 基本形式
    • GET /weibo - 获取微博列表
    • GET /weibo/12 - 获取某个微博
    • POST /weibo - 创建微博
    • PUT /weibo/12 - 修改某个微博
    • PATCH /weibo/12 - 部分修改某个微博
    • DELETE /weibo/12 - 删除某个微博
  • 有关系的资源
    • GET /weibo/12/comment - 获取某个微博的评论列表
    • GET /weibo/12/comment/5 - 获取某个微博的某个评论
    • POST /weibo/12/comment - 创建微博的评论
    • PUT /weibo/12/comment/5 - 修改某个微博的某个评论
    • PATCH /weibo/12/comment/5 - 部分修改某个微博的某个评论
    • DELETE /weibo/12/comment/5 - 删除某个微博的某个评论
  • 不太能归类为CRUD的操作
    • PUT /weibo/12/like - 给某个微博点赞
    • DELETE /weibo/12/like - 删除某个微博的赞
  • 过滤、排序、搜索等
    • GET /weibo?deleted=true - 得到所有标记为删除的微博
    • GET /weibo?sort=-create-date - 按照创建日期反序排序得到微博列表
    • GET /weibo?sort=comment-count,-create-date - 先按微博评论数再按创建日期反序排序得到微博列表
    • GET /weibo?keyword=xxx - 得到包含关键字xxx的微博列表
    • GET /weibo?keyword=xxx&deleted=true&sort=comment-count,-create-date - 搜索关键字包含xxx的标记为删除的微博,按照评论数再按创建日期反序排序得到微博列表
  • 常用的查询可以独立出来
    • GET /weibo/top10 - 得到最热前10名的微博列表
  • 这里写得非常不错

编写Java代码需要注意

  • 参考这里
  • 保持方法简短扼要
  • 永远永远不要将同一个变量用于不同的目的
  • 尽可能让变量和方法的名称能够描述要实现的功能
  • 尽可能将变量定义在最靠近它们的地方
  • 不要出现让人费解的数字
  • 要像对待朋友一样对待你擅长的语言
  • 不要逆常规而行
  • 千万小心过早的优化代码
  • 要常常重构经过测试的代码
  • 不要沉溺于过度的设计技巧
  • 随时随地学习新的知识
您的支持是对我最大的鼓励!