springMVC参数获取

153 阅读4分钟

封装为简单数据类型

springMVC支持参数注入的方式用于获取请求数据,也就是将请求参数直接封装到方法参数中.

//获取简单类型参数
@RequestMapping("/c1/param1")
public void canshu(String username,int age){
    System.out.println(username);
    System.out.println(age);
}
在地址栏中输入http://localhost:8080/c1/param1?username=zhangdi&age=20 即可获取参数

封装为对象类型

  • 封装单个对象
  1. 编写实体类
public class Student {
    private int id;
    private String name;
    private String sex;
    //省略getter和setter方法
}
  1. 编写控制器方法
//获取对象类型的参数
@RequestMapping("/c1/param2")
public void obj(Student student){
    System.out.println(student);
}
  1. 在地址栏中输入以下内容 请求参数名方法参数的属性名相同,即可完成自动封装 http://localhost:8080/c1/param2?id=1&name=zhangdi&sex=nan
  • 封装为关联对象
  1. 编写实体类
public class Student {
    private int id;
    private String name;
    private String sex;
    private Address address;
    //省略getter和setter方法
}
public class Address {
    private String info;   //地址信息
    private String postcode;//邮编
    //省略getter和setter方法
}

  1. 编写控制器方法
//获取关联对象类型参数
@RequestMapping("/c1/param3")
public void obi3(Student student){
    System.out.println(student);
}
  1. 在地址栏中输入以下内容 请求参数名方法参数的属性名相同,即可完成自动封装 http://localhost:8080/c1/param3?id=1&name=zhangdi&sex=nan&address.info=gansutianshui&address.postcode=123456

使用表单提交的时候 在编写代码的时候只需要表单的name属性名与实体属性名一致即可

封装为集合类型

  • 封装为简单数据类型集合
    • 封装为list集合
    1. 编写控制器方法
//封装为简单数据类型list集合  参数前必须添加@RequestParam注解
@RequestMapping("/c1/param4")
public void obj4(@RequestParam List<String> user){
    System.out.println(user);
}
    • 也可以封装为数组
//封装为简单数据类型数组
@RequestMapping("/c1/param5")
public void obj5(@RequestParam String[] user){
System.out.println(user[0]);
System.out.println(user[1]);
}
  1. 请求参数写法 在地址栏输入以下内容 http://localhost:8080/c1/param4?user=zhangdi&user=dayanan
  • 封装为对象类型集合 springMVC不支持将参数封装为对象类型的list集合,但可以封装到有List属性的对象中
  1. 编写实体类
public class Student {
    private int id;
    private String name;
    private String sex;
    private List<Address> addresses; //地址集合
}

2.编写控制器

@RequestMapping("/c1/param6")
public void obj5(Student student){
    System.out.println(student);
}

3.浏览器地址栏的路径如下

(http://localhost:8080/c1/param6?id=1&name=bz&sex=female&address[0].info=bj&address[0].postcode=100010&address[1].info=sh&address[1].postcode=100011)

  • 封装为map集合 同样springMVC同样不能把对象封装到对象类型的Map集合中,但是可以封装到有Map属性的对象中
  1. 编写实体类
public class Student {
   private int id;
   private String name;
   private String sex;
   private Map<String,Address> address;// 地址集合
// 省略getter/setter/tostring

}
  1. 编写控制器
// 对象中包含Map属性
@RequestMapping("/c1/param7")
public void mapParam(Student student){  
   System.out.println(student);
}

3.请求参数的写法 http://localhost:8080/c1/param7?id=1&name=bz&sex=female&address[‘one’].info=bj&address[‘one’].postcode=100010&address[‘two’].info=sh&address[‘two’].postcode=100011

自定义类型参数转化器

前端传来的参数全部为字符串类型, springMVC使用自带的转化器将参数转化为所需要的类型, 但在某些情况下,无法将参数转化为所需要的类型,比如日期类型,因为日期类型有很多种格式,所以springMVC没有将各种日期格式转化为需要的类型,这时就需要参数类型转化器.

  1. 定义类型转换器类,实现Converter接口
// 类型转换器必须实现Converter接口,两个泛型代表转换前的类型,转换后的类型
public class DateConverter implements Converter<String, Date> {
   /**
    * 转换方法
    * @param source 转换前的数据
    * @return 转换后的数据
    */
   @Override
   public Date convert(String source) {
       SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
       Date date = null;
       try {
           date = sdf.parse(source);
      } catch (ParseException e) {
           e.printStackTrace();
      }
       return date;
  }
}
  1. 注册类型转化器对象
<!-- 配置转换器工厂 -->
<bean id="dateConverter"class="org.springframework.context.support.ConversionServiceFactoryBean">
   <!-- 转换器集合 -->
   <property name="converters">
       <set>
           <!-- 自定义转换器 -->
           <bean class="com.itbaizhan.converter.DateConverter"></bean>
       </set>
   </property>
</bean>
<!-- 使用转换器工厂 -->
<mvc:annotation-driven conversion-service="converterFactory"></mvc:annotation-driven>
  1. 此时再访问http://localhost:8080/c1/param9?birthday=2025-01-01 时,SpringMVC即可将请求参数封装为Date类型的参数。

编码过滤器

在传递参数时,tomcat8以上能处理get请求的中文乱码,但不能处理post请求的中文乱码

SpringMVC提供了处理中文乱码的过滤器,在web.xml中配置该过滤器即可解决中文乱码问题:

<!--SpringMVC中提供的字符编码过滤器,放在所有过滤器的最上方-->
<filter>
   <filter-name>encFilter</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>encFilter</filter-name>
   <url-pattern>/*</url-pattern>
</filter-mapping>