Spring MVC 请求参数绑定到实体类型汇总

说明

请求参数的绑定说明

  • 绑定机制
    • 表单提交的数据都是k=v格式的,username=111&&password=222
    • SpringMVC的参数绑定过程是把表单提交的请求参数,作为控制器中方法的参数进行绑定的
    • 要求:提交提交表单的name和参数的名称是相同的

支持的数据类型

  • 基本数据类型和字符串类型
  • 实体类型(JavaBean)
  • 集合数据类型(List,map集合等)

基本数据类型和字符串类型

  • 提交表单的name和参数的名称是相同的
  • 区分大小写

实体类型(JavaBean)

  • 提交表单的name和javaBean中的属性名称一样。
  • 如果一个JavaBean类中包含其他引用类型,那么表单的name属性需要编写成:对象.属性,例如:address.name。

集合数据类型
表单的name属性写法见下面的例子

基本数据类型和字符串类型

通过反射的方式,当testParam方法中有名为username和password的参数时,会将请求参数username和password分别赋值给testParam方法中的参数。

ParamController.java

@Controller
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/testParam")
    public String testParam(String username,String password){
        System.out.println("执行了...");
        System.out.println("用户名:"+username);
        System.out.println("密码:"+password);
        return "success";
    }
}

index.jsp

<a href="param/testParam?username=www&password=123">绑定一般类型</a>

实体类型(JavaBean)

通过把数据封装到JavaBean的类中。
调用setUsername()、setPassword()、setMoney()方法将请求参数username、password、money赋值给Account 对象的三个属性,再调用user.setUname()、user.setAge()将请求参数user.uname和user.age赋值给user对象的属性。请求参数名和对象中的属性名要相同才能找到set方法。
Account.java

public class Account implements Serializable{

    private String username;
    private String password;
    private Double money;

    private User user;
	
	//生成getter和setter方法
	//生成toString方法
}

User.java

public class User implements Serializable{

    private String uname;
    private Integer age;
	//生成getter和setter方法
	//生成toString方法
}

index.jsp

<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.uname" /><br/>
     用户年龄:<input type="text" name="user.age" /><br/>
     <input type="submit" value="提交" />
</form>

ParamController.java

@Controller
@RequestMapping("/param")
public class ParamController {
    @RequestMapping("/saveAccount")
    public String saveAccount(Account account){
        System.out.println("执行了...");
        System.out.println(account);
        return "success";
    }
}

绑定集合类型

Account.java

public class Account implements Serializable{

    private String username;
    private String password;
    private Double money;

    private List<User> list;
    private Map<String,User> map;
	
	//生成getter和setter方法
	//生成toString方法
}

User.java

public class User implements Serializable{

    private String uname;
    private Integer age;
	//生成getter和setter方法
	//生成toString方法
}

index.jsp

<form action="param/saveAccount" method="post">
    姓名:<input type="text" name="username" /><br/>
    密码:<input type="text" name="password" /><br/>
    金额:<input type="text" name="money" /><br/>

	<%--list[0].uname和list[0].age表示把uname和age的值赋值给user对象的属性,然后把user对象存到集合的0号位置--%>
    用户姓名:<input type="text" name="list[0].uname" /><br/>
    用户年龄:<input type="text" name="list[0].age" /><br/>
    
	<%--map['one'].uname和map['one'].age表示把uname和age的值赋值给user对象的属性,然后把键为'one',值为user对象的键值对存到map集合中--%>
    用户姓名:<input type="text" name="map['one'].uname" /><br/>
    用户年龄:<input type="text" name="map['one'].age" /><br/>
    <input type="submit" value="提交" />
</form>

通过原生Servlet的方式

    @RequestMapping("/testServlet")
    public String testServlet(HttpServletRequest request, HttpServletResponse response){
        System.out.println("执行了...");
        System.out.println(request);

        HttpSession session = request.getSession();
        System.out.println(session);

		//获取请求参数	
        String params = request.getQueryString();
        System.out.println(params );


        ServletContext servletContext = session.getServletContext();
        System.out.println(servletContext);

        System.out.println(response);
        return "success";
    }

解决post请求中文乱码

SpringMVC框架提供的请求参数过滤器,在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>

自定义类型转换器

一般类型,如Account中有一个为Integer类型的属性,请求参数是字符串类型,则框架会自动将字符串类型转为整型。但是也有转换异常的情况,如Account有一个为Data类型的属性,只有请求参数字符串是’xxxx/xx/xx’格式的时候才会正常转换成Data类型,'xxxx-xx-xx’格式则不会转换成功,因此这时候就需要我们自定义类型转换器。

SpringMVC框架是一个基于组件的框架,我们可以编写一个类型转换器,然后在resources/springmvc.xml文件中配置这个类型转换器类,当需要类型转换的时候,前端控制器会找到类型转换器帮助我们完成类型转换。

Converter是类型转换的总接口,所有自定义的类型转换器类都必须实现这个接口。

StringToDateConverter.java

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

    /**
     * String source    传入进来字符串
     * @param source
     * @return
     */
    public Date convert(String source) {
        System.out.println("lxzh");
        
        // 判断
        if(source == null){
            throw new RuntimeException("参数不能为空");
        }
        DateFormat df = new SimpleDateFormat("yyyy-MM-dd");

        try {
            // 把字符串转换日期
            return df.parse(source);
        } catch (Exception e) {
            throw new RuntimeException("数据类型转换出现错误");
        }
    }
}

resources/springmvc.xml

<!--其它配置...-->
<!--配置自定义类型转换器-->
<bean id="conversionService" class="org.springframework.context.support.ConversionServiceFactoryBean">
    <property name="converters">
        <set>
            <bean class="cn.ith.utils.StringToDateConverter"/>
        </set>
    </property>
</bean>

<!--开启springmvc框架注解的支持,并开启类型转换器-->
<mvc:annotation-driven conversion-service="conversionService"/>

<!--其它配置...-->

这样,当Account中有一个为Data的属性,为这个属性赋值的时候,就会调用类型转换器类将"xxxx-xx-xx"转换成正确的日期类型。应该注意的是,框架默认的将"xxxx/xx/xx"格式字符串转成日期类型将不再起作用。

发布了243 篇原创文章 · 获赞 87 · 访问量 7万+

猜你喜欢

转载自blog.csdn.net/IT_10/article/details/103751518