本文主要介紹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>