一、请求绑定说明
(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.xml配置文件中编写配置

<!-- 配置的类型转换器工厂 -->
<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";
    }

}