一聚教程网:一个值得你收藏的教程网站

最新下载

热门教程

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所没有的优势。而且框架本身有代码,看起来容易理解。


01.png


------------------------------------------------------------------web.xml-----------------------------------------------------------------------------------------





  SpringMVCTest3

 

    index.html

    index.htm

    index.jsp

    default.html

    default.htm

    default.jsp

 
 

 

 



springDispatcherServlet

org.springframework.web.servlet.DispatcherServlet





contextConfigLocation

classpath:spring.xml



1



 



springDispatcherServlet

/







HiddenHttpMethodFilter

org.springframework.web.filter.HiddenHttpMethodFilter





HiddenHttpMethodFilter

/*






---------------------------------------------------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 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){

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) {

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) {

map.put("users", userDao.getUsers());

return "list";

}

}

-------------------------------------------dao.UserDao.java------------------------------------------------------------

package dao;

//@Repository注解:它用于将数据访问层 (DAO 层 ) 的类标识为 Spring Bean

@Repository

public class UserDao {

private static Map users;

 

@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 getUsers() {

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 addresses;

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"%>









Insert title here







没有任何员工信息















































idnameagesexaddresseditdelete
${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" %>









Insert title here









name:












age:


<%

HashMap sex = new HashMap();

sex.put("0", "女");

sex.put("1", "男");

request.setAttribute("sex", sex);

%>

sex:


address:select path="address.id" items="${addresses }" itemLabel="name" itemValue="id"/>









============================================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 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
     */
    @RequestMapping(value = "list.do")
    public ModelAndView doList(HttpServletRequest request, HttpServletResponse response){
        ModelAndView mav = new ModelAndView(listView);
         
        //提取客户端可能传送的过滤条件和排序条件
        Map filterMap = WebUtils.getParametersStartingWith(request, "search_");
        Map 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 result = (ScrollResult) 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 filterMap, Map sortMap){};
     
    /**
     * 分页查询(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 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();
        }
    }
}

热门栏目