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有两种方法,该项目是自动注入的,比手动注入的话少写一个配置文件。
- 51Nod 1004 n^n的末位数字(日常复习快速幂,莫名的有毒,卡mod值)
- kmp模版
- 触发器在渗透中的利用
- Codeforces 626B Cards(模拟+规律)
- Android 5.0屏幕录制漏洞(CVE-2015-3878)威胁预警
- Codeforces 626A Robot Sequence(模拟)
- BZOJ 2038: [2009国家集训队]小Z的袜子(hose)【莫队算法裸题&&学习笔记】
- [接口测试 - 基础篇] 01 你应该了解的协议基础
- Uva - 12050 Palindrome Numbers【数论】
- [接口测试 - http.client篇] 14 源码初探及其工作机制分析
- 51Nod 1277 字符串中的最大值(KMP,裸题)
- Codeforces Round #345 (Div. 2)【A.模拟,B,暴力,C,STL,容斥原理】
- 07.移动先行之谁主沉浮----控件之轮流轰炸——布局类控件
- BZOJ 1411&&Vijos 1544 : [ZJOI2009]硬币游戏【递推,快速幂】
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 使用ExecutorService实现线程池
- 搞它!!!linux服务器硬件及RAID 配置实战
- 认识XML
- 基于oracle的sql(结构化查询语言)指令
- oracle约束条件
- oracle常用函数介绍
- 搞它!!!Linux系统中查看进程和计划任务管理
- 搞它!!!深入了解linux文件系统底层原理及日志文件介绍
- 搞它!!!Linux系统MBR分区和GPT分区的区别
- oracle补充
- 搞它!!!Linux系统LVM原理及磁盘配额(PV、VG、LV、PE的关系,手把手教你,嘴对嘴的传达)
- 搞它!!!linux网络服务基本设置命令合集
- 搞它!!!Linux系统上DHCP服务器的配置(理论加实验,分分钟搞定!!!)
- 搞它!!!Linux——引导、排障及修复
- 排障集锦:九九八十一难之第一难!linux发现交换文件无法打开文件!