默认类型的参数绑定
HttpServletRequest,HttpServletResponse,HttpSession,Model
条件
url传递的参数名必须和request.getParameter(参数名一致)
案例
controller
package com.itheima.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.itheima.pojo.Items;
import com.itheima.service.ItenService;
@Controller
public class ItemController {
@Autowired
private ItenService itemService;
/**
* 根据商品ID查询商品信息的
* 返回String类型的
* 当返回String类型是简单的String类型时:不包含forward,redirect这关键字的是简单的String类型
* 返回的默认返回视图名称,走视图解析器
* @return
*/
@RequestMapping("itemEdit")
public String itemEdit(HttpServletRequest request, Model model){//Model:模型,封装数据传递用的
//获取参数
String idStr = request.getParameter("id");
//根据商品ID查询商品信息
Items items = itemService.findItemById(Integer.parseInt(idStr));
//封装数据传给页面
model.addAttribute("item", items);
//返回视图名称
return "editItem";
}
}
service层
package com.itheima.service;
import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.itheima.mapper.ItemsMapper;
import com.itheima.pojo.Items;
@Service
public class ItenServiceImpl implements ItenService {
@Autowired
private ItemsMapper itemsMapper;
@Override
public Items findItemById(Integer id) {
Items items = itemsMapper.selectByPrimaryKey(id);
return items;
}
}
简单类型的参数绑定
8种基本类型和他的包装类
使用@RequestParam常用于处理简单类型的绑定。
value:参数名字,即入参的请求参数名字,如value=“itemId”表示请求的参数 区中的名字为itemId的参数的值将传入
required:是否必须,默认是true,表示请求中一定要有相应的参数,否则将报错
TTP Status 400 - Required Integer parameter 'XXXX' is not present
defaultValue:默认值,表示如果请求中没有同名参数时的默认值
条件
Input框中的name属性名必须和方法形参名一致
package com.itheima.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.itheima.pojo.Items;
import com.itheima.service.ItenService;
@Controller
public class ItemController {
@Autowired
private ItenService itemService;
@RequestMapping("updateItem")
public String updateItem(Integer id,String name,Float price,String detail){
//处理数据
System.out.println("*****id*****"+id);
System.out.println("*****name*****"+name);
return "success";
}
}
问题
有三十个字段
POJO对象类型的参数绑定
条件
Input框中的name属性名必须和方法形中POJO对象中的属性名一致
package com.itheima.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.itheima.pojo.Items;
import com.itheima.service.ItenService;
@Controller
public class ItemController {
@Autowired
private ItenService itemService;
/**
* @MethodName:updateItem
* @Description:POJO对象类型的参数绑定
* @param items
* @return
*/
@RequestMapping("updateItem")
public String updateItem(Items items){
//处理数据
System.err.println(items);
return "success";
}
}
POJO 包装对象的参数绑定
应用场景
高级搜索,不同维度上的搜索
条件
Input框中的name属性名必须和方法形参的POJO包装对象中的属性名的属性名一致
package com.itheima.pojo;
public class QueryVo {
private Items item;
private User user;
set/get...
}
package com.itheima.controller;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.itheima.pojo.Items;
import com.itheima.pojo.QueryVo;
import com.itheima.service.ItenService;
@Controller
public class ItemController {
@RequestMapping("queryItem")
public String queryItem(QueryVo vo){
System.out.println(vo);
return "success";
}
}
自定义类型的参数绑定Converter
应用场景
页面中传递的简单类型的数据,在Controller方法中接收的是复杂类型,springmvc不能帮我们自动转换,这种情况下需要我们手动配置类型转换
例子
当页面中专递的是String类型,方法形参中用Date类型接收,SpringMVC不能帮我们转换类型,需要手动写!
案例
类型转换器
package com.itheima.utils;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.springframework.core.convert.converter.Converter;
/**
* @ClassName: StringToDateConverter
* @Description:
* 参数1:要转换的类型
* 参数2:目标类型
*/
public class StringToDateConverter implements Converter<String, Date> {
@Override
public Date convert(String source) {
//手动转换
try {
Date date = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(source);
return date;
} catch (ParseException e) {
e.printStackTrace();
}
return null;
}
}
在springmvc.xml文件中配置类型转换器
方式1
<!-- 配置注解驱动 -->
<!-- 如果配置此标签,可以不用配置... -->
<mvc:annotation-driven conversion-service="conversionService" />
<!-- 转换器配置 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="com.itheima.utils.StringToDateConverter" />
</set>
</property>
</bean>
方式2:
- 此方法需要独立配置处理器映射器、适配器
- 不再使用<mvc:annotation-driven/>
<!--注解适配器 -->
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="webBindingInitializer" ref="customBinder"></property>
</bean>
<!-- 自定义webBinder -->
<bean id="customBinder" class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="conversionService" ref="conversionService" />
</bean>
<!-- 转换器配置 -->
<bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<bean class="cn.itcast.springmvc.convert.DateConverter" />
</set>
</property>
</bean>
数组类型的参数绑定
应用场景
邮箱中的批量删除,批量标记
条件
Input框中的name属性名必须和方法形参数组名或者POJO包装对象中的数组属性名一致
数组类型的接收方式
- 直接接收数组类型的数据
package com.itheima.controller;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.itheima.pojo.Items;
import com.itheima.pojo.QueryVo;
import com.itheima.service.ItenService;
@Controller
public class ItemController {
@RequestMapping("deleteItem")
public String deleteItem(Integer[] ids){
System.out.println("-----------ids"+Arrays.toString(ids));
return "success";
}
}
- 接收POJO包装对象
package com.itheima.pojo;
public class QueryVo {
private Items item;
private User user;
private Integer[] ids;
set/get...
}
package com.itheima.controller;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.itheima.pojo.Items;
import com.itheima.pojo.QueryVo;
import com.itheima.service.ItenService;
@Controller
public class ItemController {
@RequestMapping("deleteItem")
public String deleteItem(QueryVo vo){
System.out.println("-----------ids"+vo);
return "success";
}
}
list集合类型的参数绑定
应用场景
批量修改
条件
Input框中的name属性名必须和方法形参的POJO包装对象中的属性名的下标的属性名一致
怎么接收
SpringMVC不支持直接接收,只能接收POJO包装对象
package com.itheima.pojo;
import java.util.List;
public class QueryVo {
private Items item;
private User user;
private List<Items> items;
set/get...
}
package com.itheima.controller;
import java.util.Arrays;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.itheima.pojo.Items;
import com.itheima.pojo.QueryVo;
import com.itheima.service.ItenService;
@Controller
public class ItemController {
@RequestMapping("updateItems")
public String updateItem(QueryVo vo){
return "success";
}
}