SpringMVC,Ajax集成的后台基础字典信息的通用方法设计

两三年前曾经写过相似的通用方法,后来由于工作忙碌的原因,没有进行后续维护和改进,近来处来项目空闲期,回顾一遍后发现之前的方法过于依赖ExtJS与struts2,耦合性高,并且重用性也不好,对于目前流行的springMVC与Ajax也不能重写或修改,所以这里我决定基于原先的设计思路重新设计出了一套基于springMVC与Ajax的数据字典信息的通用方法。

数据字典,即我们所说的最基本的字典表,该对象仅仅包含id,name两个属性,是最基础的对象。下面就用具体的代码展现设计的通用方法,我也很希望各位技术牛人能在看完后给予我建议或意见,毕竟我仅仅只有两年的工作经验。

1.controller层

该层属于模板层,我用静态属性变量的方式使之成为一种模板,开发时,根据特定的项目约定和规则修改静态变量。

package com.java.controller;

import java.io.IOException;
import java.io.PrintWriter;
import java.net.URLDecoder;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.json.JSONObject;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.servlet.ModelAndView;

import com.java.business.DictionaryObjectBus;
import com.java.tool.Page;


/**
 * 此类用于数据字典表的通用复制粘贴类,
 * @author liuyuqin
 * @date 2015年2月3日10:01:37
 * 说明:
 * ①:该方法中包含了分页对象page,所以使用该类时,需要导入page分页对象,如果不使用分页对象Page,则需对遍历方法进行重写
 * ②:字典数据对象的id和name的数据类型都是String类型,否则,需要修改添加,修改,删除的字段数据类型
 * ③:msg信息包含了操作的返回信息,如果成功,即为SUCCESS,如果失败,会返回String类型的详细信息,前台打印详细信息即可
 * ④:遍历和查找对象方法涉及到页面跳转,使用了springMVC的ModelAndView对象
 * 	   添加和修改方法没有涉及页面跳转,使用了传统的ajax
 */
@Controller
public class DictionaryObjectController {
	private static final Log log = LogFactory
			.getLog(DictionaryObjectController.class);

	/**类相关信息**/
	//输入类对象位置
	private static final String OBJECTNAME = "首字母大写的对象名称,例如Xxxx";
	//输入类对象包全名
	private static final String OBJECTFULLNAME = "包含包名在内的对象全称,例如com.java.bean.XXX";
	/*以下是测试用例
	private static final String OBJECTNAME = "Dictionary";
	private static final String OBJECTFULLNAME = "com.java.bean.Dictionary";	
	*/
	
	
	/**requestMapping路径位置**/
	
	private static final String QUERY_REQUESTMAPPING = "Query方法中的requestMapping路径";
	private static final String INSERT_REQUESTMAPPING = "Insert方法中的requestMapping路径";
	private static final String UPDATE_REQUESTMAPPING = "Update方法中的requestMapping路径";
	private static final String FINDBYID_REQUESTMAPPING = "FindById方法中的requestMapping路径";
	private static final String DELETE_REQUESTMAPPING = "Delete方法中的requestMapping路径";
	private static final String DELETE_BATCH_REQUESTMAPPING = "批量Delete方法中的requestMapping路径";
	/*以下是测试用例
	private static final String QUERY_REQUESTMAPPING = "admin/dictionary/queryDictionaryObject";
	private static final String INSERT_REQUESTMAPPING = "admin/dictionary/insertDictionaryObject";
	private static final String UPDATE_REQUESTMAPPING = "admin/dictionary/updateDictionaryObject";
	private static final String FINDBYID_REQUESTMAPPING = "admin/dictionary/findDictionaryObjectById";
	private static final String DELETE_REQUESTMAPPING = "admin/dictionary/deleteDictionaryObject";
	private static final String DELETE_BATCH_REQUESTMAPPING = "admin/dictionary/deleteBatchDictionaryObject";
	*/
	
	/**输入跳转url页面位置**/
	
	private static final String QUERY_RETURN_VIEW = "Query方法中返回的跳转url页面"; 
	private static final String FINDBYID_RETURN_VIEW = "FindById方法中返回的跳转url页面";
	/*以下是测试用例
	private static final String FINDBYID_RETURN_VIEW = "admin/dictionary/dictionaryEdit"; 
	private static final String QUERY_RETURN_VIEW = "admin/dictionary/dictionaryList";
	*/
	
	/**输出传输参数**/
	private static final String QUERY_RETURN_LIST="Query方法中返回的传输对象List集合";
	private static final String FINDBYID_RETURN_OBJECT="FindById方法中返回的传输对象";
	/*以下是测试用例
	private static final String FINDBYID_RETURN_OBJECT="dictionary";
	private static final String QUERY_RETURN_LIST="dictionaryList";
	*/
	
	
	/**输入传输参数**/
	private static final String OBJECTID="FindById方法中需要传入的参数";
	/*以下是测试用例
	private static final String OBJECTID="dictionaryId";
	*/
	
	@Autowired
	private DictionaryObjectBus dictionaryObjectBus;
	
	/**
	 * 分页遍历列表显示
	 * @param page
	 */
	@RequestMapping(value = QUERY_REQUESTMAPPING)
	public ModelAndView queryDictionaryObject(Page page) throws Exception {
		ModelAndView mav = new ModelAndView();
		Map<String , Object> map = new HashMap<String, Object>();
		map = dictionaryObjectBus.queryDictionaryObject(page,OBJECTNAME);
		mav.setViewName(QUERY_RETURN_VIEW);
		mav.addObject(QUERY_RETURN_LIST,map.get("list"));
		mav.addObject("page", map.get("page"));	
		return mav;
	}

	/**
	 * 添加对象
	 * @param object
	 * @param session
	 * @param response
	 * @throws Exception 
	 */
	@RequestMapping(value = INSERT_REQUESTMAPPING)
	public void insertDictionaryObject(String name,HttpSession session,HttpServletResponse response) throws Exception {
		JSONObject obj = new JSONObject();
		PrintWriter out = null;
		String msg = "";
		try{
			out = response.getWriter();
			msg = dictionaryObjectBus.insertDictionaryByCheckRepeatYES(name,OBJECTNAME,OBJECTFULLNAME);
			obj.put("msg", msg);
			out.print(obj);
		}catch (Exception e) {  
            e.printStackTrace();  
        }  
 		finally{
			out.close();
		}
	}

	/**
	 * 修改对象
	 * @param object
	 * @param session
	 * @param response
	 * @throws Exception 
	 */
	@RequestMapping(value = UPDATE_REQUESTMAPPING)
	public void updateDictionaryObject(String id,String name,HttpSession session,HttpServletResponse response) throws Exception {
		JSONObject obj = new JSONObject();
		PrintWriter out = null;
		String msg = "";
		try{
			out = response.getWriter();
			msg = dictionaryObjectBus.updateDictionaryObject(id,name,OBJECTNAME,OBJECTFULLNAME);
			obj.put("msg", msg);
			out.print(obj);
		}catch (Exception e){  
            e.printStackTrace();  
        }  
 		finally{
			out.close();
		}
	}
	
	
	/**
	 * 通过对象ID查找对象集合
	 * @param object
	 * @throws Exception 
	 */
	@RequestMapping(value =FINDBYID_REQUESTMAPPING)
	public ModelAndView findDictionaryObjectById(
			@RequestParam(OBJECTID) String objectId) throws Exception {
		ModelAndView mav = new ModelAndView();
		Object obj =  dictionaryObjectBus.findDictionaryObjectById(objectId,OBJECTNAME);
		mav.setViewName(FINDBYID_RETURN_VIEW);
		mav.addObject(FINDBYID_RETURN_OBJECT, obj);
		return mav;
	}
	
	

	/**
	 * 删除对象(单个删除)
	 * @param OBJECTID
	 */
	@RequestMapping(value = DELETE_REQUESTMAPPING)
	public void deleteDictionaryObject(@RequestParam(OBJECTID) String objectId,
			HttpServletResponse response) throws Exception {
		PrintWriter out = null;
		String msg = "";
		try{
			out = response.getWriter();
			msg = dictionaryObjectBus.deleteDictionaryObject(objectId,OBJECTNAME);
			out.print(msg);
		}catch (Exception e) {  
			e.printStackTrace();  
		}  
		finally{
			out.close();
		}
	}
	
	/**
	 * 删除商品分类(批量删除)
	 * @param idArray
	 */
	@RequestMapping(value = DELETE_BATCH_REQUESTMAPPING)
	public void deleteBatchDictionaryObject(
			String idArray,HttpServletResponse response){
		PrintWriter out = null;
		String msg = "";
		try{
			out = response.getWriter();
			msg = dictionaryObjectBus.deleteDictionaryObject(idArray,OBJECTNAME);
			out.print(msg);
		}catch (Exception e) {  
			e.printStackTrace();  
		}  
		finally{
			out.close();
		}
	}
}

2.business层

business层是此设计模式的重点java方法,该方法利用反射的设计思路写了一套通用方法

package com.java.business;

import java.lang.reflect.Method;
import java.util.List;
import java.util.Map;

import javax.annotation.Resource;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Service;

import com.java.dao.DictionaryObjectDao;
import com.java.tool.Page;

/**
 * 字典信息通用CRUD方法,适用于id name两个字段的字典数据的CRUD
 * @author liuyuqin
 * @date 2015年2月3日14:14:27
 *
 */
@Service("dictionaryObjectBus")
public class DictionaryObjectBus {

	@Resource
	private DictionaryObjectDao dictionaryObjectDao;
	
	private static final Logger log = LoggerFactory.getLogger("dictionaryObjectLog");
	
	
	/**
	 * 添加字典表信息(加入名称验证重复性验证)
	 * <字典表结构 必须是 name value属性设置,即键值对设置>
	 * @return
	 * @throws Exception 
	 */
	public String insertDictionaryByCheckRepeatYES(String objectName,String OBJECTNAME,String OBJECTFULLNAME) throws Exception{
		Object o = null;
		Class object  = Class.forName(OBJECTFULLNAME);
		//创建动态对象实例
		o = object.newInstance();
		//通过字典表信息名称查询是否已经存在该字典表信息,如果存在返回重复信息,不存在则进行添加 
		List<Object> dictionaryObjectList = (List<Object>) dictionaryObjectDao.findSpecificByName(objectName,OBJECTNAME);
		//判断添加的对象的属性名称是否与数据库已有数据名称重名
		if(dictionaryObjectList.size() == 0){
			try {
				//将名称值传入
				Method tAge = object.getMethod("setName", String.class);
				tAge.invoke(o, objectName);
				dictionaryObjectDao.save(o);
			} catch (Exception e) {
				e.printStackTrace();
			}
			return "SUCCESS";
		}
		else 
			return "输入的名称已存在,请重新输入";
	}
	
	/**
	 * 添加字典表信息(不加入名称验证重复性验证)
	 *  <字典表结构 必须是 name value属性设置,即键值对设置>
	 * @return
	 * @throws Exception 
	 */
	public String insertDictionaryByCheckRepeatNO(String objectName,String OBJECTNAME,String OBJECTFULLNAME) throws Exception{
		Object o = null;
		Class object  = Class.forName(OBJECTFULLNAME);
		//创建动态对象实例
		o = object.newInstance();
		try {
			//将名称值传入
			Method tAge = object.getMethod("setName", String.class);
			tAge.invoke(o, objectName);
			dictionaryObjectDao.save(o);
		} catch (Exception e) {
			e.printStackTrace();
		}
		return "SUCCESS";
	}
	
	/**
	 * 修改字典表对象信息
	 * @param Object
	 * @return
	 */
	public String updateDictionaryObject(String id,String name,String OBJECTNAME,String OBJECTFULLNAME) throws Exception{
		List<Object> dictionaryObjectList = (List<Object>) dictionaryObjectDao.findOtherSpecificByIdAndName(id,name,OBJECTNAME);
		if(dictionaryObjectList.size() >0){
			return "输入的名称已存在,请重新输入";
		}
		else{
			Object obb = dictionaryObjectDao.findSpecificById(id, OBJECTNAME);
			Class c = obb.getClass();
			Method sAge = c.getMethod("setName", String.class);
			sAge.invoke(obb, name);
			//log.info(LogHelper.userLog("update class<"+className+">["+dictionaryObjectName+"]"));
			return "SUCCESS";
		}
	}
	
	 /**  删除字典表某条信息(支持多条删除)
	 * @throws Exception 
	 */
	public String deleteDictionaryObject(String delData,String className) throws Exception{
		 String[] ids = delData.split(",");
		 String objectName ="";
		 for (int i = 0; i < ids.length; i++) {
			 Object object =dictionaryObjectDao.findSpecificById(ids[i], className); 
			 dictionaryObjectDao.delete(object);
			 if(objectName.equals("")){
				 objectName += ids[i] ;
			 }
			 else 
				objectName += "," + ids[i] ;
		 }
		 //log.info(LogHelper.userLog("delete class<"+className+">["+objectName+"]"));
		 return "SUCCESS";
	}
	
	/**
	 * 分页显示所有字典表信息
	 * @throws Exception 
	 * @return
	 */
	public Map<String, Object> queryDictionaryObject(Page page,String className){
		return dictionaryObjectDao.queryDictionaryObject(page,className);
	}
	
	/**
	 * 根据字典表对象Id找到相应对象
	 * @return 
	 */
	public Object findDictionaryObjectById(String objectId,String className) throws Exception{
		return dictionaryObjectDao.findSpecificById(objectId,className);
	}
}

3,dao层

dao层也为通用方法

package com.java.dao;

import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Repository;

import com.java.tool.Page;

/**
 * A data access object (DAO) providing persistence and search support for Role
 * entities. Transaction control of the save(), update() and delete() operations
 * can directly support Spring container-managed transactions or they can be
 * augmented to handle user-managed Spring transactions. Each of these methods
 * provides additional information for how to configure it for the desired type
 * of transaction control.
 * 
 * @see com.donglusoft.rightmanagerment.domain.Role
 * @author MyEclipse Persistence Tools
 */

/**
 * 字典信息通用CRUD方法,适用于id name两个字段的字典数据的CRUD
 * @author liuyuqin
 * @date 2015年2月3日14:14:27
 *
 */
@Repository("dictionaryObjectDao")
public class DictionaryObjectDao extends EntityDaoImpl {
	private static final Logger log = LoggerFactory.getLogger(DictionaryObjectDao.class);
	
	
	/**********************自定义方法(↓)****************************/
	/**
	 *  通过Id查找特定的对象
	 */
	public Object findSpecificById(String dictionaryObjectId,String className){
		try{
			String queryString = "from " + className + " as t where " +
					"t.id=:dictionaryObjectId";
			Query query = getSession().createQuery(queryString);
			query.setString("dictionaryObjectId", dictionaryObjectId);
			return query.uniqueResult();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			throw e;
			}
	}
	
	/**
	 *  通过name查找特定的对象
	 */
	public List<Object> findSpecificByName(String dictionaryObjectName,String className){
		try{
			String queryString = "from "+className +" as t where t.name =:name";
			Query query = getSession().createQuery(queryString);
			query.setString("name", dictionaryObjectName);
			return query.list();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			throw e;
			}
	}
	
	/**
	 *  通过name查找特定的id不是dictionaryObjectId的对象
	 */
	public List findOtherSpecificByIdAndName(String dictionaryObjectId,String dictionaryObjectName,String className){
		try{
			String queryString = "from "+className +" as t where t.name =:name and t.id<>:id ";
			Query query = getSession().createQuery(queryString);
			query.setString("name", dictionaryObjectName);
			query.setString("id", dictionaryObjectId);
			return query.list();
		} catch (HibernateException e) {
			// TODO Auto-generated catch block
			throw e;
			}
	}
	
	 /**
	 * 遍历所有可用的DictionaryObject对象
	 * @param page
	 * @param className
	 * @return
	 */
	public Map<String, Object> queryDictionaryObject(Page page , String className){
		Map<String, Object> map = new HashMap<String, Object>();
		try { 
			String queryString = "from " +className;
			String countString = "select count(*) from " +className;
			Query query = getSession().createQuery(queryString);
			Query countquery = getSession().createQuery(countString);
			query.setFirstResult(page.getPageNo() * page.getPageLines());
			query.setMaxResults(page.getPageLines());
			int totalRows = Integer.parseInt(countquery.uniqueResult().toString());
			page.setTotalPages(totalRows, page.getPageLines());
			map.put("list", query.list());
			map.put("page", page);
			return map;
		} catch (HibernateException e) {
			throw e;
		}
	}

	
	/**********************自定义方法(↑)****************************/

	public void save(Object transientInstance) {
		log.debug("saving Object instance");
		try {
			getSession().save(transientInstance);
			log.debug("save successful");
		} catch (RuntimeException re) {
			log.error("save failed", re);
			throw re;
		}
	}

	public void delete(Object persistentInstance) {
		log.debug("deleting Object instance");
		try {
			getSession().delete(persistentInstance);
			log.debug("delete successful");
		} catch (RuntimeException re) {
			log.error("delete failed", re);
			throw re;
		}
	}
}

前台利用表单提交insert与update,其他使用ajax提交即可

最后还有Page分页对象,javaBean如下

package com.java.tool;

public class Page {

	private int totalRows; // 总记录数

	private int pageLines; // 每页显示行数

	private int pageNo; // 当前页数

	private int totalPages; // 总页数

	public Page() {
		totalRows = 0;
		pageLines = 10;
		pageNo = 0;
		totalPages = 1;
	}

	public int getTotalRows() {
		return totalRows;
	}

	public void setTotalRows(int totalRows) {
		if (totalRows >= 0)
			this.totalRows = totalRows;
	}

	public int getPageLines() {
		return pageLines;
	}

	public void setPageLines(int pageLines) {
		if (pageLines > 0)
			this.pageLines = pageLines;
	}

	public void setPageLines(String pageLines) {
		if (pageLines == null || pageLines.length() == 0
				|| pageLines.equals("0")) {
			this.pageLines = 50;
		} else {
			this.pageLines = Integer.parseInt(pageLines);
		}
	}

	public int getPageNo() {
		return pageNo;
	}

	public void setPageNo(int pageNo) {
//		if (pageNo > 0)
			this.pageNo = pageNo;
	}

	public void setPageNo(String pageNo) {
//		if (pageNo == null || pageNo.length() == 0) {
//			this.pageNo = 1;
//		} else {
			this.pageNo = Integer.parseInt(pageNo);
//		}
	}

	public int getTotalPages() {
		return totalPages;
	}

	// 总页数 记录数和每页记录数
	public void setTotalPages(int totalRows, int pageLines) {
		this.totalRows = totalRows;
		if (pageLines > 0)
			this.pageLines = pageLines;
		if (pageLines > 0)
			this.totalPages = totalRows % pageLines == 0 ? totalRows
					/ pageLines : totalRows / pageLines + 1;
	}

	public void setTotalPages(int totalPages) {
		this.totalPages = totalPages;
	}

	public void validateData() {
		if (this.pageNo > this.totalPages)
			this.pageNo = this.totalPages;
		if (this.pageNo <= 0)
			this.pageNo = 1;
		if (this.pageLines <= 0)
			this.pageLines = 10;
	}
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
概要介绍: 本课程主要是介绍并实战一款java中间件~redisson,介绍redisson相关的核心技术栈及其典型的应用场景,其中的应用场景就包括布隆过滤器、限流器、短信发送、实时/定时邮件发送、数据字典、分布式服务调度等等,在业界号称是在java项目里正确使用redis的姿势。本课程的目标就在于带领各位小伙伴一起学习、攻克redisson,更好地巩固自己的核心竞争力,而至于跳槽涨薪,自然不在话下!  课程内容: 说起redisson,可能大伙儿不是很熟悉,但如果说起redis,想必肯定很多人都晓得。没错,这家伙字如其名,它就是架设在redis基础上的一款综合性的、新型的中间件,号称是java企业级应用开发中正确使用redis的姿势/客户端实例。 它是架设在redis基础之上,但拥有的功能却远远多于原生Redis 所提供的,比如分布式对象、分布式集合体系、分布式锁以及分布式服务调度等一系列具有分布式特性的对象实例… 而这些东西debug将在本门课程进行淋漓尽致的介绍并实战,除此之外,我们将基于spring boot2.0搭建的多模块项目实战典型的应用场景:对象存储、数据字典、短信发送、实时/定时邮件发送、布隆过滤器、限流组件、分布式服务调度....课程大纲如下所示: 下面罗列一下比较典型的核心技术栈及其实际业务场景的实战,如下图所示为redisson基于订阅-发布模式的核心技术~主题Topic的实际业务场景,即实时发送邮件: 而下图则是基于“多值映射MultiMap”数据结构实战实现的关于“数据字典”的缓存管理: 除此之外,我们还讲解了可以与分布式服务调度中间件dubbo相媲美的功能:分布式远程服务调度,在课程中我们动手搭建了两个项目,用于分别充当“生产者”与“消费者”角色,最终通过redisson的“服务调度组件”实现服务与服务之间、接口与接口之间的调用!  课程收益: (1)认识并掌握redisson为何物、常见的几种典型数据结构-分布式对象、集合、服务的应用及其典型应用场景的实战; (2)掌握如何基于spring boot2.0整合redisson搭建企业级多模块项目,并以此为奠基,实战企业级应用系统中常见的业务场景,巩固相应的技术栈! (3)站在项目管理与技术精进的角度,掌握对于给定的功能模块进行业务流程图的绘制、分析、模块划分、代码实战与性能测试和改进,提高编码能力与其他软实力; (4)对于Java微服务、分布式、springboot精进者而言,学完本课程,不仅可以巩固提高中间件的实战能力,其典型的应用场景更有助于面试、助力相关知识点的扫盲! 如下图所示: 关键字:Spring Boot,Redis,缓存穿透,缓存击穿,缓存雪崩,红包系统,Mybatis,高并发,多线程并发编程,发送邮件,列表List,集合Set,排行榜,有序集合SortedSet,哈希Hash ,进阶实战,面试,微服务、分布式 适用人群:redisson学习者,分布式中间件实战者,微服务学习者,java学习者,spring boot进阶实战者,redis进阶实战者

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值