- 浏览: 1003631 次
- 性别:
- 来自: 广州
文章分类
- 全部博客 (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 507http://blog.csdn.net/archie20 ... -
Spring 系列: Spring 框架简介
2015-05-29 14:12 671Spring 是一个开源框架,是为了解决企业应用程序开发复杂 ... -
spring mvc注解例子
2012-02-10 11:51 1609弃用了struts,用spring mvc框架做了几个 ... -
Spring mvc 使用多种viewResolver
2012-01-13 12:00 1118<!-- 声明viewResolver --> ... -
Spring web MVC 框架学习笔记 之 ViewResolver技术
2012-01-13 11:36 990上次的文章中介绍了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 894SpringMVC_使用 1.@RequestM ... -
Spring注解_详解
2012-01-10 17:20 836Spring注解_详解 Spring注解_详解 ... -
Spring MVC
2012-01-10 14:42 708http://www.ideawu.net/person/sp ... -
spring mvc注解实现
2012-01-10 14:38 718spring mvc注解实现
相关推荐
根据,仅HTML和CSS的站点带有Java的控制器,仅包含主要的Java文件。 现场网站可以在这里看到收藏-Henrique通过的课程的Spring MVC项目,在Spring Tools Suite中完成。 带有STS文件的完整项目(如果已安装Spring ...
Spring mvc - 它提供了模型-视图-控制器架构和现成的组件,可用于开发灵活且松散耦合的 Web 应用程序,并公开其他服务。 缓存 - ehcache 网络技术 - jsp、javascript 服务器 - Apache Tomcat 日志记
1、拦截器基于动态代理 , 过滤器基于函数回调 2、拦截器不依赖于servlet容器,通过动态代理实现,过滤器依赖于servlet容器 3、拦截器在方法前后,异常前后等调用,而过滤器只能在请求前和请求后各调一次。 4、拦截...
运用到的技术:spring+springMVC+jdbctemplate+MVC框架 具体细节: ①查询所有员工列表:jdbcTemplate.query(sql, new RowMapper() {}回调函数的使用 ②添加员工:添加员工之前要先查询出所有部门,因此要先查询所有...
11.6 为一个应用的领域类生成CRUD控制器和视图 454 11.6.1 问题 454 11.6.2 解决方案 454 11.6.3 工作原理 455 11.7 国际化(I18n)信息属性 458 11.7.1 问题 458 11.7.2 解决方案 458 11.7.3 工作原理...
11.6 为一个应用的领域类生成CRUD控制器和视图 454 11.6.1 问题 454 11.6.2 解决方案 454 11.6.3 工作原理 455 11.7 国际化(I18n)信息属性 458 11.7.1 问题 458 11.7.2 解决方案 458 11.7.3 工作原理...
根据MVC模式和RESTful架构实现CRUD请求。使用Spring安全性来维护安全的Web服务(使用登录/注销功能)。 控制器允许Response向邮递员请求返回JSON,并向Web浏览器返回HTTP。 由...制作 伊万·杰拉西缅科(Ivan ...
异常处理 a) 使用控制器建议处理异常 b) 创建自定义异常 使用注解 @Length @NotNull @Range 进行表单验证 使用 springMVC + MongoDB 的基本 CRUD 操作 单元测试:TestNG + Mockito + Spring 测试 测试NG:@Data...
具有服务层和控制器对象的Spring MVC模式。 在带有Hibernate的MySql上进行CRUD操作以及对jdbc查询的注释示例 将Dispatcher Servlet与web.xml一起设置的最佳实践。 配置Spring Security并创建经过身份验证的页面,...
使用的技术是: Java 8作为一种编程语言控制器的Spring MVC 用于验证的Bean验证Spring Data用于数据库中的数据持久性Spring Rest用于创建api rest Google Gson在测试中有助于将Json转换为对象,反之亦然。...
Spring Boot Web应用程序,使用百里香...在本系列教程的这一部分中,我将展示如何设置Spring MVC控制器以支持CRUD操作,如何在具有分页支持的Spring Data JPA存储库上设置Spring服务,以及Web应用程序的Thymeleaf模板。
356)的聊天功能使用Spring Security / MVC通过帐户注册和登录进行访问控制通过Scrypt进行安全的密码哈希处理管理仪表板(wip):使用REST(HAL)服务对帐户表进行CRUD操作:服务器上的Spring Data REST和客户端上的...
1、 Struts是一个为开发基于模型(Model)-视图(View)-控制器(Controller)(MVC)模式的应用架构的开源框架,是利用Servlet,JSP和custom tag library构建Web应用的一项非常有用的技术。由于Struts能充分满足应用开发...
3.2.3 mvc中的控制器(c) 3.2.4 除mvc之外的其他部分 3.3 grails支持多种环境 3.4 数据源配置 3.4.1 支持的数据库 3.4.2 配置自定义方言(dialect) 3.5 引导grails应用程序 ...
#Architecture 3层架构(控制器,服务,存储库)。 #集成该项目取决于CEP 项目公开的CEP搜索REST服务。 #如何启动mvn spring-boot项目:run -Dserver.port = 8080 -Dbusca.cep.url = 将server.port和search....
MVC框架,使用jsp或flr作为视图配置前端控制器作为控制器;业务逻辑层运用了事务脚本模式,并通过AOP实现事务、日志和安全性等功能;持久层使用了Hibernate封装CRUD操作,底层使用druid连接池实现数据存取。 实现...
GoogleAppEngine-JDO-Mavenize 在尝试使用 JDO 对 GAE 进行 mavenize 时,我遇到了很多麻烦。 该项目是备份和 GAE-Maven 示例。 构建并运行 $ mvn clean compile appengine:...Spring MVC 内置简单的 crud 控制器示例
第一部分 Strut 2:一个全新的框架 第1章 Struts 2:现代Web框架 2 1.1 Web应用程序:快速学习 2 1.1.1 构建Web应用程序 2 1.1.2 基础技术简介 3 ...15.6.4 使用Tiles控制器准备网页内容 331 15.7 小结 332