SpringMVC基础--请求参数绑定

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>

猜你喜欢

转载自blog.csdn.net/qq_44660367/article/details/108912499