最新下载
热门教程
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
java框架SpringMVC对User表进行CRUD操作实例
时间:2015-07-16 编辑:简简单单 来源:一聚教程网
spring MVC 介绍
Spring MVC属于SpringFrameWork的后续产品,已经融合在Spring Web Flow里面。Spring 框架提供了构建 Web 应用程序的全功能 MVC 模块。使用 Spring 可插入的 MVC 架构,从而在使用Sring进行WEB开始时,可以选择使用Spring的SpringMVC框架或集成其他MVC开发框架,如Struts1,Struts2等。
通过策略接口,Spring 框架是高度可配置的,而且包含多种视图技术,例如 JavaServer Pages(JSP)技术、Velocity、Tiles、iText和POI。Spring MVC 框架并不知道使用的视图,所以不会强迫您只使用 JSP 技术。Spring MVC 分离了控制器、模型对象、分派器以及处理程序对象的角色,这种分离让它们更容易进行定制。
Lifecycle for overriding binding, validation, etc,易于同其它View框架(Tiles等)无缝集成,采用IOC便于测试。
它是一个典型的教科书式的mvc构架,而不像struts等都是变种或者不是完全基于mvc系统的框架,对于初学者或者想了解mvc的人来说我觉得 spring是最好的,它的实现就是教科书!第二它和tapestry一样是一个纯正的servlet系统,这也是它和tapestry相比 struts所没有的优势。而且框架本身有代码,看起来容易理解。
------------------------------------------------------------------web.xml-----------------------------------------------------------------------------------------
---------------------------------------------------spring.xml-------------------------------------------------------------
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.2.xsd">
---------------------------------------------------------------------------------------------------comtroller.UserHandler.java--------------------------------------------
package controller;
//@Controller注解:将该类表示为控制器
@Controller
public class UserHandler {
// @Autowired它可以对类成员变量、方法及构造函数进行标注,完成自动装配的工作。 通过 @Autowired的使用来消除 set,get方法。
@Autowired
private UserDao userDao;
@Autowired
private AddressDao addressDao;
/**
* 有 @ModelAttribute标记的方法,会在每个目标方法执行之前被SpringMVC调用。
* @RequestParam(value="id", required=false)表单中的参数,required表示是否必须
*/
@ModelAttribute
public void setUser(@RequestParam(value="id", required=false)Integer id, Map
if(id != null){
map.put("user", userDao.getUser(id));
}
}
/**
* 修改保存操作
*
* @RequestMapping("/addUser")使用requestMapping来映射URL method对应的请求方式
*/
@RequestMapping(value="/saveUser", method=RequestMethod.PUT)
public String updateUser(User user){
userDao.saveUser(user);
return "redirect:/getUsers";
}
/**
* 编辑修改操作
*
* @RequestMapping("/addUser")使用requestMapping来映射URL method对应的请求方式
* @PathVariable("id")路径URL中的参数信息
*/
@RequestMapping(value="/editUser/{id}", method=RequestMethod.GET)
public String editUser(@PathVariable("id") Integer id, Map
map.put("addresses", addressDao.getAddresses());
map.put("user", userDao.getUser(id));
return "add";
}
/**
* 删除操作
*
* @RequestMapping("/addUser")使用requestMapping来映射URL method对应的请求方式
* @PathVariable("id")进行接受参数
*/
@RequestMapping(value="/deleteUser/{id}", method=RequestMethod.DELETE)
public String deleteUser(@PathVariable("id") Integer id){
userDao.deleteUser(id);
//删除后进行显示操作
return "redirect:/getUsers";
}
/**
* 保存操作
*
* @RequestMapping("/addUser")使用requestMapping来映射URL method对应的请求方式
*/
@RequestMapping(value = "/saveUser", method = RequestMethod.POST)
public String saveUser(User user) {
userDao.saveUser(user);
// 保存完成后进入到显示操作
return "redirect:/getUsers";
}
/**
* 进入到添加操作页面
*
* @RequestMapping("/addUser")使用requestMapping来映射URL method对应的请求方式
*/
@RequestMapping(value = "/addUser", method = RequestMethod.GET)
public String addUser(Map
map.put("addresses", addressDao.getAddresses());
// 对应struts1里边的from表单对象
map.put("user", new User());
return "add";
}
/**
* 显示操作
*
* @RequestMapping("/addUser")使用requestMapping来映射URL method对应的请求方式
*/
@RequestMapping("/getUsers")
public String getUses(Map
map.put("users", userDao.getUsers());
return "list";
}
}
-------------------------------------------dao.UserDao.java------------------------------------------------------------
package dao;
//@Repository注解:它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean
@Repository
public class UserDao {
private static Map
@Autowired
private AddressDao addressDao;
static {
users = new HashMap
users.put(1, new User(1, "a", 11, 1, new Address(101, "beijing")));
users.put(2, new User(2, "b", 22, 0, new Address(102, "shanghai")));
users.put(3, new User(3, "c", 33, 1, new Address(103, "guangzhou")));
}
private static Integer initId = 4;
public void saveUser(User user) {
if (user.getId() == null) {
user.setId(initId++);
}
user.setAddress(addressDao.getAddress(user.getAddress().getId()));
users.put(user.getId(), user);
}
public Collection
return users.values();
}
public User getUser(Integer id) {
return users.get(id);
}
public User deleteUser(Integer id) {
return users.remove(id);
}
}
-------------------------------------------------------------dao.AddressDao.java-------------------------------------------------------------------
package dao;
@Repository
public class AddressDao {
private static Map
static {
addresses = new HashMap
addresses.put(101, new Address(101, "beijign"));
addresses.put(102, new Address(102, "shanghai"));
addresses.put(103, new Address(103, "guangzhou"));
}
public Collection getAddresses() {
return addresses.values();
}
public Address getAddress(Integer id) {
return addresses.get(id);
}
}
-----------------------------------------domain------------------------------------------------
package domain;
public class Address {
private Integer id;
private String name;
}
----------------------------
package domain;
public class User {
private Integer id;
private String name;
private Integer age;
private Integer sex;
private Address address;
}
--------------------------------------------views/jsp------------------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
没有任何员工信息id name age sex address edit delete ${user.id } ${user.name} ${user.age} ${user.sex==0?"女":"男" } ${user.address.name} edit
addUser
---------------------------------------------------------------------------
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page import="java.util.HashMap"%>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
name:
age:
<%
HashMap
sex.put("0", "女");
sex.put("1", "男");
request.setAttribute("sex", sex);
%>
sex:
address:
============================================SpringMVC form标签===============================================================
基于Spring MVC的CRUD控制器
基于SpringMVC,实体的Controller只要继承该类即刻拥有增删改查的的方法。
比如:
@Controller
@RequestMapping("/role")
RoleController extends CrudController
只要简单的继承就可以通过/role/save.do、/role/remove.do等方式来管理实体,如果有更多复杂的业务操作,可以重写父类的回调函数,类似于面向切面编程。
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
* 建议子类重写回调函数
*
* 保存或更新实体:save.do
* 删除实体:remove.do
* 查询单个实体信息:show.do
*
* @author EwinLive@gmail.com
* @date 2011-2-23
* @version 1.0
*/
public abstract class CrudController
@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
@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
*/
@RequestMapping(value = "list.do")
public ModelAndView doList(HttpServletRequest request, HttpServletResponse response){
ModelAndView mav = new ModelAndView(listView);
//提取客户端可能传送的过滤条件和排序条件
Map
Map
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
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
/**
* 分页查询(list.do)回调函数,该方法在返回视图之前调用。可以继续添加返回信息。
* @param request
* @param response
* @param mav
*/
protected void afterList(HttpServletRequest request, HttpServletResponse response, ModelAndView mav){};
/**
* 定向到新增实体的表单界面
* 回调函数: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){};
/**
* 保存实体
* 回调函数: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;
}
/**
* 批量删除实体
* 回调函数: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){};
/**
* 查询实体信息
* 回调函数: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
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();
}
}
}
相关文章
- SpringBoot测试配置属性与web启动环境解析 10-24
- vue中将el-switch值true、false改为number类型的1和0解析 10-24
- Vue中的路由配置项meta使用解读 10-24
- SpringBoot自定义bean绑定解析 10-24
- SpringBoot常用计量与bean属性校验和进制数据转换规则解析 10-24
- 工厂方法在Spring框架中的运用介绍 10-24