spring mvc RequestMapping注解,参数绑定,自定义类型转换器

RequestMapping注解

作用:
  用于建立请求 URL 和处理请求方法之间的对应关系
 
出现位置:
类上:
  请求 URL 的第一级访问目录。此处不写的话,就相当于应用的根目录。写的话需要以/开头。
  它出现的目的是为了使我们的 URL 可以按照模块化管理:
  例如:
    账户模块:
      /account/add
      /account/update
      /account/delete
      ...
    订单模块:
      /order/add
      /order/update
      /order/delete
    红色的部分就是把 RequsetMappding 写在类上,使我们的 URL 更加精细。
方法上:
  请求 URL 的第二级访问目录。
  
属性:
  value:用于指定请求的 URL。它和 path 属性的作用是一样的。
  method:用于指定请求的方式。
  params:用于指定限制请求参数的条件。它支持简单的表达式。要求请求参数的 key 和 value 必须和配置的一模一样。
  例如:
    params = {"accountName"},表示请求参数必须有 accountName
    params = {"moeny!100"},表示请求参数中 money 不能是 100。
  headers:用于指定限制请求消息头的条件。
  注意:以上四个属性只要出现 2 个或以上时,他们的关系是与的关系。
 
应用:
@Controller
@RequestMapping(path = "/user")
public class HelloController {
    /**
     * 请求映射注解:path=/hello
     *      /hello就变成这个方法执行的请求路径
     * @return
     */
    @RequestMapping(value = "/hello",method = {RequestMethod.POST,RequestMethod.GET},params = {"username"},headers = {"Accept"})
    public String sayHello(){
        System.out.println("Hello SpringMVC");
        return "success";
    }
}

对应的请求url是/user/hello; 请求方法是POST/GET; 请求参数必须带有username; 请求头中必须有Accept参数

<a href="/myWeb/user/hello?username=hehe">12</a> 这样的超链接就是允许的

1

 

参数绑定

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

支持的数据类型
  基本类型参数:
    包括基本类型和 String 类型
  POJO 类型参数:
    包括实体类,以及关联的实体类
  数组和集合类型参数:
    包括 List 结构和 Map 结构的集合(包括数组)
使用方式:
  如果是基本类型或者 String 类型:
    要求我们的参数名称必须和控制器中方法的形参名称保持一致。(严格区分大小写)
  如果是 POJO 类型,或者它的关联对象:
    要求表单中参数名称和 POJO 类的属性名称保持一致。并且控制器方法的参数类型是 POJO 类型。
  如果是集合类型,有两种方式:   
    第一种:
      要求集合类型的请求参数必须在 POJO 中。在表单中请求参数名称要和 POJO 中集合属性名称相同。
      给 List 集合中的元素赋值,使用下标。
      给 Map 集合中的元素赋值,使用键值对。
    第二种:
      接收的请求参数是 json 格式数据。需要借助一个注解实现

 

应用:

首先准备好两个javaBean当作请求时提交的参数

User

package cn.cast.domain;

import java.io.Serializable;

public class User implements Serializable {
    private String uname;
    private Integer age;

    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", age=" + age +
                '}';
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public Integer getAge() {
        return age;
    }

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

Account:内含List<User>,Map<String,User>

package cn.cast.domain;

import java.io.Serializable;
import java.util.List;
import java.util.Map;

public class Account implements Serializable {

    private String username;
    private String password;
    private Double money;
    //private User user;

    private List<User> list;
    private Map<String,User> map;

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

    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;
    }*/

    @Override
    public String toString() {
        return "Account{" +
                "username='" + username + '\'' +
                ", password='" + password + '\'' +
                ", money=" + money +
                ", list=" + list +
                ", map=" + map +
                '}';
    }

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    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;
    }
}
View Code

定义一个接受请求参数的控制器类

/**
 * 请求参数绑定
 */
@Controller
@RequestMapping("/param")
public class ParamController {
    /**
     * 请求参数绑定入门
     * @return
     */
    @RequestMapping("/testParam")
    public String testParam(String username,String password){
        System.out.println("执行了。。");
        System.out.println("用户名"+username);
        System.out.println("密码"+password);
        return "success";
    }
    /**
     * 请求参数绑定:把数据封装到JavaBean中
     * @return
     */
    @RequestMapping("/saveAccount")
    public String saveAccount(Account account){
        System.out.println("执行了。。");
        System.out.println(account);
        return "success";
    }
}

用于填写参数信息,发送请求的页面param.jsp

<%--
  Created by IntelliJ IDEA.
  User: ASUS
  Date: 2020/4/11
  Time: 15:42
  To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>

    <!--请求参数绑定-->
    <!--<a href="/myWeb/param/testParam">请求参数绑定</a>
    <form action="/myWeb/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.uname"/><br/>
        用户年龄:<input type="text" name="user.age"/><br/>
        <input type="submit" value="提交"/>
    </form>
    -->
    <!--把数据封装Account类中,类中存在List和Map集合-->
    <form action="/myWeb/param/saveAccount" method="post">
        姓名:<input type="text" name="username"/><br/>
        密码:<input type="text" name="password"/><br/>
        金额:<input type="text" name="money"/><br/>

        <!--这个对象存list-->
        用户姓名:<input type="text" name="list[0].uname"/><br/>
        用户年龄:<input type="text" name="list[0].age"/><br/>

        <!--这个对象存map-->
        用户姓名:<input type="text" name="map['one'].uname"/><br/>
        用户年龄:<input type="text" name="map['one'].age"/><br/>
        <input type="submit" value="提交"/>
    </form>
</body>
</html>

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>

 

自定义类型转换器

当提交的参数需要进行类型转换时,就需要使用类型转换器

自定义类型转换器:将String转换成Date类

修改User类,其中包含一个Date类

package cn.cast.domain;

import java.io.Serializable;
import java.util.Date;

public class User implements Serializable {
    private String uname;
    private Integer age;

    private Date date;

    @Override
    public String toString() {
        return "User{" +
                "uname='" + uname + '\'' +
                ", age=" + age +
                ", date=" + date +
                '}';
    }

    public Date getDate() {
        return date;
    }

    public void setDate(Date date) {
        this.date = date;
    }

    public String getUname() {
        return uname;
    }

    public void setUname(String uname) {
        this.uname = uname;
    }

    public Integer getAge() {
        return age;
    }

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

param.jsp的提交表单

<!--使用自定义类型转换器,将date从String转换成Date-->
    <form action="/myWeb/param/saveUser" method="post">
        用户姓名:<input type="text" name="uname"/><br/>
        用户年龄:<input type="text" name="age"/><br/>
        用户生日:<input type="text" name="date"/><br/>
        <input type="submit" value="提交"/>
    </form>

自定义类型转换器,当遇到格式为yyyy-MM-dd的字符串,且其目标类型是日期类时,就将其进行转换

/**
 * 字符串转换成日期
 */
public class StringToDateConverter implements Converter<String,Date> {

    /**
     * 传进来的字符串
     * @param sourse
     * @return
     */
    @Override
    public Date convert(String sourse) {
        if(sourse==null){
            throw new RuntimeException("请传入数据");
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");
        try {
            return df.parse(sourse);
        } catch (ParseException e) {
            throw new RuntimeException("数据类型转换错误");
        }
    }
}

在springmvc.xml里进行配置

!-- 配置自定义类型转换器 -->
    <bean id="conversionServiceFactoryBean" class="org.springframework.context.support.ConversionServiceFactoryBean">
        <property name="converters">
            <!--注入自己写的类-->
            <set>
                <bean class="cn.cast.utils.StringToDateConverter"></bean>
            </set>
        </property>
    </bean>

    <!--开启SpringMVC框架注解的支持,配置类型转换器使其生效-->
    <mvc:annotation-driven conversion-service="conversionServiceFactoryBean"/>

 

posted on 2020-04-11 15:28  zsben  阅读(814)  评论(0编辑  收藏  举报

导航