SpringMVC请求参数的绑定及其常用注解

3.3 请求参数的绑定

绑定机制

表单中的请求都是基于key=value的

SpringMVC绑定请求参数的过程就是通过把表单提交请求参数,作为控制器中方法参数进行绑定的。

例如:

  • <a href="account/findAccount?accountId=10">查询账户</a>,请求参数是:accoutnId=10

  • /**
    * 查询账户
    * @return
    */
    @RequestMapping("/findAccount")
        public String findAccount(Integer accountId) 
        {
        System.out.println("查询了账户。。。。"+accountId);
    	return "success"; 
        }
    

支持的数据类型

  • 基本类型参数:
    • 包括基本类型和String类型
  • POJO类型参数:
    • 包括实体类,以及关联的实体类
  • 数组和集合类型参数:
    • 包括List结构和Map结构的集合(包括数组)
  • SpringMVC绑定请求参数是自动实现的,但是要想使用,必须遵循使用要求。

使用要求

  • 基本类型或者String类型:

    • 要求我们的参数名称必须和控制器中方法的形参名称保持一致(严格区分大小写)
  • POJO类型,或者它的关联对象:

    • 要求表单中参数名称和POJO类的属性名称保持一致。并且控制器方法的参数类型是POJO类型
  • 集合类型,有两种方式:

    • 第一种:

      要求集合类型的请求参数必须在POJO中。在表单中请求参数名称要和POJO中集合属性名称相同。

      给List集合中的元素赋值,使用下标。

      给Map集合中的元素复制,使用键值对。

    • 第二种:

      接收的请求参数是json格式数据。需要借助一个注解实现。

总结

  1. 请求参数的绑定说明

    1. 绑定机制
      1. 表单提交的数据都是k=v格式的 username=haha&password=123
      2. SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定
      3. 要求:提交表单的name和参数的名称是相同的
    2. 支持的数据类型
      1. 基本数据类型和字符串类型
      2. 实体类型(JavaBean)
      3. 集合数据类型(List、Map集合等)
  2. 基本数据类型和字符串类型

    1. 提交表单的name和参数的名称是相同的
    2. 区分大小写
  3. 实体类型(JavaBean)

    1. 提交表单的name和JavaBean中的属性名称需要一致
    2. 如果一个JavaBean类中包含其他的引用类型,那么表单的name属性需要编写成:address.name
  4. 给集合属性数据封装

    1. JSP页面编写方式:list[0].属性
  5. 请求参数中文乱码的解决

    1. 在web.xml中配置Spring提供的过滤类

      <!-- 配置过滤器,解决中文乱码的问题 --> 
      <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>
      

自定义类型转换器

  • 使用场景:

    • 我们通过前端页面传送到后端的参数一般都是String类型的,SpringMVC可以帮我们转换大部分的Spring类型的数据变成我们需要的基本数据类型,但仍然有不能转换的地方,例如日期格式:2020-12-8,此时我们就需要自定义一个类型转换器
  • 使用步骤

    1. 第一步:定义一个类,实现 Converter 接口,该接口有两个泛型。

      public interface Converter<S, T> {//S:表示接受的类型,T:表示目标类型
          /**
      	* 实现类型转换的方法
      	*/
          @Nullable
          T convert(S source);
      }
      /**
      * 自定义类型转换器
      * @author 黑马程序员
      * @Company http://www.ithiema.com
      * @Version 1.0
      */
      public class StringToDateConverter implements Converter<String, Date> {
          /**
          * 用于把 String 类型转成日期类型
          */
          public Date convert(String source) {
              try {
                  if(StringUtils.isEmpty(source)) {
                      throw new NullPointerException("请输入要转换的日期");
                      }
                  format = new SimpleDateFormat("yyyy-MM-dd");
                  Date date = format.parse(source);
                  return date;
              } catch (Exception e) {
                  throw new RuntimeException("输入日期有误");
              }
          } 
      } 
      
    2. 第二步:在 spring 配置文件中配置类型转换器。
      spring 配置类型转换器的机制是,将自定义的转换器注册到类型转换服务中去。

      <!-- 配置类型转换器工厂 -->
      <bean id="converterService" class="org.springframework.context.support.ConversionServiceFactoryBean">
      <!-- 给工厂注入一个新的类型转换器 -->
      	 <property name="converters">
      		 <array>
       			<!-- 配置自定义类型转换器 --> <bean class="com.itheima.web.converter.StringToDateConverter"></bean>
      		</array>
           </property>
      </bean>
      
    3. 第三步:在 annotation-driven 标签中引用配置的类型转换服务

      <!-- 引用自定义类型转换器 -->
      <mvc:annotation-driven
      conversion-service="converterService"></mvc:annotation-driven>
      

3.4 常用注解

RequestParam

  • 作用:把请求中的指定名称参数传递给控制器中的形参赋值

  • 属性:

    • value:请求参数中的名称
    • rrequired:请求参数中是否必须提供此参数,默认值是true,必须提供
  • /**
    * 接收请求 
    * @return */ 
    @RequestMapping(path="/hello") 
    public String sayHello(@RequestParam(value="username",required=false)String name) 
    { 	System.out.println("aaaa"); 
     	System.out.println(name); 
     	return "success"; 
    }
    

RequestBody注解

  • 作用:用于获取请求体的内容(注意:get方法不可以)

  • 属性

    • required:是否必须有请求体,默认值是true
  • /**
    * 接收请求 
    * @return */ 
    @RequestMapping(path="/hello") public String sayHello(@RequestBody String body) { 		
        System.out.println("aaaa"); 
        System.out.println(body); 
        return "success"; 
    }
    

PathVariable注解

  • 作用:拥有绑定url中的占位符的。例如:url中中有/delete{id},{id}就是占位符

  • 属性:

    • value:指定url中的占位符名称
  • Restful风格的URL

    • 请求路径一样,可以根据不同的请求方式去执行后台的不同方法
      mark
    • Restful风格的URL有点
      • 结构清晰
      • 符合标准
      • 易于理解
      • 扩展方便
  • <a href="user/hello/1">入门案例</a> 
        /**
        * 接收请求 
        * @return */ @RequestMapping(path="/hello/{id}") 
    public String sayHello(@PathVariable(value="id") String id) 
    { 
        System.out.println(id); 
        return "success"; 
    }
    

RequestHeader注解

  • 作用:获取指定请求头的值

  • 属性:

    • value:请求头名称
  • @RequestMapping(path="/hello") 
    public String sayHello(@RequestHeader(value="Accept") String header) 
    { 
        System.out.println(header); 
        return "success"; 
    }
    

CookieValue注解

  • 作用:用于获取指定cookie的名称的值

  • 属性:

    • value:cookie的名称
  • @RequestMapping(path="/hello")
    public String sayHello(@CookieValue(value="JSESSIONID") String cookieValue) 
    { 
        System.out.println(cookieValue); 
        return "success"; 
    }
    

ModelAttribute注解

  • 作用:

    • 出现在方法上:表示当前方法会在控制器方法执行前执行
    • 出现在参数上:获取指定的数据给参数赋值
  • 应用场景

    • 当提交表单数据不是完整的实体数据时,保证没有提交的字段使用数据库原来的数据
  • 修饰的方法有返回值↓

  • /**
    * 作用在方法,先执行 
    * @param name 
    * @return 
    */ 
    @ModelAttribute 
    public User showUser(String name) 
    { 
        System.out.println("showUser执行了..."); 
        // 模拟从数据库中查询对象 
        User user = new User(); 
        user.setName("哈哈"); 
        user.setPassword("123"); 
        user.setMoney(100d); 
        return user;
    }
    
    /**
    * 修改用户的方法 
    * @param cookieValue 
    * @return 
    */ 
    @RequestMapping(path="/updateUser") 
    public String updateUser(User user) 
    { 
        System.out.println(user); 
        return "success"; 
    }
    
  • 修饰的方法没有返回值↓

  • /**
    * 作用在方法,先执行 
    * @param name 
    * @return 
    */ 
    @ModelAttribute 
    public void showUser(String name,Map<String, User> map) 
    { 
        System.out.println("showUser执行了..."); 
        // 模拟从数据库中查询对象 
        User user = new User(); 
        user.setName("哈哈"); 
        user.setPassword("123"); 
        user.setMoney(100d); 
        user.setMoney(100d);
        map.put("abc", user);
    }
    
    /**
    * 修改用户的方法 
    * @param cookieValue 
    * @return 
    */ 
    @RequestMapping(path="/updateUser") 
    public String updateUser(@ModelAttribute(value="abc") User user) 
    { 
        System.out.println(user); 
        return "success"; 
    }
    

SessionAttributes注解

  • 作用:用于多次执行控制器方法间的参数共享
  • 属性:
    • value:指定存入属性的名称

markmark

mark

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值