JEasyframe使用教程2 项目结构

时间:2022-06-17
本文章向大家介绍JEasyframe使用教程2 项目结构,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。

  项目导入部署成功后,来看一下项目结构

  里面包含两个项目,gmms_system  gmms_web

  system里主要有dao,service,model和一些util

gmms_system  

  一:DAO层

   以AreaDAO为例,里面非常简单,直接extendsBaseDAO传入javabean类即可。BaseDAO里面功能很多,基本能涵盖主要的db操作方法。所有大部分情况下直接继承这个基类就可以完成大部分功能。

  同样,AreaDAOImpl继承BaseDAOImpl,也不需要做太多的操作。将来加新模块,也照抄即可,替换bean就行了。

二:Service层

  和DAO层类似,接口和实现类都继承BaseService相关的,可以打开BaseService看一下,里面有几个方法,方法不多,比BaseDAO里面的众多方法少了许多。

  主要就是几个常用的增删改查和分页,其中queryPageBean是分页,queryById是根据int型的id来查询对象,注意并没有by String的方法,意味着如果你的表id是String类型的话,你的自定义的service接口需要加上T queryById(String id);  这个query4AutoComplete是用于输入框点击后自动查询出下拉列表用的,将来界面上能看到。

  service的实现类,如AreaServiceImpl继承BaseServiceImpl并实现AreaService接口,如果你的业务里有BaseService利满足不了的方法的话,就可以自己添加,譬如T queryById(String id);   实现接口后,里面的方法就根据自己的业务需要来做相应的实现即可。BaseServiceImpl里面保存的都是各个DAO,你添加了新功能后,需要把你的DAO添加到BaseServiceImpl里面,设置set get方法即可。

三:model层

这里面就是javabean的定义了,由于采用的是hibernate,所以每个bean对应一张表,并且需要写自己的hbm.xml映射

  命名的话都是以Tb开头,都extends了Entity,目的是分页用的,都实现了EntitySerializable接口,里面有一个toAjaxObject的方法,目的是可能会用到的转json功能。

  TbArea中,int型的都用了Integer来定义了,区别就是用int的话,即便不赋值,也会默认为0,Integer的话不赋值在数据库里就是null了。作者这么设计,那么就按照他的方法来吧。

  有很多表可能需要保存一些信息如,createTime创建时间,updateTime更新时间,deleteFlag删除标志目的是不进行物理删除,这个就根据自己的需求来设计添加就行了。

  toAjaxObject方法里,需要提的就是,基础属性他都是直接赋值了,如果里面有对象的,就取了对象的几个主要属性来赋值,免得把关联的类的全部值都取了,像如果关联的有User的话,User里的password明显是不想给其他类看到的,所有自己来取几个主要的值就行了。

  作者的方法是对所有的基础类型的属性取值赋值,这种方法是相当麻烦的,尤其是属性众多的是时候,譬如TbUser类,手敲的话还是相当恐怖的。所以我采用了clone的方式,来完成基础属性的赋值。

public class TbUser extends Entity implements EntitySerializable<TbUser>, Cloneable实现一个Cloneable

public Object clone() throws CloneNotSupportedException {  
		TbUser cloned = (TbUser) super.clone();  
		cloned.createTime = (Date) createTime.clone();  
		if (getCompany() != null) {
			TbCompany tmpCompany = new TbCompany();
			tmpCompany.setCompanyId(getCompany().getCompanyId());
			tmpCompany.setCompanyName(getCompany().getCompanyName());
			cloned.setCompany(tmpCompany);
		}
		if (getDepartment() != null) {
			TbDepartment tmpDepartment = new TbDepartment();
			tmpDepartment.setDepartmentId(getDepartment().getDepartmentId());
			tmpDepartment.setDepartmentName(getDepartment().getDepartmentName());
			cloned.setDepartment(tmpDepartment);
		}

		if (getMainRole() != null) {
			TbRole tmpRole = new TbRole();
			tmpRole.setRoleId(getMainRole().getRoleId());
			tmpRole.setRoleName(getMainRole().getRoleName());
			cloned.setMainRole(tmpRole);
		}
		if (getOpUser() != null) {
			TbUser tmpUser = new TbUser();
			tmpUser.setUserId(getOpUser().getUserId());
			tmpUser.setLoginName(getOpUser().getLoginName());
			tmpUser.setRealName(getOpUser().getRealName());
			cloned.setOpUser(tmpUser);
		}
		return cloned;  
    }
@Override
	public TbUser toAjaxObject() {
		try {
			return (TbUser) this.clone();
		} catch (CloneNotSupportedException e) {
			e.printStackTrace();
			return null;
		}
}

这样就只需要对关联类做处理即可,基础属性就直接clone后就是了。关于clone相关的,可以看另外一篇文章点击打开链接

另外作者提到过,在项目里禁止使用一对多,多对多关联,只能是多对一。所以看到的所有javabean里没有其他对象的List集合。目的是hibernate的一对多时的加载问题,查1时会把多全查出来,对性能有较大的影响。当然,这种可以通过一些配置来避免掉,如果某些业务迫切需要1对多的话,就要好好配置一下。

  写好bean后,就配置hbm.xml了,这个比较简单,指定好表名,类名,列名就行了,如果有not null 的属性,或者不让重复的属性就单独配置一下not-null="true" unique="true",这些都是hibernate的基础知识。

gmms_web

一:action层

  这个没太多好说的,基础BaseAction即可,根据业务需求来实现不同的方法,随便找个抄抄就行,在BaseAction里面,你需要加入你自己的service接口,在180行附近,把你新建的service加进来 设置get set,然后你就能在你的action里使用所有的service了。关于分页相关的,就直接抄别的类的方法就行,比较简单。

二:struts配置

  新建个自己的struts.xml文件,指定好类,包名,namespace就可以了。里面的*_之类的是通配符,属于struts的基础知识,*是对应action类的方法名的。

  建好后把xml文件添加到struts-jeasyframe里面就行了。

三:config配置

application-gmms-dao  application-gmms-service里都是一些spring的映射配置,按照之前的配置一下就好了。

  hibernate.cfg.xml里把你新建的表的hbm.xml也添加进来。然后就OK了,下次你运行项目,你新建的javabean和hbm.xml,就会根据你设置的规则,自动创建出来表了。原因嘛,就是jdbc.properties里配置的hibernate的策略是update。

  里面有个小地方提一下,配置里面可以看到的有service和dao的注入映射,但是并没有action和service的注入,这是因为spring和action的自动注入,就不需要写action和service的注入了。spring注入action的service有两种方法,该项目是自动注入的,比手动注入的话少写一个配置文件。