- 浏览: 1051116 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (1355)
- test (75)
- 红茶和绿茶 (1)
- Jave SE (206)
- Oracle (19)
- English (177)
- Log4j (5)
- RIA(Rich Internet Applications) (9)
- Ext Js (6)
- Android (14)
- Logo (0)
- 文字采撷 (287)
- 使用技巧 (92)
- Project Management (22)
- Hibernate (12)
- Struts (5)
- 规则引擎 (1)
- Html & Javasctipt (56)
- Spring MVC (10)
- Maven (17)
- Java Test (17)
- Linux (16)
- Tools (1)
- CV (0)
- Middleware (2)
- HTML5 (2)
- Algorithms (4)
- Web Service (15)
- 留学 (15)
- LADP (5)
- PXCOA (0)
- SysLog (6)
- SSO (3)
- Spring Security (4)
- Spring Batch (1)
- Jmail (1)
- Bible (4)
- Java Thread (5)
- Architect (6)
- github (2)
- Java Swing (12)
- NoSQL (7)
- UML (2)
- 敏捷(Agile) (7)
- Hudson+Maven+SVN (15)
- cloud computing (2)
- Bahasa Indonesia (1)
- jBPM (6)
- 民俗知识 (3)
- Consulting (1)
- Mysql (5)
- SAP (1)
- 微信公众平台接口开发 (3)
- 做生意 (1)
- 西餐 (1)
- Banking (1)
- Flex (0)
- 黄金投资 (1)
- Apache Tomcat 集群 (3)
- Hadoop (7)
- 需求分析 (1)
- 银行知识 (3)
- 产品管理 (2)
- 钢琴Music (3)
- 设计 (3)
- Marketing (2)
- US Life (3)
- 算法 (14)
- BigData (4)
- test红茶和绿茶Jave SEOracleEnglishLog4jRIA(Rich Internet Applications)Ext JsAndroidLogo文字采撷 (0)
- Design Pattern (5)
- NodeJS&AngularJS (9)
- Python (1)
- Spring boot (0)
- ACM (3)
最新评论
-
心往圣城:
微时代-最专业的微信第三方平台。LBS定位导航,微网站,自定义 ...
微信公众平台 /微信公众平台怎么用 -
zhaojiafan:
return ReverseStr1(str.substrin ...
逆转字符串 Write a String Reverser (and use Recursion!) -
zhaojiafan:
public class StringUtils {
p ...
逆转字符串 Write a String Reverser (and use Recursion!)
基于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 IOC AOP
2015-06-01 09:38 537http://blog.csdn.net/archie20 ... -
Spring 系列: Spring 框架简介
2015-05-29 14:12 697Spring 是一个开源框架,是为了解决企业应用程序开发复杂 ... -
spring mvc注解例子
2012-02-10 11:51 1638弃用了struts,用spring mvc框架做了几个 ... -
Spring mvc 使用多种viewResolver
2012-01-13 12:00 1145<!-- 声明viewResolver --> ... -
Spring web MVC 框架学习笔记 之 ViewResolver技术
2012-01-13 11:36 1019上次的文章中介绍了Mo ... -
https://collaboration.accenture.com/afpj/
2012-01-12 19:14 0https://collaboration.accenture ... -
JAVA私塾最新Spring3的PPT_IoC
2012-01-10 18:11 0JAVA私塾最新Spring3的PPT_IoC部分_ -
SpringMVC_使用
2012-01-10 17:25 913SpringMVC_使用 1.@RequestM ... -
Spring注解_详解
2012-01-10 17:20 856Spring注解_详解 Spring注解_详解 ... -
Spring MVC
2012-01-10 14:42 739http://www.ideawu.net/person/sp ... -
spring mvc注解实现
2012-01-10 14:38 741spring mvc注解实现
相关推荐
Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序,它提供了模型-视图-控制器(MVC)架构的支持。在本文中,我们将深入探讨如何实现一个完整的Spring MVC CRUD(创建、读取、更新、删除)操作实例。首先...
Spring MVC 是一个基于Java的轻量级Web应用框架,它为开发者提供了模型-视图-控制器(MVC)架构,使开发人员能够更好地组织和分离应用程序的业务逻辑、数据处理和用户界面。Spring MVC是Spring框架的一个核心组件,...
Spring MVC是Spring框架的一个模块,专门用于处理Web应用程序的模型-视图-控制器(MVC)架构。它提供了一个灵活的机制来分离业务逻辑、用户界面和数据访问,使得代码更易于维护和测试。 Hibernate是一个对象关系...
这是一个基于Spring MVC、Spring Data、Thymeleaf和MySQL数据库构建的简单Web应用程序工程。这个项目的核心在于利用这些技术栈来实现数据的CRUD(创建、读取、更新和删除)操作,并通过Web界面进行交互。 **Spring ...
在本资源"第四部分、Spring MVC完成CRUD.rar"中,我们主要探讨的是Spring MVC框架在实际项目开发中的应用,特别是在实现CRUD(创建、读取、更新、删除)操作中的详细过程。Spring MVC是Java Web开发中常用的一个模块...
2. Spring MVC的控制器定义、模型绑定、视图解析,以及处理HTTP请求的方法。 3. MyBatis的配置,SQL映射文件的编写,以及如何通过MyBatis的SqlSession执行SQL语句。 4. 数据库设计和实体类创建,以及它们与MyBatis的...
它提供了一种模型-视图-控制器(MVC)架构,简化了开发过程,使得开发者可以专注于业务逻辑而不必过于关注底层细节。Spring MVC 的核心组件包括 DispatcherServlet、Controller、Model、View 和 ViewResolver。 1. ...
在这个视频教程中,你可能将学习到如何配置Spring的XML上下文文件以启用注解驱动的配置,如何在Spring MVC中创建注解式的控制器并处理HTTP请求,以及如何通过Hibernate的注解来设计数据模型并执行CRUD操作。...
Spring MVC 提供了一系列有用的注解来简化控制器类的定义和请求处理。 #### 常用注解: - **`@RequestMapping`**:用于映射请求 URL 至特定的控制器方法或类。 - **`@PathVariable`**:用于绑定 URI 模板变量值。 ...
首先,Spring MVC作为系统的主要框架,承担着模型-视图-控制器(MVC)的设计模式实施。Spring MVC通过解耦各个组件,使开发者能够更专注于业务逻辑的实现,同时提供灵活的扩展性。它通过DispatcherServlet接收请求,...
1. **DispatcherServlet**:这是Spring MVC的前端控制器,负责接收HTTP请求并分发到相应的处理器。 2. **配置文件**:在`web.xml`中配置DispatcherServlet,指定Spring MVC的配置文件路径,如: ```xml ...
首先,Spring MVC是Spring框架的一部分,它是一个用于构建Web应用程序的模型-视图-控制器(MVC)架构。Spring MVC通过提供分层架构,使得开发者可以更清晰地组织代码,同时降低了组件之间的耦合度。它支持RESTful...
Spring MVC是Spring框架的一部分,用于构建Web应用,通过分离模型、视图和控制器,实现了清晰的职责划分。 **2. JPA与Hibernate** JPA是Java EE平台的一部分,定义了Java应用如何与关系数据库交互的规范。它提供了...
Spring MVC是Spring框架的一部分,它为构建基于Java的Web应用程序提供了一个模型-视图-控制器(MVC)架构。这本书深入浅出地介绍了如何有效地使用Spring MVC进行开发,以下是一些核心知识点的详细说明: 1. **...
Spring MVC作为Spring的Web层,负责处理HTTP请求和响应,提供模型-视图-控制器的设计模式。MyBatis则是一个轻量级的数据访问层,将SQL语句与Java代码解耦,提高了数据库操作的灵活性。 学生籍贯管理系统的核心目标...
Spring MVC是Spring框架的一个模块,专门用于构建Web应用程序的前端控制器。它提供了模型-视图-控制器(MVC)架构模式的实现,使得业务逻辑与用户界面分离,提高了代码的可测试性和可维护性。Spring MVC通过注解如@...