2019独角兽企业重金招聘Python工程师标准>>>

package cn.jcwx.core.web;import java.io.IOException;
import java.text.SimpleDateFormat;
import java.util.Arrays;
import java.util.Date;
import java.util.List;
import java.util.Map;import javax.annotation.Resource;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.propertyeditors.CustomDateEditor;
import org.springframework.beans.propertyeditors.CustomNumberEditor;
import org.springframework.validation.BindException;
import org.springframework.validation.ObjectError;
import org.springframework.validation.Validator;
import org.springframework.web.bind.ServletRequestDataBinder;
import org.springframework.web.bind.WebDataBinder;
import org.springframework.web.bind.annotation.InitBinder;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.multipart.MultipartFile;
import org.springframework.web.multipart.support.ByteArrayMultipartFileEditor;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.util.WebUtils;import cn.jcwx.core.service.HibernateDao;
import cn.jcwx.core.service.support.ScrollResult;
import cn.jcwx.core.tag.table.TableTag;
import cn.jcwx.core.utils.BeanUtils;
import cn.jcwx.core.utils.StringUtils;import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;/*** 实现了CRUD功能的Controller <br/>* 建议子类重写回调函数 <br/><br/>* * 保存或更新实体:save.do <br/>* 删除实体:remove.do <br/>* 查询单个实体信息:show.do <br/>* * @author EwinLive@gmail.com* @date 2011-2-23* @version 1.0*/
public abstract class CrudController<T>{@Resourceprivate Validator validator;protected static final Logger logger = LoggerFactory.getLogger(CrudController.class);protected Gson gson = new GsonBuilder().setDateFormat("yyyy-MM-dd").create();protected String className;protected String entityName;protected T entity;protected String listView = null;protected String formView = null;public static final String successView = "/share/common/success.jsp";public CrudController() {className = BeanUtils.getSuperClassGenricType(getClass()).getName();entityName = StringUtils.substringAfterLast(className, ".");entityName = entityName.substring(0, 1).toLowerCase() + entityName.substring(1, entityName.length());listView = "list.jsp";formView = "form.jsp";}/*** 获取实体服务类的实例* @return*/protected abstract HibernateDao<T, Integer> getEntityService();@InitBinderpublic void initBinder(WebDataBinder binder) {SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");binder.registerCustomEditor(Date.class, new CustomDateEditor(dateFormat, true));binder.registerCustomEditor(Integer.class, new CustomNumberEditor(Integer.class, true));binder.registerCustomEditor(Double.class, new CustomNumberEditor(Double.class, true));binder.registerCustomEditor(MultipartFile.class, new ByteArrayMultipartFileEditor());}/*** 根据默认的请求参数进行分页查询。* 回调函数:beforeDoList(...), afterDoList(...)* @param request 当前的HttpServletRequest* @param filterMap 过滤条件,如:filterMap.put("id_EQ_I", 12)。    可以为null*                  * @param sortMap 排序条件,如:sortMap.put("id", "desc"); asc为正序,desc为倒序。    可以为null* @return ScrollResult<T>*/@RequestMapping(value = "list.do")public ModelAndView doList(HttpServletRequest request, HttpServletResponse response){ModelAndView mav = new ModelAndView(listView);//提取客户端可能传送的过滤条件和排序条件Map<String, Object> filterMap = WebUtils.getParametersStartingWith(request, "search_");Map<String, Object> sortMap = WebUtils.getParametersStartingWith(request, "sort_");Integer no, size;String pSize = (String) request.getParameter("p_size");String pNo = (String) request.getParameter("p_no");if (StringUtils.isEmpty(pNo)) {no = 1;} else {no = Integer.parseInt(pNo);}if (StringUtils.isEmpty(pSize)) {size = TableTag.DEF_ROWS_MIN;} else {size = Integer.parseInt(pSize);}beforeList(request, filterMap, sortMap);ScrollResult<T> result = (ScrollResult<T>) getEntityService().findScrollResult(no, size, filterMap, sortMap);mav.addObject(entityName + "s", result.getResultList());mav.addObject("totalRows", result.getTotal());afterList(request, response, mav);return mav;}/*** 分页查询(list.do)回调函数,该方法在执行查询之前调用。可以继续添加过滤条件和排序条件。* @param request* @param filterMap* @param sortMap*/protected void beforeList(HttpServletRequest request, Map<String, Object> filterMap, Map<String, Object> sortMap){};/*** 分页查询(list.do)回调函数,该方法在返回视图之前调用。可以继续添加返回信息。* @param request* @param response* @param mav*/protected void afterList(HttpServletRequest request, HttpServletResponse response, ModelAndView mav){};/*** 定向到新增实体的表单界面<br/>* 回调函数:onCreate(...)* @param request* @param response* @return* @throws Exception*/@RequestMapping(value = "create.do")public ModelAndView doCreate(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView mav = new ModelAndView(formView);onCreate(request,response, mav);return mav;}/*** 新增实体的表单界面(create.do)回调函数。该方法在返回视图之前调用,可以继续添加返回信息。* @param request* @param response* @param mav*/protected void onCreate(HttpServletRequest request, HttpServletResponse response, ModelAndView mav){};/*** 表单编辑界面*/@RequestMapping(value = "edit.do")public ModelAndView edit(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView mav = new ModelAndView(formView);String id = request.getParameter("id");if (StringUtils.isNotEmpty(id)) {entity = getEntityService().get(Integer.valueOf(id));mav.addObject(entityName, entity);}onEdit(entity, mav, request);return mav;}protected void onEdit(T entity, ModelAndView mav, HttpServletRequest request){};/*** 保存实体<br/>* 回调函数:beforeDoSave(...), afterDoSave(...)* @param request* @param response* @return* @throws Exception*/@SuppressWarnings("unchecked")@RequestMapping(value = "save.do")public ModelAndView doSave(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView mav = new ModelAndView(successView);String id = request.getParameter("id");if (StringUtils.isEmpty(id)) {entity = (T) BeanUtils.getSuperClassGenricType(getClass()).newInstance();} else {entity = getEntityService().get(Integer.valueOf(id));}boolean check = beforeBindRequestEntity(request, entity, mav);if(!check)return mav;beforeBindRequestEntity(request, entity, mav);BindException errors = bindRequestEntity(request, entity);beforeSave(request, entity, errors, mav);if (errors.hasErrors()) {logger.error(errors.getMessage());mav.addObject("msg", getMessageFromErrors(errors));mav.addObject("state", "failed");mav.addObject("url", "list.do");return mav;}getEntityService().save(entity);mav.addObject("msg", "保存成功!");mav.addObject("state", "ok");afterSave(request, response, mav, entity);return mav;}/*** 从Request中绑定对象并进行校验.*/protected BindException bindRequestEntity(HttpServletRequest request, T entity) throws Exception {ServletRequestDataBinder binder = new ServletRequestDataBinder(entity);initBinder(binder);binder.bind(request);BindException errors = new BindException(binder.getBindingResult());validator.validate(entity, errors);return errors;}/*** 保存实体(save.do)回调函数,在执行实体与Request参数绑定之前调用用。* 注意:由于entity可能是托管对象,对entity所做的修改都将反映到数据库。* 所以有必要在此方法中进行前期的数据校验,以免发生意外。* @param request* @param entity* @param mav* @return 是否通过校验*/protected boolean beforeBindRequestEntity(HttpServletRequest request, T entity, ModelAndView mav){ return false;};/*** 保存实体(save.do)回调函数,在执行保存之前调用用。可以进行数据校验。* @param request HttpServletRequest* @param entity 实体对象* @param errors BindException 可以添加错误信息* @param mav ModelAndView*/protected void beforeSave(HttpServletRequest request, T entity, BindException errors, ModelAndView mav){};/*** 保存实体(save.do)回调函数,在返回视图之前调用用。可以继续添加返回信息。* @param request* @param response* @param mav*/protected void afterSave(HttpServletRequest request, HttpServletResponse response, ModelAndView mav, T entity){};@RequestMapping(value = "remove.do")public ModelAndView doRemove(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView mav = new ModelAndView(successView);String id = request.getParameter("id");T t = getEntityService().load(Integer.valueOf(id));beforeRemove(request, response, t);getEntityService().remove(t);afterRemove(request, response, mav, new StringBuilder().append("成功删除").append("1个").append(entityName).append(" id:").append(id).toString());return mav;}/*** 批量删除实体<br/>* 回调函数:beforeDoRemove(...), afterDoRemove(...)* @param request* @param response* @return* @throws Exception*/@RequestMapping(value = "batchRemove.do")public ModelAndView doBatchRemove(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView mav = new ModelAndView(successView);String[] ids = request.getParameterValues("itemlist");String entity = request.getParameter("entityName");StringBuilder sb = null;int success = 0;T t = null;if (ids != null) {for (String id : ids) {t = getEntityService().get(Integer.valueOf(id));beforeRemove(request, response, t);getEntityService().remove(t);success++;}sb = new StringBuilder().append("成功删除").append(success).append("个").append(entity).append(" ids:").append(Arrays.toString(ids));mav.addObject("msg", sb.toString());} else {mav.addObject("msg", "未选择" + entity);}afterRemove(request, response, mav, sb.toString());return mav;}/*** 删除实体(remove.do)回调函数,在执行保存之前调用用。可以进行数据校验。* @param request* @param response* @param entity 实体对象*/protected void beforeRemove(HttpServletRequest request, HttpServletResponse response, T entity){};/*** 删除实体(remove.do)回调函数,在返回视图之前调用用。可以继续添加返回信息。* @param request* @param response* @param mav*/protected void afterRemove(HttpServletRequest request, HttpServletResponse response, ModelAndView mav, String msg){};/*** 查询实体信息<br/>* 回调函数:onShow(...)* @param request* @param response* @return* @throws Exception*/@RequestMapping(value = "show.do")public ModelAndView doShow(HttpServletRequest request, HttpServletResponse response) throws Exception {ModelAndView mav = new ModelAndView(formView);entity = getEntityService().get(Integer.valueOf(request.getParameter("id")));mav.addObject(entityName, entity);onShow(request, response, entity, mav);return mav;}/*** 查询实体信息(show.do)回调函数,在返回视图之前调用用。可以继续添加返回信息。* @param request* @param response* @param entity 实体对象* @param mav*/protected void onShow(HttpServletRequest request, HttpServletResponse response, T entity, ModelAndView mav){};@SuppressWarnings("unchecked")private String getMessageFromErrors(BindException errors){StringBuilder sb = new StringBuilder();sb.append("错误信息:");List<ObjectError> list= errors.getAllErrors();for(ObjectError error : list){sb.append(error.getDefaultMessage()).append(";");}return sb.toString();}/*** 向客户端写入JSON数据* @param response * @param element JsonElement的子类可以是JsonArray或JsonObject*/protected void writeJsonDate(HttpServletResponse response, JsonElement element){try {response.setCharacterEncoding("UTF-8");response.getWriter().print(element.toString());} catch (IOException e) {e.printStackTrace();}}
}

转载于:https://my.oschina.net/lvzjane/blog/94552

springMVC实现的crud操作相关推荐

  1. Spring+SpringMVC+Hibernate整合(封装CRUD操作)

    前言:当前Web项目开发的框架主流应该非Spring+SpringMVC+Hibernate莫属,不管是工作还是学习中涉及框架技术,首先是要搭建一套运行环境,虽然网上框架整合的教程很多,但我还是输出此 ...

  2. java中利用框架传入相同的url实现crud操作_Java SSM框架基础面试题

    1.Spring 在ssm中起什么作用? Spring:轻量级框架 作用:Bean工厂,用来管理Bean的生命周期和框架集成. 两大核心: 1.IOC/DI(控制反转/依赖注入) :把dao依赖注入到 ...

  3. SSM框架CRUD操作批量删除批量追加数据(OracleMySQL数据库)

    SSM框架CRUD操作Demo 1.SSM开发环境搭建详见下一章微博 2.定义起始页,基本的超链接完成请求,详见如图 由于时间关系,本人将在本博客中陆续推出高级框架阶段的系列教程,现已经发布如下几篇, ...

  4. SpringBoot的CRUD操作

    目录 自动装配的原理 Pom.xml文件 启动器 Thmeleaf的介绍 WebJars 使用springboot实现CRUD操作 项目结构 依赖引入 加入自定义过滤器类 Controller 使用l ...

  5. SSM框架整合之CRUD操作

    SSM框架整合之CRUD操作 说明: 主要将SSM框架整合,做简单的业务逻辑操作CRUD,所以前端并不怎么好看,但是业务逻辑更集中SSM整合和CRUD操作,非常适合刚学过Sping + SpringM ...

  6. SpringBoot(四) Web开发(2)Restful风格的CRUD操作

    1.创建工程 使用之前使用的Spring提供的向导,快速创建一个包含web模板的SpringBoot工程:springboot-web-restful: 1.1 pom.xml如下 <?xml ...

  7. mybatis CRUD操作

    mybatis CRUD操作 select select标签是mybatis最常用的标签之一. select语句有很多属性可以详细的配置每一天sql语句. id 命名空间唯一的标识. 接口中的方法名与 ...

  8. mybatis 一对多_Springboot整合Mybatis实现级联一对多CRUD操作

    在关系型数据库中,随处可见表之间的连接,对级联的表进行增删改查也是程序员必备的基础技能.关于Spring Boot整合Mybatis在之前已经详细写过,不熟悉的可以回顾Spring Boot整合Myb ...

  9. php 命令执行crud_如何使用原始JavaScript执行CRUD操作

    php 命令执行crud by Zafar Saleem 通过Zafar Saleem 如何使用原始JavaScript执行CRUD操作 (How to perform CRUD operations ...

  10. vue.js crud_如何使用VS Code和ADO.NET使用ASP.NET Core执行CRUD操作

    vue.js crud 介绍 (Introduction) In this article we are going to create a web application using ASP.NET ...

最新文章

  1. LeetCode 438. Find All Anagrams in a String--字符串-滑动窗口--C++,Python解法
  2. android开发--ListView中的getView原理
  3. oracle 不查加锁的记录,oracle 锁查询 select加锁方法
  4. Robert算子的运用
  5. python notebook使用,Jupyter Notebook使用笔记
  6. 如何看懂dtd文档?
  7. 报错 classes 拒绝访问_3种方式“移除”快速访问;为什么移除?你懂的...
  8. 今年第一个项目来说NET的中间语言
  9. 基于分位数回归的静态CoVaR计算 案例与代码
  10. 《JavaScript 高级程序设计(第四版)》
  11. 从32位应用程序到64位应用程序
  12. html/css插入base64背景图片
  13. 用 RIME 定制输入法
  14. 用crontab每隔1分钟执行一个命令行脚本
  15. phpstorm官方下载地址
  16. 【Unity】【Android】问题记录
  17. 专题·置换【including 置换,置换快速幂,洛谷·[HNOI2001]洗牌机
  18. 服务器装系统引导进去系统usb失灵,重装win7后usb全部失灵原因分析以及解决方法(完美解决)...
  19. 数学乐 --- 奇函数与偶函数(个人学习笔记)
  20. 人脸识别——FaceBook的DeepFace、Google的FaceNet、DeepID

热门文章

  1. java中输出红字_使用JDIC实现Java界面嵌入Web浏览器 出红字
  2. 全网首发:LINUX(UOS)对GTK/X11的窗口的差异
  3. 软件基本功:做自说明的测试文档,
  4. 文件比较,忽略目录引起编译出错
  5. crypto_policy_set_aes_cm_128_hmac_sha1_32/crypto_policy_set_aes_cm_128_hmac_sha1_80找不到
  6. 编译OpenJDK:invalid configuration Files: machine Files not recognized
  7. 非家用的监控摄像头都无复位功能
  8. 苹果提交版本后显示”缺少出口合规证明“的解决办法
  9. eclipse缺少org.apache.http.legacy的解决办法
  10. jquery 获取整个表单_15个表单验证jQuery插件和库