1 总述:

分层:  

  • 表现层:index.jsp  list.jsp   input.jsp        
  •  MVC控制器层:EmployeeHandler          
  •  业务逻辑层:无
  •  DAO层:EmployeeDao、DapartmentDao          
  •   DO 层:Employee、Department        
  •   数据库:无    

2 具体实现步骤

2.1   配置web应用的web.xml 文件(需要注意的地方是:需要配置一个过滤器HidderHttpMethodFilter,把 POST 请求转为 DELETE、PUT 请求)

浏览器form表单只支持GET与POST请求,而DELETE、PUT等method并不支持,spring3.0添加了一个过滤器,可以将这些请求转换为标准的http方法,使得支持GET、POST、PUT与DELETE请求,该过滤器为HiddenHttpMethodFilter,只需要在表单中添加一个隐藏字段"_method",如:<form action="" method="POST"><input type="hidden" name="_method" value="DELETE"/></form>

<!-- 配置 HiddenHttpMethodFilter: 把 POST 请求转为 DELETE、PUT 请求 -->
	<filter>
		<filter-name>HiddenHttpMethodFilter</filter-name>
		<filter-class>org.springframework.web.filter.HiddenHttpMethodFilter</filter-class>
	</filter>
	
	<filter-mapping>
		<filter-name>HiddenHttpMethodFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
@RequestMapping(value="/emps",method=RequestMethod.GET)
	public String list(Map<String, Object>map,HttpServletRequest request) {
		System.out.println("请求方式 :"+request.getMethod());
		System.out.println("查看所有员工信息");
		map.put("employees", employeeDao.getEmployees());
		return "list";
	}

 

2.2    配置springmvc.xml 文件:需要注意的是后面会用到将GET请求转换为DELETE请求的JS静态资源,因此还要配置能处理静态资源的默认Servlet:当检测到请求没有经过映射时,那么它会将其交给服务器默认的Servlet来处理(亦即以下配置的那个),如果不是静态资源的请求,才又交回dispatcherServlet继续处理

<!--配置默认的dispatcherServlet-->
    <mvc:default-servlet-handler></mvc:default-servlet-handler>//默认servlet名称为default,如果不是可显式指定

2.3  EmployeeHandler:

(1) "/emps" GET

GET请求显示所有员工信息: 映射"/emps"请求,通过Dao层获得数据,并将数据添加到模型中传到显示界面 list.jsp

@RequestMapping(value="/emps",method=RequestMethod.GET)
	public String list(Map<String, Object>map,HttpServletRequest request) {
		System.out.println("请求方式 :"+request.getMethod());
		System.out.println("查看所有员工信息");
		map.put("employees", employeeDao.getEmployees());//将数据添加到模型中传到显示界面 list.jsp
		return "list";//转发到list.jsp页面
	}

list.jsp中可通过访问requestScope中的employees属性来获得数据

<c:forEach var="employee" items="${requestScope.employees}">

(2)"/emp/{id}"    DELETE

DELETE请求删除指定数据,并重新回显删除后的所有员工信息:EmployeeHandler从请求中获得占位符{id},通过id和EmployeeDao操纵数据库(模拟)将对应id的记录删除,并重新通过Dao层读取数据,重定向到显示界面,并添加员工信息到模型中

@RequestMapping(value="/emp/{id}",method=RequestMethod.DELETE)
	public String delete(@PathVariable("id")Integer id, Map<String, Object>map,HttpServletRequest request) {
		System.out.println("请求方式 :"+request.getMethod());
		System.out.println("删除记录 : ID :"+id);
		employeeDao.removeEmployee(id);
		map.put("employees", employeeDao.getEmployees());
		return "redirect:/emps";
	}

 (3) "/emp"    POST    

POST请求增加相应数据,并重新回显增加后的所有员工信息:在list.jsp通过GET请求访问编辑页面(注:增加与修改共用此页面),EmployeeHandler转发至input.jsp,并给模型传递空的Employee对象,EmployeeHandler处理“emp”POST 的请求,通过POJO (Employee employee)来得到请求参数,通过Dao更新数据并重定向至list.jsp页面

注意:这里使用的是springmvc的form表单,两个突出作用:

  •         自动绑定请求处理方法中添加响应的模型属性值到当前form声明的modelAttribute中,而且可以在表单中直接使用该modelAttribute对象的属性值,可以很方便地实现表单回显和编辑
  •          支持四种提交方法(普通的form只支持两种提交方法
@RequestMapping( value="/emp",method=RequestMethod.POST)
	public String addEmployee( Employee employee,HttpServletRequest request) {
		System.out.println("请求方式 :"+request.getMethod());
		System.out.println("添加新员工"+employee);
employee.setDepartment(departmentDao.getDepartment(employee.getDepartment().getId()));employeeDao.addEmployee(employee);return "redirect:emps";}

 

(4) "/emp"  PUT

POST请求修改相应数据,并重新回显修改后的所有员工信息:在list.jsp通过  "emp/{id}" GET 请求访问编辑页面(注:增加与修改共用此页面),EmployeeHandler转发至input.jsp,并给模型传递相应idEmployee对象,input.jsp页面中便可很方面地实现数据回显,通过“_method”属性值的设定将提交方法设置为PUT,EmployeeHandler处理“emp”PUT 的请求。值得注意的地方在于:要求不得修改id和lastName属性,所以<form:hidden path="id"/>来提交id属性,但没有使用该方法提交lastName属性,所以处理方法的  POJO Employee 参数先经过@ModelAttribute的对应属性来设定,再把表单中的请求参数赋给它之后再入参,通过Dao更新数据并重定向至list.jsp页面

//通过设置参数名为“attributeEmployee”来避免对其他处理方法中的Employee对象造成影响
	@ModelAttribute
	public void getEmployee(@RequestParam(value="id",required=false) Integer id,
			Map<String, Object> map) {
		if(id != null){
			map.put("attributeEmployee", employeeDao.getEmployee(id));
		}
		System.out.println("AttributeEmployee: "+employeeDao.getEmployee(id));
	}
@RequestMapping(value="/emp",method = RequestMethod.PUT)
	public String UpdateJsp(@ModelAttribute("attributeEmployee") Employee employee,HttpServletRequest request) {
		System.out.println("请求方式 :"+request.getMethod());
		System.out.println("修改员工信息为"+employee);
		employee.setDepartment(departmentDao.getDepartment(employee.getDepartment().getId()));
		employeeDao.updateEmployee(employee);
         return "redirect:/emps";
	}