处理器方法绑定形参
* 默认支持的参数类型
HttpSerlvetRequest,HttpServletResponse,HttpSession,Model/ModelMap
除了ModeAndView外,还可以使用Model/ModelMap向页面传递参数,Model.addattribute(key,value)
处理器方法,修改如下,返回视图名和数据
@Controller public class ItemController { @RequestMapping("/itemList.action") public String itemList(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model ){ SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd HH:mm:ss"); List<Item> list = new ArrayList<Item>(); list.add(new Item(1, "小米1", sdf.format(new Date()), "千元神机!")); list.add(new Item(2, "小米2", sdf.format(new Date()), "千元神机!")); list.add(new Item(3, "小米3", sdf.format(new Date()), "千元神机!")); list.add(new Item(4, "小米4", sdf.format(new Date()), "千元神机!")); list.add(new Item(5, "小米5", sdf.format(new Date()), "千元神机!")); model.addAttribute("list", list); return "itemList"; } }
* 绑定简单类型
当请求的参数名称和处理器形参名称一致时会将请求参数和形参进行绑定。
例如请求的url: http://localhost:8080/mfo?id=1,可以绑定到形参下;
public String itemList(Model model, Integer id )
参数类型建议使用包装数据类型,因为基础数据类型不能为null,举个例子说明:
如果提交的参数类型是int,没有提交这个形参的时候,得到的是0 ,无法分别到底是提交的0还是没有提交
@RequestParam
用于处理简单类型的绑定,属性说明
value:入参的参数名称
required:请求中是否一定要携带参数,如果设置为true,没有参数,将报错
defaultValue:默认值
public String itemList(Model model, @RequestParam(value="itemId",required=false,defaultValue="") Integer id )
这样,请求中的参数itemId将和形参的id进行绑定
* 绑定pojo类型数据
要求:pojo对象的属性名和表单中input的name属性一致
表单:
<form action="${pageContext.request.contextPath}/insertItem.action" method="post"> 编号:<input name="id" ><br/> 名称:<input name="name" ><br/> 出厂时间:<input name="time" ><br/> 备注:<input name="remark" ><br/> <input type="submit" value="提交"> </form>
映射处理器方法:
@RequestMapping(value={"/insertItem.action"}) public String insertItem(Model model,Item item){ return "itemList"; }
测试下,打断点,可以看到提交的参数,都已经封装到pojo属性中
注意到:提交的表单不要有日期类型的数据,否则会报错400,如果需要提交日期类型的数据,需要自定义参数绑定的内容
SpringMVC乱码解决
post中文乱码
<!-- 解决post提交乱码 --> <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>*.action</url-pattern> </filter-mapping>
get中文乱码
* 修改tomcat的server.xml
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
* 手动转码
new String(request.getParameter("id").getBytes("iso8859-1"), "utf-8");
绑定pojo包装类型
包装类:
public class QueryVo { private Item item; public Item getItem() { return item; } public void setItem(Item item) { this.item = item; } }
处理器方法
public String insertItem(QueryVo queryVo){表单
<form action="${pageContext.request.contextPath}/insertItem.action" method="post"> 编号:<input type="text" name="item.id" ><br/> 名称:<input type="text" name="item.name" ><br/> 出厂时间:<input type="text" name="item.time" ><br/> 备注:<input type="text" name="item.remark" ><br/> <input type="submit" value="提交"> </form>
注意:提交的参数的名称和包装类中属性一致
自定义参数绑定(解决日期类型转换)
SpringMVC无法将字符串转换为日期类型,需要自定义参数绑定。
前端控制器接受到请求后,是以处理适配器适配@RequestMapping标记的方法,并进行参数绑定。
在使用<mvc:annoation-driven/>注解驱动加载处理器适配器,并在此进行转换器配置。
自定义转换器
public class DateConverter implements Converter<String, Date>{ @Override public Date convert(String datetime) { SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); Date date = null; try { date = sdf.parse(datetime); } catch (ParseException e) { e.printStackTrace(); } return date; } }
xml配置
<mvc:annotation-driven conversion-service="conversionService"></mvc:annotation-driven> <!-- 转换器配置 --> <bean id="conversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> <property name="converters"> <set> <bean class="cn.bing.converter.DateConverter" /> </set> </property> </bean>
pojo类Item的time类型,改为Date,再测试,页面还是上面的页面
测试,断点捕获,类型转换成功。
SpringMVC和Struts2的比较
1. SpringMVC的入口是一个前端控制器,Struts2入口是一个filter
2. SpringMVC是基于方法开发,一个url对应一个方法,设计为单例的,Struts2是基于类开发,传递参数通过类的属性,一个请求,一个实例,设计为多例的
3. Struts采用值栈存储和响应数据,OGNL存取数据,Spring通过ModelAndView对象封装数据。jstl取数据