您的位置:首页 > 编程语言 > Java开发

springmvc参数绑定

2016-07-25 15:09 417 查看

五、SpringMVC 参数绑定方式

5.1 绑定基本数据类型

1、通过request的API获取参数

RequestMapping("/itemEdit")
public ModelAndView itemEdit(HttpServletRequest request) {
//从Request中取id
String strId = request.getParameter("id");
Integer id = null;
//如果id有值则转换成int类型
if (strId != null && !"".equals(strId)) {
id = new Integer(strId);
} else {
//出错
return null;
}
Items items = itemService.getItemById(id);
//创建ModelAndView
ModelAndView modelAndView = new ModelAndView();
//向jsp传递数据
modelAndView.addObject("item", items);
//设置跳转的jsp页面
modelAndView.setViewName("editItem");
return modelAndView;
}


2、直接在方法形参中绑定

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

@RequestMapping("/itemEdit")
public String itemEdit(Integer id, Model model) {
Items items = itemService.getItemById(id);
//向jsp传递数据
model.addAttribute("item", items);
//设置跳转的jsp页面
return "editItem";
}


3、使用@RequestParam进行参数绑定

使用@RequestParam常用于处理简单类型的绑定。
value:参数名字,即传入参的请求参数名字,如value=“item_id”表示请求的参数区中的名字为item_id的参数的值将传入;
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报;
TTP 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 Integer parameter 'item_id' is not present
这里通过required=true限定item_id参数为必需传递,如果不传递则报400错误,可以使用defaultvalue设置默认值,即使required=true也可以不传item_id参数值


5.2 POJO类型

如果提交的参数很多,或者提交的表单中的内容很多的时候可以使用pojo接收数据。要求pojo对象中的属性名和表单中input的name属性一致。
页面定义如下;

<input type="text" name="name"/>
<input type="text" name="price"/>

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


···

@RequestMapping(“/updateitem”)

public String updateItem(Items items) {

itemService.updateItem(items);

return “success”;

}

···

注意:提交的表单中不要有日期类型的数据,否则会报400错,如果配置了时间转换器就可以解决这个问题。

5.3 包装的POJO类型

包装对象定义如下:

Public class QueryVo {
private Items items;
}


页面设置如下:

<input type="text" name="items.name" />
<input type="text" name="items.price" />


方法定义如下:

@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo) {
System.out.println(queryVo.getItems().getName());
System.out.println(queryVo.getItems().getPrice());
return null;
}


数据会自动封装到形参中。

5.4 自定义参数类型绑定(时间转换器)

由于日期数据有很多种格式,所以springmvc没办法把字符串转换成日期类型。所以需要自定义参数绑定。前端控制器接收到请求后,找到注解形式的处理器适配器,对RequestMapping标记的方法进行适配,并对方法中的形参进行参数绑定。在springmvc这可以在处理器适配器上自定义Converter进行参数绑定。如果使用<mvc:annotation-driven/>可以在此标签上进行扩展。
自定义时间转换器,自定义的转换器需要实现Converters接口,并指定泛型<S,T> S代表的是源类型,T代表的是目标类型,具体代码如下:


public class DateConverter implements Converter<String, Date> {

@Override
public Date convert(String source) {
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
try {
return simpleDateFormat.parse(source);
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}


配置时间转换器,在springmvc.xml中配置时间转换器,并在mvc注册驱动中声明该转换器


<!-- 加载注解驱动 -->
<mvc:annotation-driven conversion-service="conversionService"/>
<!-- 转换器配置 -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.itcast.springmvc.convert.DateConverter"/>
</set>
</property>
</bean>


5.6 数组参数类型绑定(页面同名name参数)

页面如下:

<td><input name="ids" value="1" type="checkbox"></td>
<td><input name="ids" value="2" type="checkbox"></td>
<td><input name="ids" value="3" type="checkbox"></td>


程序中用数组进行接收,可以使用POJO中的数组接收,也可以用形参中的数组进行接收。代码如下:

@RequestMapping("/queryitem")
public String queryItem(QueryVo queryVo, String[] ids) {
System.out.println(queryVo.getItems().getName());
System.out.println(queryVo.getItems().getPrice());
System.out.println(ids.toString());
return null;
}


5.5 List集合类型绑定

页面如下:

<input type="text" name=" itemsList[0].id" value=""/>
<input type="text" name=" itemsList[1].id" value=""/>
<input type="text" name=" itemsList[2].id" value=""/>


POJO类中如下:

public List<Items> getItems() {
return items;
public void setItems(List<Items> items) {
this.items = items;
}
private List<Items> items = new ArrayList<Items>();


方法上代码如下:

@RequestMapping("queryitem")
public String queryitem(QueryVO qv) throws MyException{

for(Items item :qv.getItems()){
System.out.println(item.getId());
}

return "redirect:/item/findAllItems.action";
}


六 @RequestMapping以及Controller方法返回值详解

6.1 @RequestMapping

通过RequestMapping注解可以定义不同的处理器映射规则。

1、URL路径映射

@RequestMapping(value="/item")或@RequestMapping("/item)
value的值是数组,可以将多个url映射到同一个方法


2、 窄化请求映射

在class上添加@RequestMapping(url)指定通用请求前缀, 限制此类下的所有方法请求url必须以请求前缀开头,通过此方法对url进行分类管理。
如下:
@RequestMapping放在类名上边,设置请求前缀
@Controller
@RequestMapping("/item")
方法名上边设置请求映射url:
@RequestMapping放在方法名上边,如下:
@RequestMapping("/queryItem ")
访问地址为:/item/queryItem


3、请求方法限定

   限定GET方法
@RequestMapping(method = RequestMethod.GET)
如果通过Post访问则报错:
HTTP Status 405 - Request method 'POST' not supported
例如:
@RequestMapping(value="/editItem",method=RequestMethod.GET)
   限定POST方法
@RequestMapping(method = RequestMethod.POST)
如果通过Post访问则报错:
HTTP Status 405 - Request method 'GET' not supported
   GET和POST都可以
@RequestMapping(method={RequestMethod.GET,RequestMethod.POST})


6.2 Controller返回值详解

1、返回ModelAndView

controller方法中定义ModelAndView对象并返回,对象中可添加model数据、指定view。

ModelAndView中封装了返回需要在页面上显示的参数,以及相应的逻辑视图

代码如下:

public ModelAndView findAll(){
ModelAndView modelAndView = new ModelAndView();
modelAndView.addObject("msg","测试信息");
//根据配置的视图解析器,会跳转到WEB-INF/jsp/ceshi.jsp中
modelAndView.setViewName("ceshi");
return modelAndView;
}


modelAndView底层是通过request实现的

2、返回void

在controller方法形参上可以定义request和response,使用request或response指定响应结果:
2.1 使用request转向页面,如下:
request.getRequestDispatcher("页面路径").forward(request, response);

2.2 也可以通过response页面重定向:
response.sendRedirect("url")

2.3 也可以通过response指定响应结果,例如响应json数据如下:
response.setCharacterEncoding("utf-8");
response.setContentType("application/json;charset=utf-8");
response.getWriter().write("json串");


3、返回字符串

3.1 逻辑视图名

controller方法返回字符串可以指定逻辑视图名,通过视图解析器解析为物理视图地址。
//指定逻辑视图名,经过视图解析器解析为jsp物理路径:/WEB-INF/jsp/item/editItem.jsp
return "item/editItem";

3.2 Redirect重定向

放在model中的数据,无论是使用请求转发还是请求重定向,数据都能转到下一个页面或方法
相对路径和绝对路径:
任何时候都可以使用绝对路径,绝对路径以”/”开头,在页面及程序外部时,”/”代表的是服务器项目根目录,在程序内部代码中,”/”代表的是当前项目的根目录
相对路径是相对访问路径的上一级路径,不能以”/”开头
Contrller方法返回结果重定向到一个url地址,如下商品修改提交后重定向到商品查询方法,参数无法带到商品查询方法中。
//重定向到queryItem.action地址,request无法带过去
return "redirect:queryItem.action";
redirect方式相当于“response.sendRedirect()”,转发后浏览器的地址栏变为转发后的地址,因为转发即执行了一个新的request和response。
由于新发起一个request原来的参数在转发时就不能传递到下一个url,如果要传参数可以/item/queryItem.action后边加参数,如下:
/item/queryItem?...&…..

3.3 forward转发

controller方法执行后继续执行另一个controller方法,如下商品修改提交后转向到商品修改页面,修改商品的id参数可以带到商品修改方法中。
//结果转发到editItem.action,request可以带过去
return "forward:editItem.action";
forward方式相当于“request.getRequestDispatcher().forward(request,response)”,转发后浏览器地址栏还是原来的地址。转发并没有执行新的request和response,而是和转发前的请求共用一个request和response。所以转发前请求的参数在转发后仍然可以读取到。


4、返回是void 和字符串时,参数传递

在controller方法行惨重传入Model model,可以通过model进行参数传递,model中封转的参数无论是请求转发还是重定向都有效。


@RequestMapping("ceshi")
public String ceshi(Model model){
model.addAttribute("ceshi", "ceshi");
return "ceshi";
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: