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";
}