一、通用工具类抽取
1、通用类的抽取思路分析
2、通用Dao抽取
(1)创建接口(在erp_dao下)
(2)把IDepDao里面所有的方法,都复制到IBaseDao里面去
package com.itzheng.erp.dao;
import java.util.List;
import com.itzheng.erp.entity.Dep;
public interface IBaseDao {
public List<Dep> getList();
List<Dep> getList(Dep dep1, Dep dep2, Object param, int firstResult, int maxResults);
long getCount(Dep dep1, Dep dep2, Object param);
void add(Dep dep);
public void delete(Long uuid);
Dep get(Long uuid);
void update(Dep dep);
}
(3)IBaseDao上加上泛型支持IBaseDao
(4)替换所有的Dep为大写的T,dep替换为t
package com.itzheng.erp.dao;
import java.util.List;
import com.itzheng.erp.entity.Dep;
public interface IBaseDao<T> {
public List<T> getList();
List<T> getList(T t1, T t2, Object param, int firstResult, int maxResults);
long getCount(T t1, T t2, Object param);
void add(T t);
public void delete(Long uuid);
T get(Long uuid);
void update(T t);
}
(5)删除接口IDepDao接口当中的方法,并继承IBaseDao
package com.itzheng.erp.dao;
import java.util.List;
import com.itzheng.erp.entity.Dep;
public interface IDepDao extends IBaseDao<Dep> {
}
(6)创建BaseDao实现IBaseDao的接口:实现IBaseDao接口以及继承HibernateDaoSupport,将DepDao当中的复制到BaseDao当中,替换Dep为T将 dep 替换为t
修改对应的代码
定义entityClass属性
把T.class替换为entityClass
添加无参构造方法,在构造方法当中实现entityClass的具体类型
package com.itzheng.erp.dao.impl;
import java.lang.reflect.ParameterizedType;
import java.lang.reflect.Type;
import java.util.List;
import org.hibernate.criterion.DetachedCriteria;
import org.hibernate.criterion.Projections;
import org.springframework.orm.hibernate5.support.HibernateDaoSupport;
import com.itzheng.erp.dao.IBaseDao;
public class BaseDao<T> extends HibernateDaoSupport implements IBaseDao<T> {
private Class<T> entityClass;
public BaseDao() {
// 通过子类来获取父类
Type baseDaoClass = getClass().getGenericSuperclass();
// 参数化的类型
ParameterizedType pType = (ParameterizedType) baseDaoClass;
// 获取参数类型的数组
Type[] types = pType.getActualTypeArguments();
// 得到了泛型里T的类型
Type targetType = types[0];
// 转成class类型
entityClass = (Class<T>) targetType;
}
/*
* 查询出所有的部门信息
*/
@Override
public List<T> getList() {
return (List<T>) this.getHibernateTemplate().find("from Dep");
}
/*
* 条件查询
*/
@Override
public List<T> getList(T t1, T t2, Object parme, int firstResult, int maxResults) {
DetachedCriteria dc = getDetachedCriteria(t1);
return (List<T>) this.getHibernateTemplate().findByCriteria(dc, firstResult, maxResults);// 添加条件之后再进行查询
}
@Override
public long getCount(T t1, T t2, Object parme) {
DetachedCriteria dc = getDetachedCriteria(t1);
dc.setProjection(Projections.rowCount());// 获取的是表中元素的个数
List<Long> list = (List<Long>) getHibernateTemplate().findByCriteria(dc);
return list.get(0);
}
/*
* 删除
*/
public void delete(Long uuid) {
T t = this.getHibernateTemplate().get(entityClass, uuid);
// 删除持久化转态
this.getHibernateTemplate().delete(t);
}
/*
* 由子类实现
*/
public DetachedCriteria getDetachedCriteria(T t) {
return null;
}
/*
*
*/
@Override
public void add(T t) {
this.getHibernateTemplate().save(t);
}
/*
* 通过编号查询对象
*/
@Override
public T get(Long uuid) {
return getHibernateTemplate().get(entityClass, uuid);
}
/*
* 更新
*/
@Override
public void update(T t) {
this.getHibernateTemplate().update(t);
}
}
3、erp_biz当中的,业务层抽取
(1)在erp_biz下的biz当中创建接口(创建通用业务层的接口)
package com.itzheng.erp.biz;
import java.util.List;
public interface IBaseBiz<T> {
/*
* 查询所有部门列表
*/
List<T> getList();
/*
* 条件查询
*
*/
List<T> getList(T t1, T t2, Object param, int firstResult, int maxResults);
public long getCount(T t1, T t2, Object param);
void add(T t);
public void delete(Long uuid);
public T get(Long uuid);
void update(T t);
}
(2)删除IDepBiz当中的方法,继承上面创建好的接口
package com.itzheng.erp.biz;
import com.itzheng.erp.entity.Dep;
/*
* 部门业务接口
*/
public interface IDepBiz extends IBaseBiz<Dep> {
}
(3)创建BaseBiz实现类,将DepBiz(替换DepDao为BaseDao,depDao替换成baseDao,将Dep改写为T,将dep改写为t)
package com.itzheng.erp.biz.impl;
import java.util.List;
import com.itzheng.erp.biz.IBaseBiz;
import com.itzheng.erp.dao.IBaseDao;
import com.itzheng.erp.entity.Dep;
public class BaseBiz<T> implements IBaseBiz<T> {
/*
* 数据访问层的调用
*/
private IBaseDao<T> baseDao;
public void setBaseDao(IBaseDao<T> baseDao) {
this.baseDao = baseDao;
}
@Override
public List<T> getList() {
// TODO Auto-generated method stub
return baseDao.getList();
}
@Override
public List<T> getList(T t1, T t2, Object param, int firstResult, int maxResults) {
return baseDao.getList(t1, t2, param, firstResult, maxResults);
}
@Override
public long getCount(T t1, T t2, Object param) {
return baseDao.getCount(t1, t2, param);
}
@Override
public void add(T t) {
System.out.println(t);
baseDao.add(t);
}
@Override
public void delete(Long uuid) {
// TODO Auto-generated method stub
baseDao.delete(uuid);
}
@Override
public T get(Long uuid) {
return baseDao.get(uuid);
}
@Override
public void update(T t) {
baseDao.update(t);
}
}
(4)在DepBiz当中继承BaseBiz实现IDepBiz
package com.itzheng.erp.biz.impl;
import java.util.List;
import com.itzheng.erp.biz.IDepBiz;
import com.itzheng.erp.dao.IDepDao;
import com.itzheng.erp.entity.Dep;
/*
* 部门业务实现
*/
public class DepBiz extends BaseBiz<Dep> implements IDepBiz {
/*
* 数据访问层的调用
*/
private IDepDao depDao;
public void setDepDao(IDepDao depDao) {
this.depDao = depDao;
super.setBaseDao(this.depDao);
}
}
4、抽取通用Action
(1)在erp_web当中创建,创建BaseAction
(2)将DepAction当中的所有方法都复制过来,替换DepBiz为BaseBiz,depBiz为baseBiz,替换Dep为T替换dep 为t
package com.itzheng.erp.action;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.alibaba.fastjson.JSON;
import com.itzheng.erp.biz.IBaseBiz;
public class BaseAction<T> {
private IBaseBiz<T> baseBiz;
public void setBaseBiz(IBaseBiz<T> baseBiz) {
this.baseBiz = baseBiz;
}
// 属性驱动:条件查询
private T t1;
private T t2;
private Object param;
public Object getParam() {
return param;
}
public void setParam(Object param) {
this.param = param;
}
public T getT2() {
return t2;
}
public void setT2(T t2) {
this.t2 = t2;
}
public T getT1() {
return t1;
}
public void setT1(T t1) {
this.t1 = t1;
}
private int page;// 页码
private int rows;// 每页的记录数
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public int getRows() {
return rows;
}
public void setRows(int rows) {
this.rows = rows;
}
// 条件查询
public void getList() {
System.out.println("页码:" + page + "记录数:" + rows);
int firstResult = (page - 1) * rows;
List<T> list = baseBiz.getList(t1, t2, param, firstResult, rows);
long total = baseBiz.getCount(t1, t2, param);// 查询数据的条数
// 把部门列表转换为JSON字符串
// {
{total: total, rows:[]};}
Map<String, Object> mapData = new HashMap<String, Object>();
mapData.put("total", total);
mapData.put("rows", list);
String listString = JSON.toJSONString(mapData);
write(listString);
}
/*
* 查询所有部门
*/
public void list() {
/*
* 调用业务部门的业务,查询所有部门信息
*/
List<T> list = baseBiz.getList();
// 把部门列表转换为JSON字符串
String listString = JSON.toJSONString(list);
write(listString);
}
/*
* 新增的修改
*/
private T t;
public T getT() {
return t;
}
public void setT(T t) {
this.t = t;
}
public void add() {
// {"success":true,"message":""}
// 返回前端的JSON数据
System.out.println(t + "------------------------------------");
Map<String, Object> rtn = new HashMap<String, Object>();
try {
baseBiz.add(t);
rtn.put("success", true);
rtn.put("message", "新增成功");
} catch (Exception e) {
e.printStackTrace();
rtn.put("success", false);
rtn.put("message", "新增失败");
}
// 向集合当中添加一部分数据,然后将map集合转换为JSON数据输出到页面上
write(JSON.toJSONString(rtn));
}
/*
* 删除
*/
private long id;
public long getId() {
return id;
}
public void setId(long id) {
this.id = id;
}
/**
* 删除
*
* @param jsonString
*/
public void delete() {
try {
baseBiz.delete(id);
ajaxReturn(true, "删除成功");
} catch (Exception e) {
e.printStackTrace();
ajaxReturn(false, "删除失败");
}
}
/*
* 通过编号查询对象
*/
public void get() {
T t = baseBiz.get(id);
String jsonString = JSON.toJSONString(t);
System.out.println("转换前:" + jsonString);
// 将JSON数据转换为MAP对象
// 转换为map对象
String jsonStringAfter = mapData(jsonString, "t");
System.out.println("转换后:" + jsonStringAfter);
write(jsonStringAfter);
}
/*
* 修改
*/
public void update() {
try {
ajaxReturn(true, "更新成功");
baseBiz.update(t);
} catch (Exception e) {
// TODO: handle exception
ajaxReturn(false, "更新失败");
e.printStackTrace();
}
}
// JSON 数据字符串
// 要加上的前缀
public String mapData(String jsonString, String prefix) {
Map<String, Object> map = JSON.parseObject(jsonString);
// 存储key加上前缀后的值
Map<String, Object> dataMap = new HashMap<String, Object>();
// 给每个key值加上前缀
for (String key : map.keySet()) {
dataMap.put(prefix + "." + key, map.get(key));
}
return JSON.toJSONString(dataMap);
}
public void ajaxReturn(boolean success, String message) {
// 返回前端的JSON数据
Map<String, Object> rtn = new HashMap<String, Object>();
rtn.put("success", success);
rtn.put("message", message);
write(JSON.toJSONString(rtn));
}
public void write(String jsonString) {
try {
// 响应对象
HttpServletResponse response = ServletActionContext.getResponse();
response.setContentType("text/html;charset=utf-8");
// 输出给页面
response.getWriter().write(jsonString);
System.out.println(jsonString);
} catch (IOException e) {
e.printStackTrace();
}
}
}
(3)改造DepAction
package com.itzheng.erp.action;
import java.io.IOException;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.ServletActionContext;
import com.alibaba.fastjson.JSON;
import com.itzheng.erp.biz.IDepBiz;
import com.itzheng.erp.entity.Dep;
/*
* 部门Action
*/
public class DeptAction extends BaseAction<Dep> {
private IDepBiz depBiz;
public void setDepBiz(IDepBiz depBiz) {
this.depBiz = depBiz;
super.setBaseBiz(this.depBiz);
}
}
5、抽取前端的(js代码封装)
在webapp下新建立一个js文件夹
在js文件夹下创建一个crud.js的文件
crud.js当中的内容,把dep.html里面的内容都复制到crud.js当中,将里面'dep
替换为name+'_
//提交的方法
var method = "";
$(function() {
$('#grid').datagrid({
url : name + '_getList',
columns : columns,
singleSelect : true,
pagination : true,
toolbar : [ {
text : '新增',
iconCls : 'icon-add',
handler : function() {
method = "add";
$('#editDlg').dialog('open');
}
} ]
});
$('#btnSearch').bind('click', function() {
// 把表单数据转换成json对象
var formData = $('#searchForm').serializeJSON();
$('#grid').datagrid('load', formData);
});
$('#editDlg').dialog({
title : '部门编辑',
width : 300,
height : 200,
closed : true,// 窗口是是否为关闭状态, true:表示关闭
modal : true
// 模式窗口
});
$('#btnSave').bind('click', function() {
var formData = $('#editForm').serializeJSON();
$.ajax({
url : name + '_' + method,
data : formData,
dataType : 'json',
type : 'post',
success : function(rtn) {
$.messager.alert("提示", rtn.message, 'info', function() {
// 成功的话,我们要关闭窗口
$('#editDlg').dialog('close');
// 刷新表格数据
$('#grid').datagrid('reload');
});
}
});
});
});
/**
* 删除部门
*/
function del(uuid) {
$.messager.confirm("确认", "确认要删除吗?", function(yes) {
if (yes) {
$.ajax({
url : name + '_delete?id=' + uuid,
dataType : 'json',
type : 'post',
success : function(rtn) {
$.messager.alert("提示", rtn.message, 'info', function() {
// 刷新表格数据
$('#grid').datagrid('reload');
});
}
});
}
});
}
/**
* 修改部门
*/
function edit(uuid) {
// 弹出窗口
$('#editDlg').dialog('open');
// 清空表单内容
$('#editForm').form('clear');
method = "update";
// 加载数据
$('#editForm').form('load', name + '_get?id=' + uuid);
}
dep.html里面先定义name=“dep”,colums=[];因为他们是具体某个实体类的私有内容
6、Dep.html修改
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>部门管理</title>
<link rel="stylesheet" type="text/css"
href="ui/themes/default/easyui.css">
<link rel="stylesheet" type="text/css" href="ui/themes/icon.css">
<script type="text/javascript" src="ui/jquery.min.js"></script>
<script type="text/javascript" src="ui/jquery.easyui.min.js"></script>
<script type="text/javascript" src="ui/locale/easyui-lang-zh_CN.js"></script>
<script type="text/javascript" src="ui/jquery.serializejson.min.js"></script>
<script type="text/javascript" src="js/crud.js"></script>
<script type="text/javascript">
var name = "dep";
var colums = [ [
{
field : 'uuid', title : '部门编号', width : 100 },
{
field : 'name', title : '部门名称', width : 100 },
{
field : 'tele', title : '部门联系电话', width : 100, align : 'right' },
{
field : '-', title : '操作',
formatter : function(value, row, index) {
var oper = "<a href=\"javascript:void(0)\" οnclick=\"edit("
+ row.uuid + ')">修改</a>';
oper += ' <a href="javascript:void(0)" οnclick="del('
+ row.uuid + ')">删除</a>';
return oper;
} }
] ]
</script>
</head>
<body>
<div class="easyui-panel"
style="padding-left: 4px; border-bottom: 0px;">
<div style="height: 2px;"></div>
<form id="searchForm">
<table>
<tr>
<td>名称</td>
<td><input name="t1.name"></td>
</tr>
<tr>
<td>电话</td>
<td><input name="t1.tele"></td>
</tr>
</table>
<button id="btnSearch" type="button">查询</button>
</form>
<div style="height: 2px;"></div>
</div>
<table id="grid"></table>
<div id="editDlg">
<form id="editForm">
<table>
<tr>
<td>部门名称</td>
<td><input name="t.name"><input type="hidden"
name="t.uuid" /></td>
</tr>
<tr>
<td>部门电话</td>
<td><input name="t.tele"></td>
</tr>
</table>
<button id="btnSave" type="button">保存</button>
</form>
</div>
</body>
</html>