一、请求绑定说明
(1)、绑定机制
表单提交的数据都是key=value
格式的,如username=haha&password=123。SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。要求提交表单的name和参数的名称是相同的,且区分大小写。
(2)@requestParam注解:参数别名
@RequestParam注解作用在方法参数上,把请求中指定名称的参数给处理器方法中的形参赋值,相当于给处理器方法起别名.其属性如下:
name: value属性的别名,指定请求参数的名称
required: 指定该请求参数是否必须的,默认为true
<a href="testRequestParam?param1=value">测试requestParam注解</a>
@RequestMapping("/testRequestParam")
public String handlerMethod(@RequestParam("param1") String username) {
// 方法体...
}
(3)支持数据类型
基本类型参数:包括String
POJO 类型参数:实体类
数组和集合类型参数:
实体类中包含其它类:
提交表单数据时,传送的数据需要与JavaBean中的字段相匹配。如果该类中包含其他类(引用对象),表单的Name的值需要写成
实体类中引用对象名.引用对象内的字段名
的格式进行提交。
//实体类中的字段
private Student student;
<!--提交数据格式-->
<a href="param/dxcc?sname=希望小学&student.name=张三&student.class=高软三班">对象传参</a>
实体类中包含List和Map集合
- List存值格式:
当List集合内存入实体类时:实体类中引用对象名[index].字段名
当List集合内存入String时:实体类中引用对象名[index]=xxx
若直接用List集合作为方法形参,会报初始化错误,因为List是接口没有构造方法;解决方案可以给形参用@requestParam()方法设置形参别名。 - Map存值格式:
若key和value都为String类型与List同理,但这里value存入的是实体类实体类中引用对象名[“name”].字段名
//实体类中集合
List<Student> studentList;
Map<String,Student> studentMap;
提交数据方式
<a href="param/dxcc?studentList[0].stuname=张三&studentList[0].stuclass=高软三班">对象内有List</a>
<a href="param/dxcc?studentMap['one'].stuname=李四&studentMap['one'].stuclass=高软四班">对象内有Map</a>
二、基础案例
SpringMVC中会将10传给findAccount方法的accountID参数传递给HandlerAdapter执行.
<a href="account/findAccount?accountId=10">查询账户</a>
中请求参数是:
accountId=10
/**
* 查询账户
* @return
*/
@RequestMapping("/findAccount")
public String findAccount(Integer accountId) {
System.out.println("查询了账户:"+accountId);
return "success";
}
三、Post方式提交后出现乱码
在web.xml中配置编码转换过滤器,即可解决请求参数中文乱码的问题
<!-- 配置编码转换过滤器 -->
<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filterclass>
<!-- 指定字符集 -->
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<!-- 过滤所有请求 -->
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
四、自定义数据类型参数绑定
表单提交的任何数据类型全部都是字符串类型,但是后台定义Integer类型,数据也可以封装上,说明Spring框架内部会默认进行数据类型转换。
当然若有需要,也可以自定义数据类型转换器 如涉及到数据日期的转换,只需实现Converter
的接口
1、在工程的java
目录下创建控制器类cn.maoritian.util.StringToDateConverter
类,实现Converter<String, Date>
接口,完成从String类到Date类的转换:
// 自定义的类型转换器,完成从String类到Date类的转换
public class StringToDateConverter implements Converter<String, Date> {
public Date convert(String source) {
try {
DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
Date date = df.parse(source);
return date;
} catch (Exception e) {
throw new RuntimeException("类型转换错误");
}
}
}
2、注册自定义类型转换器,在springmvc.xm
l配置文件中编写配置
<!-- 配置的类型转换器工厂 -->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
<property name="converters">
<set>
<!-- 诸如我们自定义的类型转换器 -->
<bean class="cn.maoritian.utils.StringToDateConverter"/>
</set>
</property>
</bean>
五、通过原始ServletAPI对象处理请求
SpringMVC
支持使用原始ServletAPI
作为控制器方法的参数,包括HttpServletRequest
,HttpServletResponse
,HttpSession
对象,他们都可以直接用做控制器方法的参数.示例如下:
@RequestMapping("/path")
public void myHandler(HttpServletRequest request, HttpServletResponse response) throws IOException {
System.out.println(request.getParameter("param1"));
System.out.println(request.getParameter("param1"));
response.getWriter().println("<h3>操作成功</h3>");
}
#附加完整代码流程
实体类
package com.java.entity;
import java.util.List;
import java.util.Map;
public class School {
private String sname;
private Student student;
List<Student> studentList;
Map<String,Student> studentMap;
//省略Setter和Getter方法....
@Override
public String toString() {
return "School{" +
"sname='" + sname + '\'' +
", student=" + student +
", studentList=" + studentList +
", studentMap=" + studentMap +
'}';
}
}
hello.jsp
<body>
<a href="param/chuancan?name=张三&password=123">直接传参</a>
<br/>
<a href="param/dxcc?sname=希望小学&student.name=张三&student.class=高软三班">对象传参</a>
<br/>
<a href="param/dxcc?studentList[0].stuname=张三&studentList[0].stuclass=高软三班&studentMap['one'].stuname=李四&studentMap['one'].stuclass=高软四班">对象内有集合传参</a>
</body>
controller.java
package com.java.controller;
import com.java.entity.School;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
@Controller
@RequestMapping("/param")
public class ParamController {
@RequestMapping("/chuancan")
public String chuancan(String name,String password){
System.out.println("name="+name);
System.out.println("password="+password);
return "success";
}
@RequestMapping("/dxcc")
public String chuancan(School school){
System.out.println(school);
return "success";
}
}