springmvc作为表现层框架,最重要的就是参数绑定。
- Springmvc默认支持的类型
- 简单数据类型
- Pojo类型
- Pojo包装类型
- 自定义参数绑定
一、Springmvc默认支持的类型
我们点击修改,就要进入详情页,这是,就要拿着id去查数据,找到对应的item。
ItemsController
/**
* springmvc中默认支持的参数类型:也就是说在Controller方法中,可以加入这些,也可以不加
* HttpServletRequest
* HttpServletResponse
* HttpSession
* Model
*/
@RequestMapping("/itemEdit")
public String itemEdit(HttpServletRequest request, HttpServletResponse response, HttpSession session, Model model){
String idStr = request.getParameter("id");
Items items = itemsService.findItemsById(Integer.parseInt(idStr));
//Model模型:模型中放入了返回给页面的数据
//model底层其实就是用的request域来传递数据,但是对request域进行了扩展
model.addAttribute("item", items);
//如果springmvc方法返回一个简单的string字符串,那么springmvc就会认为这个字符串就是页面的名称
return "editItem";
}
ItemsServiceImpl
@Override
public Items findItemsById(Integer id) {
Items items = itemsMapper.selectByPrimaryKey(id);
return items;
}
这个例子就演示了,从request中获取前端的参数,把返回内容,交给model。
Controller中,response和session没有用到,所以,删掉也没问题。
从这个例子,我们还看出,Controller方法返回值是ModelAndView或是String,都可以返回到指定页面。
二、简单数据类型
我们对详情进行保存
ItemsController
@RequestMapping("/updateitem")
public String update(Integer id, String name, Float price, String detail){
Items items = new Items();
items.setId(id);
items.setName(name);
items.setPrice(price);
items.setDetail(detail);
items.setCreatetime(new Date());
itemsService.updateItems(items);
return "success";
}
ItemsServiceImpl
@Override
public void updateItems(Items items) {
itemsMapper.updateByPrimaryKeyWithBLOBs(items);
}
这个时候,我们保存,传入的参数会乱码。需要在web.xml中配置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>/*</url-pattern>
</filter-mapping>
Springmvc默认支持的类型对于get请求中文参数出现乱码解决方法有两个:
修改tomcat配置文件添加编码与工程编码一致,如下:
<Connector URIEncoding="utf-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
另外一种方法对参数进行重新编码:
String userName new
String(request.getParamter("userName").getBytes("ISO8859-1"),"utf-8")
ISO8859-1是tomcat默认编码,需要将tomcat编码后的内容按utf-8编码
springmvc可以直接接收基本数据类型,包括string,springmvc可以帮你自动进行转换
Controller方法接收的参数的变量名称必须要等于页面上input框的name属性值
三、pojo类型
@RequestMapping("/updateitem")
public String update(Items items) {
items.setCreatetime(new Date());
itemsService.updateItems(items);
return "success";
}
springmvc可以直接接收pojo类型:要求页面上input框的name属性必须等于pojo属性名称
四、vo类型的对象
public class QueryVo {
// 商品对象
private Items items;
// 订单对象
public Items getItems() {
return items;
}
public void setItems(Items items) {
this.items = items;
}
}
ItemsController
@RequestMapping("/search")
public String search(QueryVo vo){
System.out.println(vo);
return "";
}
打断点,可以看到前端传过来的参数。
五、自定义转换器
把editItem.jsp的日期input放开
修改界面点击提交的时候就会报400错误。因为,日期,从前端传过来的是字符串,springmvc没有默认的把它转成Date类型。
/**
* 自定义全局字符串转日期的转化器; S - source T - target
*/
public class CustomGlobalStrToDateConverter 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
<!-- 配置自定义转换器。一定要将id配置到注解驱动上 -->
<bean id="conversionService"
class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<set>
<!-- 指定自定义转换器的全路径名称 -->
<bean class="com.ken.controller.converter.CustomGlobalStrToDateConverter" />
</set>
</property>
</bean>
再次访问的时候,前端的字符串类型,就能转换了。
springmvc和struts2的区别:
- springmvc的入口是一个servlet即前端控制器,而struts2入口是一个filter过虑器。
- springmvc是基于方法开发(一个url对应一个方法),请求参数传递到方法的形参,可以设计为单例或多例(建议单例),struts2是基于类开发,传递参数是通过类的属性,只能设计为多例。
- Struts采用值栈存储请求和响应的数据,通过OGNL存取数据, springmvc通过参数解析器是将request请求内容解析,并给方法形参赋值,将数据和视图封装成ModelAndView对象,最后又将ModelAndView中的模型数据通过reques域传输到页面。Jsp视图解析器默认使用jstl。