需要注意的是,该过滤器只对post生效,如果是get乱码则还是需要修改tomcat的server.xml或是通过代码从ISO-8859-重新编码为UTF-8
String username = request.getParameter("username"); username = new String(username.getBytes("iso8859-1"), "utf-8"); //重新编码 参数类型转换我们将edit.jsp中的开课标签取消注释,然后测试会发现系统给出了400异常,查看控制台可以看到以下信息:
意思是框架无法将String类型的请求参数转换为需要的Date类型,这就需要,这是因为日期格式多种多样,每个地区不同,所以这需要我们自己来实现转换;
编写转换器实现convert接口即可作为转换器,该接口的两个两个泛型表示输入源类型和输出目标类型;
public class StringToDateConverter implements Converter<String, Date> { @Override public Date convert(String s) { SimpleDateFormat sm = new SimpleDateFormat("yyyy-MM-dd"); try { return sm.parse(s); } catch (ParseException e) { e.printStackTrace(); } return null; } } mvc配置文件 <bean> <property> <set> <bean/> </set> </property> </bean> <mvc:annotation-driven conversion-service="conversionService"/> 使用注解注册转换器使用@DateTimeFormat可以实现上面xml相同的配置:
public class Course { private Integer id; private String name; private String teachName; @DateTimeFormat(pattern = "yyyy-MM-dd") private Date startTime; }注意:注解作用在实体类对应的属性上,且配置文件必须添加<mvc:annotation-driven>
包装类型映射当需要将参数映射到实体类的关联对象中时,也称为包装类型;
例如:在课程对象中有一个用户对象,表示这是某个用户的课程;前台需要同时传递课程对象的属性,和用户对象的属性,后台就需要要用一个包装类型来接收,即一个包装了用户对象的课程对象; 再说的简单点,即课程对象中包含一个用户对象;
在前台需要指出关联对象的属性名称,如:用户.name
实体:
public class Course { private Integer id; private String name; private String teachName; private Date startTime; private Integer score; private Integer hours; private User user;//新添加的User类属性 set/get....handler:
@RequestMapping("/updateCourse.action") public String update(Course course) { courseService.updateCourse(course); return "/courseList.action"; }jsp:
<form action="updateCourse.action" method="post"> <input value="${course.id}" hidden="hidden"/> <input value="${course.name}"/> <input value="${course.teachName}"/> <input type="date" value='<fmt:formatDate value="${course.startTime}" pattern="yyyy-MM-dd"/>'/> <input type="number" value="${course.score}"/> <input type="number" value="${course.hours}"/> <input/> <!-- 新添加的参数--> <input type="submit"> </form> 数组参数映射一些情况下,某一参数可能会有多个值,例如要进行批量删除操作,要删除的id会有多个,那就需要将参数映射到一个数组中;HttPServletRequest原本就支持获取数组参数,SpringMVC仅是帮我们做了一个类型转换;
1.修改页面添加多选框:
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %> <html> <head> </head> <body> <form action="deleteCourses"> <table> <tr> <th>选择</th> <th>名称</th> <th>讲师</th> <th>开课日期</th> <th>学分</th> <th>课时</th> <th>操作</th> </tr> <c:forEach items="${courses}" var="course"> <tr> <td> <input type="checkbox" value="${course.id}"> </td> <td>${course.name}</td> <td>${course.teachName}</td> <td> <fmt:formatDate value="${course.startTime}" pattern="yyyy-MM-dd"/> </td> <td>${course.score}</td> <td>${course.hours}</td> <td> <a href="http://www.likecs.com/editCourse?id=${course.id}">修改</a> </td> </tr> </c:forEach> </table> <input type="submit" value="批量删除"> </form> </body> </html>2.handler方法:
@RequestMapping("/deleteCourses") public String deleteCourses(Integer[] ids){ courseService.deleteCourses(ids); return "/getCourses"; }3.service方法:
public void deleteCourses(Integer[] ids) { for (Integer id : ids){ courseMapper.deleteByPrimaryKey(id); } } list映射当请求参数包含多个对象的属性数据,是需要使用list来接收,通常用在批量修改批量添加等;
list映射要求参数名称为对象属性[下标].属性名称,同时handler中使要用包装类型来接收;
以下是实现一个批量修改课程信息的功能;