SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。
可以传递的类型有很多:
基本类型:String、Int类型等。
POJO类型:实体类、关联的实体类。
数组和集合类型:List和Map集合等。
基本类型和String类型作为参数
<a href="param/string?username=hehe&password=123">传参</a>--%>
处理请求
@Controller
@RequestMapping("/param")
public class paramController {
@RequestMapping("/string")
public String paramTest(String username, String password) {
System.out.println("username: "+ username);
System.out.println("password: "+ password);
return "hello";
}
实体类和关联类
创建好Account实体类和User实体类,Account中将User类作为成员变量。
传参形式:
name的值为实体类的常量名
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
金额:<input type="text" name="money"/><br/>
年龄:<input type="text" name="user.uage"/><br/>
<input type="submit" value="提交">
</form>
处理该请求:将传递过来的实体类作为处理函数参数
@RequestMapping("/saveAccount")
public String saveAccount(Account account) {
System.out.println(account);
return "hello";
}
List和Map集合
在实体类中加入List集合和Map集合
<form action="param/saveAccount" method="post">
姓名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
金额:<input type="text" name="money"/><br/>
年龄:<input type="text" name="list[0].uage">
年龄2:<input type="text" name="map['one'].uage">
<input type="submit" value="提交">
</form>
集合是封装在实体类中,所以输出形式就直接输出实体类就可以。
传递Date类型注意的地方
我们在表单输入日期,springmvc会给我们自动进行类型转换,将我们输入的string类型转换为日期类型,输入1999/09/13可以转换,但我们输入1999-09-13时就不能将其转换为日期类型从而提交报错。
解决方法:自定义类型转换器
自定义将string类转换为日期类型的类,继承Converter转换接口,实现转换方法。
Converter接口
S代表被转换为的类型,T为转换的目标类型
@FunctionalInterface
public interface Converter<S, T> {
@Nullable
T convert(S var1);
}
自定义转换类,利用DateFormat的parse方法来实现转换。
public class stringToDateConverter implements Converter<String,Date> {
@Override
public Date convert(String s) {
try {
if (s==null) {
throw new NullPointerException("请输入日期");
}
else {
DateFormat dateFormat = new SimpleDateFormat("yyyy-MM-DD");
Date parse = dateFormat.parse(s);
return parse;
}
} catch (Exception e) {
throw new RuntimeException("输入日期有误");
}
}
}
创建好自定义类型转换器之后要与取代原来的类型转换,在配置文件中配置类型转换。
<!-- 配置类型转换工厂 -->
<bean id="conversionService2" class="org.springframework.context.support.ConversionServiceFactoryBean">
<!-- 给工厂注入一个新的类型转换器 -->
<property name="converters">
<array>
<!-- 注入自定义类型转换器 -->
<bean class="cn.controller.stringToDateConverter"></bean>
</array>
</property>
</bean>
最后,使用该类型转换。
<!-- 开启注解支持 , 同时引用配置的类型转换工厂-->
<mvc:annotation-driven conversion-service="conversionService2"></mvc:annotation-driven>
中文乱码问题
表单中输入中文报错,在web.xml中加入过滤器,拦截所有请求,重新设置字符集。
<!-- 配置解决中文乱码的过滤器 -->
<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>