在Struts2中我们都知道,它的传值是通过action类的属性进行传值的,并且在Action的方法中是不允许有形参的,但在springmvc中的参数传递是通过形参来传递的。
1.1 参数绑定
处理器适配器在执行Handler之前需要把http请求的key/value数据绑定到Handler方法形参数上。
1.1.1 默认支持的参数类型
处理器形参中添加如下类型的参数处理适配器会默认识别并进行赋值。
1.1.1.1HttpServletRequest
通过request对象获取请求信息
1.1.1.2HttpServletResponse
通过response处理响应信息
1.1.1.3HttpSession
通过session对象得到session中存放的对象
1.1.1.4Model/ModelMap
ModelMap是Model接口的实现类,通过Model或ModelMap向页面传递数据,如下:
//调用service查询商品信息
Items item = itemService.findItemById(id);
model.addAttribute("item",item);
页面通过${item.XXXX}获取item对象的属性值。
使用Model和ModelMap的效果一样,如果直接使用Model,springmvc会实例化ModelMap。
1.1.2 参数绑定介绍
注解适配器对RequestMapping标记的方法进行适配,对方法中的形参会进行参数绑定,早期springmvc采用PropertyEditor(属性编辑器)进行参数绑定将request请求的参数绑定到方法形参上,3.X之后springmvc就开始使用Converter进行参数绑定。
1.1.3 简单类型
当请求的参数名称和处理器形参名称一致时会将请求参数与形参进行绑定。
1.1.3.1 整型
public String editItem(Modelmodel,Integer id) throws Exception{
}
1.1.3.2 字符串
1.1.3.3 单精度/双精度
1.1.3.4 布尔型
处理器方法:
public String editItem(Modelmodel,Integer id,Boolean status) throwsException
请求url:
http://localhost:8080/springmvc_mybatis/item/editItem.action?id=2&status=false
说明:对于布尔类型的参数,请求的参数值为true或false。
1.1.3.5@RequestParam
使用@RequestParam常用于处理简单类型的绑定。
value:参数名字,即入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入;
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报;
HTTP Status 400 - Required Integer parameter'XXXX' is not present
defaultValue:默认值,表示如果请求中没有同名参数时的默认值
定义如下:
public String editItem(@RequestParam(value="item_id",required=true)String id) { }
形参名称为id,但是这里使用value=" item_id"限定请求的参数名为item_id,所以页面传递参数的名必须为item_id。
注意:如果请求参数中没有item_id将跑出异常:
HTTP Status 500 - Required Integerparameter 'item_id' is not present
这里通过required=true限定item_id参数为必需传递,如果不传递则报400错误,可以使用defaultvalue设置默认值,即使required=true也可以不传item_id参数值
1.1.4 pojo
1.1.4.1简单pojo
将pojo对象中的属性名于传递进来的属性名对应,如果传进来的参数名称和对象中的属性名称一致则将参数值设置在pojo对象中
页面定义如下;
<inputtype="text" name="name"/>
<inputtype="text" name="price"/>
Contrller方法定义如下:
@RequestMapping("/editItemSubmit")
public String editItemSubmit(Items items)throws Exception{
System.out.println(items);
请求的参数名称和pojo的属性名称一致,会自动将请求参数赋值给pojo的属性。
1.1.4.2包装pojo
如果采用类似struts中对象.属性的方式命名,需要将pojo对象作为一个包装对象的属性,action中以该包装对象作为形参。
包装对象定义如下:
Public class QueryVo {
private Items items;
}
页面定义:
<inputtype="text" name="items.name" />
<inputtype="