SpringMVC入门(二)—— 参数的传递、Controller方法返回值、json数据交互、异常处理、图片上传、拦截器
一、参数的传递
1、简单的参数传递
1 /* @RequestParam用法:入参名字与方法名参数名不一致时使用{ 2 * value:传入的参数名,required:是否必填,defaultValue:默认值 3 * } 4 */ 5 @RequestMapping("itemEdit") 6 public ModelAndView itemEdit(@RequestParam(value="id",required=true,defaultValue="1")Integer id){....}
2、Model/ModelMap
1 /** 2 * 演示返回String,通过Model/ModelMap返回数据模型 3 * 跳转修改商品信息页面 4 * @param id 5 * @return 6 */ 7 @RequestMapping("itemEdit") 8 public String itemEdit(@RequestParam("id")Integer ids,Model m,ModelMap model){ 9 //查询商品信息 10 Item item = itemServices.getItemById(ids); 11 //通过Model把商品数据返回页面 12 model.addAttribute("item", item); 13 //返回String视图名字 14 return "itemEdit"; 15 }
3、pojo与包装pojo
要点:表单提交的name属性必需与pojo的属性名称一致。
1 /** 2 * 演示传递pojo参数 3 * 更新商品信息 4 * @return 5 */ 6 @RequestMapping("updateItem") 7 public String updateItem(Item item,Model model){ 8 //更新商品 9 itemServices.update(item); 10 //返回商品模型 11 model.addAttribute("item", item); 12 //返回担任提示 13 model.addAttribute("msg", "修改商品成功"); 14 //返回修改商品页面 15 return "itemEdit"; 16 }
4、自定义参数绑定
①自定义转换器
1 /** 2 * 日期转换器 3 * S:source 要转换的源类型 4 * T:目标,要转换成的数据类型 5 * @author Steven 6 */ 7 public class DateConvert implements Converter<String, Date> { 8 9 @Override 10 public Date convert(String source) { 11 Date result = null; 12 try { 13 SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); 14 result = sdf.parse(source); 15 } catch (ParseException e) { 16 e.printStackTrace(); 17 } 18 return result; 19 } 20 }
② 配置日期转换器
1 <!-- 配置注解驱动,相当于同时使用最新处理器映射跟处理器适配器,对json数据响应提供支持 --> 2 <!-- 使用自定义转换器 --> 3 <mvc:annotation-driven conversion-service="MyConvert" /> 4 5 <!-- 定义转换器 --> 6 <bean id="MyConvert" class="org.springframework.format.support.FormattingConversionServiceFactoryBean"> 7 <property name="converters"> 8 <set> 9 <bean class="com.cenobitor.springmvc.utils.DateConvert" /> 10 </set> 11 </property> 12 </bean>
5、数组参数传递
1 @RequestMapping("/queryItem") 2 public String queryItem(QueryVo vo,Integer[] ids){ 3 System.out.println(vo); 4 if (ids != null && ids.length > 0){ 5 for (Integer id : ids) { 6 System.out.println(id); 7 } 8 } 9 return "itemList"; 10 }
二、Controller方法返回值
1、返回ModelAndView
1 @RequestMapping("itemList") 2 public ModelAndView queryItemList(){ 3 4 ModelAndView modelAndView = new ModelAndView(); 5 modelAndView.setViewName("itemList"); 6 List<Item> list = itemService.getItemList(); 7 modelAndView.addObject("itemList",list); 8 return modelAndView; 9 }
2、返回void:使用原始的request、response处理
3、返回String
①返回视图的名字
②转发,跳转action
1 @RequestMapping(value = "updateItem",method = RequestMethod.POST) 2 public String updateItem(Item item, Model model){ 3 model.addAttribute("item",item); 4 return "forward:/itemEdit.action"; 5 }
③重定向,跳转action
return "redirect:/itemEdit.action";
三、json数据交互
1、依赖jar包
jackson-annotation-2.4.0.jar
jackson-cort-2.4.0.jar
jackson-databind-2.4.2.jar
2、代码演示
1 /** 2 * json数据交互演示 3 * @param item2 4 * @return 5 */ 6 @RequestMapping("getItem") 7 //@ResponseBody把pojo转成json串响应用户 8 @ResponseBody 9 //@RequestBody用于接收用户传入json串转成pojo 10 public Item getItem(@RequestBody Item item2) { 11 System.out.println("接收到的json商品数据为:" + item2); 12 Item item = itemServices.getItemById(3); 13 return item; 14 }
四、异常处理
1、需实现HandlerExceptionResolver
1 /** 2 * 全局异常处理器 3 * @author Steven 4 * 5 */ 6 public class CustomerException implements HandlerExceptionResolver { 7 8 @Override 9 public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object hanlder, 10 Exception e) { 11 //记录日志 12 e.printStackTrace(); 13 //错误消息 14 String msg = "很抱歉,系统发生异常了,请联系管理员"; 15 16 //响应用户错误提示 17 ModelAndView mav = new ModelAndView(); 18 //返回错误消息 19 mav.addObject("msg", msg); 20 //响应错误提示页面 21 mav.setViewName("msg"); 22 return mav; 23 } 24 }
2、在springmvc.xml中配置全局异常处理器
1 <!-- 配置全局异常处理器 --> 2 <bean class="com.cenobitor.exception.CustomerException"/>
五、图片上传
1、需要支持的jar包
commons-fileupload-1.2.2.jar
commons-io-2.4.jar
2、配置多媒体解析器
<!-- 配置多媒体处理器 --> <!-- 注意:这里id必须填写:multipartResolver --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 最大上传文件大小 --> <property name="maxUploadSize" value="8388608" /> </bean>
3、注意事项
① 表单需添加enctype="multipart/form-data" 属性
② controller层接收的入参需要添加MultipartFile picFile,其中picFile为表单中对应的文件name属性名。
③ 保存图片使用绝对路径,访问使用虚拟路径
4、controller代码
1 @RequestMapping(value = "updateItem", method = { RequestMethod.POST, RequestMethod.GET }) 2 public String updateItem(Item item, Model model, MultipartFile picFile) throws Exception { 3 4 // 图片新名字 5 String name = UUID.randomUUID().toString(); 6 // 图片原名字 7 String oldName = picFile.getOriginalFilename(); 8 // 后缀名 9 String exeName = oldName.substring(oldName.lastIndexOf(".")); 10 11 File pic = new File("D:\\WebWork\\" + name + exeName); 12 // 保存图片到本地磁盘 13 picFile.transferTo(pic); 14 // 更新商品图片信息 15 item.setPic(name + exeName); 16 17 itemServices.update(item); 18 model.addAttribute("item", item); 19 model.addAttribute("msg", "修改商品成功"); 20 return "itemEdit"; 21 }
六、拦截器
1、需实现HandlerInterceptor
1 /** 2 * 自定义拦截器 3 * @author Steven 4 * 5 */ 6 public class MyInterceptor1 implements HandlerInterceptor { 7 8 //在preHandle方法返回true并且Controller方法完全执行完后被执行 9 //处理异常、记录日志 10 @Override 11 public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) 12 throws Exception { 13 System.out.println("MyInterceptor1.afterCompletion....."); 14 } 15 16 //在Controller方法执行后,返回ModelAndView之前被执行 17 //设置或者清理页面共用参数等等 18 @Override 19 public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) 20 throws Exception { 21 System.out.println("MyInterceptor1.postHandle....."); 22 } 23 24 //在Controller方法执行前被执行 25 //登录拦截、权限认证等等 26 @Override 27 public boolean preHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2) throws Exception { 28 29 System.out.println("MyInterceptor1.preHandle....."); 30 31 //返回true放行,false拦截 32 return true; 33 } 34 35 }
2、在springmvc.xml配置拦截器
1 <!-- 拦截器定义 --> 2 <mvc:interceptors> 3 <!-- 定义一个拦截器 --> 4 <mvc:interceptor> 5 <!-- path配置</**>拦截所有请求,包括二级以上目录,</*>拦截所有请求,不包括二级以上目录 --> 6 <mvc:mapping path="/**"/> 7 <bean class="com.cenobitor.springmvc.interceptor.MyInterceptor1" /> 8 </mvc:interceptor> 9 </mvc:interceptors>