代码生成器的使用

正如许多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较为详细的介绍可以参考这里


2.1.4 运行bin\eclipse.bat脚本:

直接在jeesite根目录运行以下命令:

mvn -Declipse.workspace=. eclipse:clean eclipse:eclipse



2.3.3

根据修改参数创建对应数据库(数据库编码:UTF-8)。

在mysql中自己手动创建jeesite,使用命令行:

create database jeesite;



5. 运行db\init-db.bat脚本,即可导入表结构及演示数据。

直接在jeesite根目录下运行以下命令:

mvn antrun:run -Pinit-db



关于tomcat的两个问题:

  • 由于这个项目还算比较大,导致tomcat内存很快被耗完,就会产生内存崩溃,服务器失去响应,解决方案如下:eclipse配置选项,打开选项,输入tomcat,然后点开Server下面的JDK就会出现配置区域. 直接加入:
    -Xms2048m -Xmx2048m 参考网址:http://www.haogongju.net/art/1910909
  • 在eclipse中启动tomcat,在浏览器中输入localhost:8080找不到页面,解决方案如下:
    a).双击tomcat服务器,会弹出如下界面,如果tomcat上已经部署了项目,第一个红框是灰色的不能改变的,需要右击tomcat,选择Add and Remove,remove掉tomcat上所有的项目,如果依然不能选择,则右击tomcat,Clean,之后就可以选择。
  • 查看jeesite框架版本信息_tomcat

  • b).修改两个地方,修改成下面这个样子:
  • 查看jeesite框架版本信息_eclipse_02

  • 参考网址:


关于在mac下不能mvn install成功地原因:

  • log4j的配置路径需要修改:
    在log4j.properties中修改:
  • 查看jeesite框架版本信息_代码生成器_03

  • junit java.lang.IllegalStateException: Failed to load ApplicationContext错误:因为测试基准类的读取文件名不正确,
    BaseDaoTest extends SpringTransactionalContextTests,SpringTransactionalContextTests类中的读取,由
    @ContextConfiguration(locations = {"/applicationContext.xml", "/applicationContext-shiro.xml”})修改为:
    @ContextConfiguration(locations = {"/spring-context.xml", "/spring-context-shiro.xml”})原因:
    项目中重命名了这两个配置文件,但是在读取时却没有更改。
  • 关于运行maven install时,运行测试的乱码问题:
    在pom中添加以下代码:
<!-- Test插件 -->           
            <plugin>           
                        <groupId>org.apache.maven.plugins\</groupId>           
                        <artifactId>maven-surefire-plugin\</artifactId>             
                        <version>2.7.2\</version>             
                        <configuration>           
                        <forkMode>once\</forkMode>           
                        <argLine>-Dfile.encoding=UTF-8\</argLine>              
                        </configuration>             
            </plugin>