Java全栈开发---Java ERP系统开发:商业ERP(四)通用工具类的抽取

一、通用工具类抽取

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>

7、测试访问成功

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_44757034/article/details/109130159