`
oywl2008
  • 浏览: 1051116 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

基于Spring MVC的CRUD控制器

 
阅读更多

基于Spring MVC的CRUD控制器

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>{
 @Resource
 private 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();
 
 @InitBinder
 public 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();
  }
 }
}

 

 

http://www.oschina.net/code/snippet_93992_4535

分享到:
评论

相关推荐

    一个完整的Spring MVC的CRUD操作实例

    Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序,它提供了模型-视图-控制器(MVC)架构的支持。在本文中,我们将深入探讨如何实现一个完整的Spring MVC CRUD(创建、读取、更新、删除)操作实例。首先...

    Spring MVC jar包

    Spring MVC 是一个基于Java的轻量级Web应用框架,它为开发者提供了模型-视图-控制器(MVC)架构,使开发人员能够更好地组织和分离应用程序的业务逻辑、数据处理和用户界面。Spring MVC是Spring框架的一个核心组件,...

    基于 Java ssh整合 开源博客系统 spring mvc,hibernate,spring,maven 整合开发

    Spring MVC是Spring框架的一个模块,专门用于处理Web应用程序的模型-视图-控制器(MVC)架构。它提供了一个灵活的机制来分离业务逻辑、用户界面和数据访问,使得代码更易于维护和测试。 Hibernate是一个对象关系...

    基于spring mvc+spring data+Thymeleaf+mysql的简单工程

    这是一个基于Spring MVC、Spring Data、Thymeleaf和MySQL数据库构建的简单Web应用程序工程。这个项目的核心在于利用这些技术栈来实现数据的CRUD(创建、读取、更新和删除)操作,并通过Web界面进行交互。 **Spring ...

    第四部分、Spring MVC完成CRUD.rar

    在本资源"第四部分、Spring MVC完成CRUD.rar"中,我们主要探讨的是Spring MVC框架在实际项目开发中的应用,特别是在实现CRUD(创建、读取、更新、删除)操作中的详细过程。Spring MVC是Java Web开发中常用的一个模块...

    Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)所有实验及实验报告.zip

    2. Spring MVC的控制器定义、模型绑定、视图解析,以及处理HTTP请求的方法。 3. MyBatis的配置,SQL映射文件的编写,以及如何通过MyBatis的SqlSession执行SQL语句。 4. 数据库设计和实体类创建,以及它们与MyBatis的...

    基于Spring MVC的考试系统源码.zip

    它提供了一种模型-视图-控制器(MVC)架构,简化了开发过程,使得开发者可以专注于业务逻辑而不必过于关注底层细节。Spring MVC 的核心组件包括 DispatcherServlet、Controller、Model、View 和 ViewResolver。 1. ...

    spring mvc + spring + hibernate 全注解整合开发视频教程 11

    在这个视频教程中,你可能将学习到如何配置Spring的XML上下文文件以启用注解驱动的配置,如何在Spring MVC中创建注解式的控制器并处理HTTP请求,以及如何通过Hibernate的注解来设计数据模型并执行CRUD操作。...

    Spring MVC框架简介和使用

    Spring MVC 提供了一系列有用的注解来简化控制器类的定义和请求处理。 #### 常用注解: - **`@RequestMapping`**:用于映射请求 URL 至特定的控制器方法或类。 - **`@PathVariable`**:用于绑定 URI 模板变量值。 ...

    基于Spring MVC, Spring, JdbcTemplate的学生信息管理系统.zip

    首先,Spring MVC作为系统的主要框架,承担着模型-视图-控制器(MVC)的设计模式实施。Spring MVC通过解耦各个组件,使开发者能够更专注于业务逻辑的实现,同时提供灵活的扩展性。它通过DispatcherServlet接收请求,...

    spring 与 spring mvc 整合 配置讨论

    1. **DispatcherServlet**:这是Spring MVC的前端控制器,负责接收HTTP请求并分发到相应的处理器。 2. **配置文件**:在`web.xml`中配置DispatcherServlet,指定Spring MVC的配置文件路径,如: ```xml ...

    基于spring mvc、hibernate的小型学生管理的maven

    首先,Spring MVC是Spring框架的一部分,它是一个用于构建Web应用程序的模型-视图-控制器(MVC)架构。Spring MVC通过提供分层架构,使得开发者可以更清晰地组织代码,同时降低了组件之间的耦合度。它支持RESTful...

    基于jpa+hibernate+spring+spring mvc注解方式项目

    Spring MVC是Spring框架的一部分,用于构建Web应用,通过分离模型、视图和控制器,实现了清晰的职责划分。 **2. JPA与Hibernate** JPA是Java EE平台的一部分,定义了Java应用如何与关系数据库交互的规范。它提供了...

    Spring MVC Cookbook(PACKT,2016).pdf

    Spring MVC是Spring框架的一部分,它为构建基于Java的Web应用程序提供了一个模型-视图-控制器(MVC)架构。这本书深入浅出地介绍了如何有效地使用Spring MVC进行开发,以下是一些核心知识点的详细说明: 1. **...

    学生籍贯管理系统,基于Java SSM框架开发(spring、 spring mvc、 mybatis)

    Spring MVC作为Spring的Web层,负责处理HTTP请求和响应,提供模型-视图-控制器的设计模式。MyBatis则是一个轻量级的数据访问层,将SQL语句与Java代码解耦,提高了数据库操作的灵活性。 学生籍贯管理系统的核心目标...

    spring mvc + spring + hibernate 全注解整合开发视频教程 12

    Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序的前端控制器。它提供了模型-视图-控制器(MVC)架构模式的实现,使得业务逻辑与用户界面分离,提高了代码的可测试性和可维护性。Spring MVC通过注解如@...

Global site tag (gtag.js) - Google Analytics