代码生成器的使用

正如许多J2EE整合开发框架一样,Jeesite也提供了代码生成器,我们可以通过配置,利用它来生成一个独立模块的各层次的基础部分,其中包括:

  • Entity,即实体类。对应MVC的Model部分。其继承了Common模块中的模板类BaseEntity。
  • DAO层,封装了对实体类的CRUD操作,相应地继承了模板类BaseDAO。
  • Service层,封装底层,并加了一些基础功能,作为服务层。
  • Controller层,对应MVC的C部分。相应继承了抽象类BaseController。
  • JSP,对应MVC的View部分。代码生成器会生成xxxList和xxxForm两个JSP页面,分别用以展示和增删改查数据条目。此处的XXX为类名。

代码生成器的使用非常简单,首先找到com.thinkgem.jeesite.generate包下的generate类。首先根据注释,自行定义新模块的包名、模块名、类名、功能名、类作者名的对应变量。其中:

  • 包名.模块名.是生成的新模块各个层次的包,默认会生成entity、dao、service、web四个包。而WEB-INF/views/modules/下会生成一个模块名的文件夹。该文件夹为上面提到的两个JSP页面。
  • 类名就对应四个包下类名前缀,若类名为Sign,则四个包下的四个类分别为Sign、SignDAO、SignService、SignController。
  • 功能名是为了说明功能模块的作用,会在生成的JSP中包含对应信息。而类作者名则会加到生成类的注释中。
    配置好这些后,对generate类选择RUN AS - Java Application即可。由于该类包含Main()方法,是可执行的。然后它会读取com.thinkgem.jeesite.generate.template下的6个ftl文件——这是freemaker模板引擎使用的文件——最后填入对应的配置变量,生成如前所述的4个类和2个JSP页面。

最后要运行这个生成模块的话,还需手动在数据库中建立对应的数据表,数据表除了在实体类中定义的属性外,还必须包含del_flag、remarks、create_by、create_date、update_by、update_date这几个字段。这是因为实体类要继承DataEntity这个抽象类,此类中定义了这些属性,后续的查询、排序中要用到这些字段。

代码生成器各部分解析

代码生成器实际为我们生成了MVC的各个层次,下面结合代码,分析一下各部分的原理。

Entity实体层

首先,任何Entity都是继承了IdEntity这个抽象类,IdEntity主要提供实体类的id属性及其对应setter和getter方法。这样生成的entity就继承了这个属性。关于com.thinkgem.jeesite.common.persistence包下几个基础Entity类的关系可以表示如下:IdEntity--->DataEntity--->BaseEntity。这样每个生成的Entity就继承了包括id、del_flag、remarks、create_by、create_date、update_by、update_date在内的属性。其中id是利用util中的IdGens生成的uuid,即生成的id不会自增。而是一段字母+数字的唯一组合。若对id有auto_increment的要求,则需要考虑重写IdEntity类。

Dao层

实际上,所有代码生成的dao都是直接继承了common中的BaseDao类,继承后的子类并未添加任何属性和方法。在此就主要针对BaseDao类分析。总的来说,BaseDao主要是在Hibernate提供的数据库操作基础上,封装了Page、parameter参数。这里的Page是作为展示页面的对象,而Parameter是继承了HashMap<String, object>的哈希字典。BaseDao就针对实体对象,提供了find、get、save、update等几类操作,每种操作根据参数的不同有几种函数重载形式。而对删除操作,这里是通过deleteById来设置del_flag字段的布尔值进行逻辑删除的。如果要进行真实的表中某行数据删除,需要我们自己写对应的操作函数。

Service层

新模块的Service层一般都有一个dao对象的属性,然后在dao的基础上进一步封装,加入一些其它有用功能的服务。由于不同模块提供的服务不尽相同,这里就不好进行概括了。而BaseService类则是提供了根据用户角色的DATA_SCOPE进行数据过滤。

Controller层

新建模块的Controller主要使用Spring提供的Annotation,把访问Url与实际的Jsp页面映射起来,与此同时使用Service、Dao对象提供的数据库操作函数,这样就可以在页面上对数据库进行增删改查。而不同Controller继承的BaseController则主要通过封装BeanValidator提供对服务端参数有效性验证。例如我们通过页面向数据库添加实体对象时,可以利用BaseController进行Bean的校验,验证通过后再保存对象。关于BeanValidator较为详细的介绍可以参考这里