SpringMVC之参数绑定(一)

MVC已经是现代Web开发中的一个很重要的部分,在项目开发中逐步替代了web层中的struts2框架,本篇简单介绍一下Spring MVC的基础参数绑定是如何处理的,高级参数绑定会在后续博文进行介绍。

默认支持的参数类型

既然学习Spring MVC的参数绑定,首先就要了解其它本身提供了哪些默认支持的参数类型。

处理器形参中添加如下类型参数,处理器会默认识别并进行赋值。

  • HttpServletRequest:用于request对象获取请求信息
  • HTTPServletResponse:通过response处理响应信息
  • HTTPSession:通过session对象,得到session中存放的对象

Model和ModelMap

        除了默认支持类型的参数,Spring MVC还可以自动封装Model或ModelMap对象,用于向页面传递数据。

  • Model

       Model是一个接口,在参数中直接声明model即可。如果使用Model对象,则可以不使用ModelAndView对象,Model对象可以向页面传递数据,View对象可使用String返回值代替,即String字符串为视图名称。

       不管是Model还是ModelAndView,其本质都是使用Request对象向JSP页面传递数据。

/**
 * 根据id查询商品,使用Model
 * 
 * @param request
 * @param model
 * @return
 */
@RequestMapping("/itemEdit")
public String queryItemById(HttpServletRequest request, Model model) {
	// 从request中获取请求参数
	String strId = request.getParameter("id");
	Integer id = Integer.valueOf(strId);

	// 根据id查询商品数据
	Item item = this.itemService.queryItemById(id);

	// 把商品数据放在模型中
	model.addAttribute("item", item);

	return "itemEdit";
}
  • ModelMap

      ModelMap是Model接口的实现类,也可以使用ModelMap向页面传递数据。同样在参数列表出生命ModelMap对象,Spring MVC帮助我们生成ModelMap对象。

/**
 * 根据id查询商品,使用ModelMap
 * 
 * @param request
 * @param model
 * @return
 */
@RequestMapping("/itemEdit")
public String queryItemById(HttpServletRequest request, ModelMap model) {
	// 从request中获取请求参数
	String strId = request.getParameter("id");
	Integer id = Integer.valueOf(strId);

	// 根据id查询商品数据
	Item item = this.itemService.queryItemById(id);

	// 把商品数据放在模型中
	model.addAttribute("item", item);

	return "itemEdit";
}
    使用Model和ModelMap的效果一样,如果直接使用Model,则Spring MVC也会实例化为ModelMap对象


绑定简单类型

       当请求的参数名称和处理器形参名称一致时,会将请求参数与形参进行绑定。这样,从request中取得参数的方法就可以进一步进行简化。

/**
 * 根据id查询商品,绑定简单数据类型
 * 
 * @param id
 * @param model
 * @return
 */
@RequestMapping("/itemEdit")
public String queryItemById(int id, ModelMap model) {
	// 根据id查询商品数据
	Item item = this.itemService.queryItemById(id);

	// 把商品数据放在模型中
	model.addAttribute("item", item);

	return "itemEdit";
}

简单类型支持的数据类型

参数类型推荐使用包装数据类型,因为基础数据类型不可以为null。下表列出常用的基本数据类型:

整形Integerint
字符串String 
单精度Floatfloat
双精度Doubledouble
布尔型Booleanboolean

说明:对于布尔型的参数,请求的参数值应为true或false或1或0。

请求的url,例如:http://localhost:8080/xxx.action?id=2&status=false

处理器方法:publicString editItem(Model model,Integer id,Boolean status

@RequestParam

        注解@RequestParam常用于处理简单类型的绑定问题,若参数名称与表单提交属性名称不同,可以使用此注解进行标注。

        value属性:参数名称,即入参的请求参数名字(name属性),如value="itemId"表示请求的参数       区中的名字为itemId的参数的值将传入

        required是否必须,默认是true,表示请求中一定要有相应的参数,否则将报错,错误信息:TTPStatus 400 - Required Integer parameter 'XXXX' is not present

        defaultValue默认值,表示如果请求中没有同名参数时的默认值。

        说明:若required设置为false,可以使用defaultValue属性进行指定默认值。

@RequestMapping("/itemEdit")
public String queryItemById(@RequestParam(value = "itemId", required = true, defaultValue = "1") Integer id,
		ModelMap modelMap) {
	// 根据id查询商品数据
	Item item = this.itemService.queryItemById(id);

	// 把商品数据放在模型中
	modelMap.addAttribute("item", item);

	return "itemEdit";
}
绑定POJO

      如果提交的参数很多,或者提交的表单中内容很多的时候,如果使用简单类型绑定,那么方法的参数可能就有很多,给程序员的开发带来很大的不便利。在这种情况下,我们可以使用POJO接收前端提交的数据。

      需要注意的是:POJO对象中的属性名称需要和表单中input标签中的name属性值保存一致

      页面定义如下图:

      

      Pojo(逆向工程生成)如下图:

       

      请求的参数名称和pojo的属性名称一致,Sprring MVC会自动将请求参数赋值给pojo的属性

      注意:

      提交的表单中不要有日期类型的数据,否则会报400错误。如果想提交日期类型的数据需要用到后面的自定义参数绑定的内容。


绑定包装POJO

      包装POJO,顾名思义是将POJO进一步的封装。前端表单中的name属性需要使用“对象.属性”进行数据提交。包装类定义如下所示:

public class QueryVo {
    private Item item;
	
    public void setItem(Item item) {
	this.item = item;
    }

    public Item getItem() {
	return this.item;
    }
 }

   

       页面定义如下图:

      
	// 绑定包装数据类型
	@RequestMapping("/queryItem")
	public String queryItem(QueryVo queryVo) {
		System.out.println(queryVo.getItem().getId());
		System.out.println(queryVo.getItem().getName());

		return "success";
	}


自定义参数绑定

      在表单提交过程中,可能会有日期数据进行绑定,但是日期数据有多种数据格式,Spring MVC无法把字符串转换成日期类型。所以需要自定义参数绑定。

      前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。可以在springmvc处理器适配器上自定义转换器Converter进行参数绑定。

     一般使用<mvc:annotation-driven/>注解驱动加载处理器适配器,可以在此标签上进行配置。

      自定义Converter

/**
 * 转换日期类型的数据
 * S:页面传递过来的类型
 * T:转换后的类型
 * Created by LXH on 2018/5/9.
 */
public class DateConveter implements Converter<String, Date> {

    @Override
    public Date convert(String s) {
        try {
            if(null != s) {
                DateFormat df = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
                return  df.parse(s);
            }
        } catch (Exception e) {

        }

        return null;
    }
}

      在Spring MVC配置文件中配置转换工厂,并在转换工厂中引用Conveter转换器。

    <!--配置Conveter转换器  转换工厂(转换日期)-->
    <bean id="formattingConversionServiceFactoryBean" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
        <!--配置多个转换器-->
        <property name="converters">
            <list>
                <!--自定义转换器的类型,配置为bean-->
                <bean class="stu.l.springmvc.conversion.DateConveter"></bean>
            </list>
        </property>
    </bean>


在使用Spring MVC时,有时会出现提交到数据库造成乱码问题,这时候需要在web.xml文件中配置相关的过滤器进行转换,具体配置如下所示:

    <!--处理POST提交乱码问题-->
    <filter>
        <filter-name>encoding</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>encoding</filter-name>
        <url-pattern>*.action</url-pattern>
    </filter-mapping>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值