目录
一、@RequestMapping
- 基本的路径映射:直接在方法上面,就可以访问这个路径
- 窄化映射请求:就是一个二级路径的请求
- 在类上声明一个路径,在方法上也声明一个路径
- 实际路径 = 类的路径/方法上的路径
- 多路径映射:@RequestMapping(“user1”,”user2”),使用任意一个都可
- 限制HTTP请求:可以指定接收哪种请求方式的请求
- @RequestMapping(value="/user",method={RequestMethod.POST}
二、参数中文乱码的处理
2.1 Get请求方式乱码
tomcat-->conf-->server.xml-->加上URIEncoding="UTF-8"
<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443"
URIEncoding="UTF-8"/>
2.2 Post请求方式乱码
在web.xml文件中,servlet的配置之前加上如下代码
<!--设置编码-->
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>utf-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
2.3 jdbc设置中文编码
characterEncoding=UTF-8
2.4 数据库编码格式
三、参数绑定
参数绑定实际上就是接收页面请求参数的过程,springMVC对此做了封装
- 原生方法(HttpServletRequest):不用了
- 基本类型和String、char的接收
- 实体类型的接收
- 封装类型的接收
- 集合类型的接收
3.1 基本类型和String、char的接收
方法一:
方法中的参数名和页面的name属性一致即可
方法二:
在参数前加上注解@RequestParam
主要有三个属性,value、required、defaultValue
3.2 实体类型的接收
和上一个差不多,页面中name属性和对象属性名一致
方法中直接为实体类对象
3.3 封装类型的接收
3.4 集合类型的接收
集合的参数绑定分成数组和集合(List、Set、Map)
3.4.1 数组
很典型的实例:批量删除
3.4.2 集合
1、主要应用:批量插入、批量修改。此处举个批量修改的实例
ps:此处是在Teacher表的CRUD基础上改造的批量修改,查询全部之后展示的页面,数据的值是可以批量修改的,然后传过后台的批量修改控制器。
2、核心代码
showTeacher.jsp
<form action="updateMore.do" method="post">
<table border="1">
<tr align="center">
<td>教师ID</td>
<td>教师姓名</td>
<td>教师性别</td>
<td>教师密码</td>
<td>教师年龄</td>
<td>操作</td>
</tr>
<c:forEach items="${teacherList}" varStatus="status" var="teacher">
<tr>
<td><input name="list[${status.index}].tid" value="${teacher.tid}" readonly="readonly"/></td>
<td><input name="list[${status.index}].tname" value="${teacher.tname}"/></td>
<td><input name="list[${status.index}].sex" value="${teacher.sex}"/></td>
<td><input name="list[${status.index}].password" value="${teacher.password}"/></td>
<td><input name="list[${status.index}].age" value="${teacher.age}"/></td>
<td><a href="delete.do?id=${teacher.tid}">删除</a>
<a href="findByTid.do?id=${teacher.tid}">修改</a></td>
</tr>
</c:forEach>
<input type="submit" value="批量修改">
</table>
</form>
TeacherController.java
@RequestMapping("updateMore")
public String updateMore(QueryItem item) throws IOException {
before();
List<Teacher> teacherList = item.getList();
for (Teacher teacher1 : teacherList) {
Teacher teacher=new Teacher();
teacher.setTid(teacher1.getTid());
teacher.setTname(teacher1.getTname());
teacher.setSex(teacher1.getSex());
teacher.setPassword(teacher1.getPassword());
teacher.setAge(teacher1.getAge());
teacherMapper.updateTeacher(teacher);
}
after();
return "redirect:findAll";
}
3、结果演示
四、批量修改的坑
当时写完代码发现点击批量修改之后,后台得到的list为空,一直百思不得其解。
后面发现,页面name属性的值应该是自己构造的封装类,而不是后台传过来域中的值
name属性的值和后台传过来的teacherList无关,页面传递给后台的是封装类的list属性值