请求参数的绑定

准备工作

  1. 创建Account类
public class Account implements Serializable {

    private String name;
    private String password;
    private Date birthday;
    private Double money;
    private User user;
    private List<User> list;
    private Map<String, User> map;

    public List<User> getList() {
        return list;
    }

    public Date getBirthday() {
        return birthday;
    }

    public void setBirthday(Date birthday) {
        this.birthday = birthday;
    }

    public void setList(List<User> list) {
        this.list = list;
    }

    public Map<String, User> getMap() {
        return map;
    }

    public void setMap(Map<String, User> map) {
        this.map = map;
    }

    public User getUser() {
        return user;
    }

    public void setUser(User user) {
        this.user = user;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public Double getMoney() {
        return money;
    }

    public void setMoney(Double money) {
        this.money = money;
    }

    @Override
    public String toString() {
        return "Account{" +
                "name='" + name + '\'' +
                ", password='" + password + '\'' +
                ", birthday=" + birthday +
                ", money=" + money +
                ", user=" + user +
                ", list=" + list +
                ", map=" + map +
                '}';
    }
}
  1. 创建User类
public class User implements Serializable {
    private String userName;
    private Integer age;

    public String getUserName() {
        return userName;
    }

    public void setUserName(String userName) {
        this.userName = userName;
    }

    public Integer getAge() {
        return age;
    }

    public void setAge(Integer age) {
        this.age = age;
    }

    @Override
    public String toString() {
        return "User{" +
                "userName='" + userName + '\'' +
                ", age=" + age +
                '}';
    }
}
  1. 编写控制器类
@Controller
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/saveAccount")
    public String saveAccount(Account account){
        System.out.println(account);
        return "success";
    }
}

编写param.jsp

<body>
    <form action="param/saveAccount" method="post">
        姓名:<input type="text" name="name"/><br/>
        密码:<input type="password" name="password"/><br/>
        生日:<input type="text" name="birthday"/><br/>
        金额:<input type="text" name="money"/><br/>
        用户名:<input type="text" name="user.userName"/><br/>
        年龄:<input type="text" name="user.age"/><br/>

        用户名:<input type="text" name="list[0].userName"/><br/>
        年龄:<input type="text" name="list[0].age"/><br/>

        用户名:<input type="text" name="map['one'].userName"/><br/>
        年龄:<input type="text" name="map['one'].age"/><br/>
        <input type="submit" value="提交"/>
    </form>
</body>
  • 注意
    • 日期类型的默认数据格式是:yyyy/MM/dd
    • 中文乱码问题,在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>
    

自定义数据转换器

  1. 编写数据转换器类
public class StringToDateConverter implements Converter<String, Date> {
    @Override
    public Date convert(String source) {
        if (source.length() == 0)
            throw new RuntimeException("请传入数据");
        SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return dateFormat.parse(source);
        } catch (Exception e) {
            throw new RuntimeException("数据类型出错");
        }
    }
}
  1. 在springmvc.xml中开启类型转换器
<!--开启类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="com.whut.untils.StringToDateConverter"></bean>
        </set>
    </property>
</bean>
<!--开启springMVC框架注解支持-->
<mvc:annotation-driven conversion-service="conversionService"/>

常用注解

  1. RequestParam

    1. 作用: 把请求中指定名称的参数给控制器中的形参赋值。
    2. 属性:
      1. value:请求参数中的名称。
      2. required:请求参数中是否必须提供此参数。默认值:true。表示必须提供,如果不提供将报错。
    <a href="annotation/testRequestParam?name=张三">testRequestParam</a>
    
     @Controller
     @RequestMapping("/annotation")
     public class AnnotationController {
         @RequestMapping("/testRequestParam")
         public String testRequestParam(@RequestParam(name = "name") String username){
             System.out.println(username);
             return "success";
         }
     }
    
  2. ModelAttribute

    1. 作用: 该注解是SpringMVC4.3版本以后新加入的。它可以用于修饰方法和参数。 出现在方法上,表示当前方法会在控制器的方法执行之前,先执行。它可以修饰没有返回值的方法,也可以修饰有具体返回值的方法。 出现在参数上,获取指定的数据给参数赋值。
    2. 属性: value:用于获取数据的key。key可以是POJO的属性名称,也可以是map结构的key。
    3. 应用场景: 当表单提交数据不是完整的实体类数据时,保证没有提交数据的字段使用数据库对象原来的数据。
      1. 例如: 我们在编辑一个用户时,用户有一个创建信息字段,该字段的值是不允许被修改的。在提交表单数据是肯定没有此字段的内容,一旦更新会把该字段内容置为null,此时就可以使用此注解解决问题。
    4. 示例
    <a href="annotation/testModelAttribute?userName=testModelAttribute">testModelAttribute</a>
    
    @RequestMapping("/testModelAttribute")
     public String testModelAttribute(User user){
         System.out.println("执行了控制器方法"+user.getUserName());
         return "success";
     }
     @ModelAttribute
     public void showModel(User user){
         System.out.println("执行了showModel方法"+user.getUserName());
     }
    

    输出结果
    在这里插入图片描述

    1. 基于Map的应用场景示例
      1. ModelAttribute修饰方法带返回值

        1. jsp中创建表单
          <form action="annotation/updateUser" method="post">
              用户名称:<input type="text" name="userName" ><br/>
              <input type="submit" value="保存"> </form>
          </form>
          
        2. 控制器中方法
          @RequestMapping("/updateUser")
          public String testUpdateUser(User user){
              System.out.println("控制器中处理请求方法:修改用户"+user);
              return "success";
          }
          @ModelAttribute
          public User showModel(String userName){
              //模拟数据库查询
              User user = findUserByUserName(userName);
              System.out.println("执行了showModel方法"+user);
              return user;
          }
          public User findUserByUserName(String userName){
              //模拟数据库查询
              User user = new User();
              user.setUserName(userName);
              user.setAge(18);
              return user;
          }
          
        3. 运行结果
          在这里插入图片描述
      2. ModelAttribute修饰方法不带返回值

        1. 控制器中方法
          @RequestMapping("/updateUser")
          public String testUpdateUser(@ModelAttribute("user01")User user) {
              System.out.println("控制器中处理请求的方法:修改用户:"+user);
              return "success";
          }
          @ModelAttribute
          public void showModel(String userName, Map<String,User> map) {
              //模拟去数据库查询
              User user = findUserByUserName(userName);
              System.out.println("执行了showModel方法"+user);
              map.put("user01",user);
          }
          public User findUserByUserName(String userName){
              //模拟数据库查询
              User user = new User();
              user.setUserName(userName);
              user.setAge(18);
              return user;
          }
          
        2. 输出结果
          在这里插入图片描述
  3. SessionAttribute

    1. 作用: 用于多次执行控制器方法间的参数共享。
    2. 属性:
      1. value:用于指定存入的属性名称
      2. type:用于指定存入的数据类型。
    3. 使用示例
      jsp
    <a href="session/testPut">存入SessionAttribute</a>
    <hr/>
    <a href="session/testGet">取出SessionAttribute</a>
    <hr/>
    <a href="session/testClean">清除SessionAttribute</a>
    

    控制器类

    @Controller
    @RequestMapping("/session")
    @SessionAttributes(value = {"userName"}, types = {Integer.class})
    public class SessionController {
        @RequestMapping("/testPut")
        public String testPut(Model model) {
            model.addAttribute("userName","柯莱特");
            model.addAttribute("age", 20);
            System.out.println("存入");
            return "success";
        }
        @RequestMapping("/testGet")
        public String testGet(ModelMap model){
            System.out.println("取出:"+model);
            return "success";
        }
        @RequestMapping("/testClean")
        public String complete(SessionStatus sessionStatus){
            sessionStatus.setComplete();
            System.out.println("清除");
            return "success";
        }
    }
    

    输出结果
    在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一大岐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值