SpringMVC高階開發功能實現過程解析
一. 全域性的異常處理器
1、編寫一個自定義的異常類,區分哪些異常是系統異常,哪些異常是使用者不正當操作的異常
//繼承Exception public class UserException extends Exception{ private static final long serialVersionUID = -8469276157483476569L; public UserException() { super(); } public UserException(String message,Throwable cause,boolean enableSuppression,boolean writableStackTrace) { super(message,cause,enableSuppression,writableStackTrace); } public UserException(String message,Throwable cause) { super(message,cause); } public UserException(String message) { super(message); } public UserException(Throwable cause) { super(cause); }
2、編寫一個全域性異常處理器,這個處理器必須實現HandlerExceptionResolver
//將異常處理類交給spring容器管理 @Component public class MyExceptionHandler implements HandlerExceptionResolver { @Override public ModelAndView resolveException(HttpServletRequest request,HttpServletResponse response,Object handler,Exception ex) { // ex 接收是丟擲的異常物件 // 分類處理,自定義異常,直接響應 錯誤資訊 // 系統異常,響應的: 系統錯誤,請聯絡管理員 ModelAndView modelAndView = new ModelAndView();if (ex instanceof UserException) {//使用者異常 modelAndView.addObject("error",ex.getMessage()); } else {//系統異常 modelAndView.addObject("error","系統錯誤,聯絡管理員!!!"); } modelAndView.setViewName("error"); return modelAndView; }
3、 在springMVC的配置檔案中配置全域性的異常處理器
①使用Component ②在springmvc配置檔案中手動新增<bean/>
4、掃描這個exception包中的註解
二、響應json支援
AJAX: 要求後臺響應的是資料,後臺重定向,轉發到一個頁面,把這個頁面當成一個數據,響應給ajax,
後臺: java物件
前臺: ajax--> js物件,使用json,需要後臺把java物件轉換為json格式的字串,
Servlet: 使用 json-lib,手動呼叫JSONObject
SpringMVC轉換json,使用: 1)jackson *** 2) fastjson
1、匯入jackson的依賴: 注意新增完把<type>bundle</type>刪除,會附帶匯入所需要的jar
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.10.0</version> </dependency>
Controller方法的返回值 java物件,需要配合@ResponseBody,把方法的返回值作為資料響應給前端,****
如果是一個java物件,而且匯入json的相關依賴(jaskson/fastJson),呼叫轉換器,把java物件轉換為json格式字串響應給前端
把日期轉換為 指定格式的字串
@DateTimeFormat(pattern = "yyyy-MM-dd") // SpringMVC的註解,把前端的字串轉換為Date
@JsonFormat(pattern = "yyyy-MM-dd") // jackson的註解,把Date轉換為json指定格式的字串@JsonFormat(pattern = "yyyy-MM-dd")
private Date brithday;[/code]
忽略某個屬性轉換為json
@JsonIgnoreprivate String password;
@RequestBody:主要用來接收前端傳遞給後端的json字串中的資料的(請求體中的資料的),只能是post提交,get沒有請求體
註解用於讀取http請求的內容(字串),通過springmvc提供的HttpMessageConverter介面將讀到的內容轉換為json、xml等格式的資料並繫結到controller方法的引數上。
//前端傳送json,響應json @RequestMapping("/queryUserByCondition.action") @ResponseBody public User queryUserByCondition( @RequestBody User user) throws Exception{ return user; }
前端程式碼
//請求的是json function requestJson(){ //請求引數是json // 預設情況下,data中json,變成js物件,變成key/value //contentType:"application/json;charset=utf-8",改為json 格式的傳輸 $.ajax({ url:"${pageContext.request.contextPath }/user/queryUserByCondition.action",type:"post",//data:"id=2&username=張三&sex=男&brithday=1999-12-21",contentType:"application/json;charset=utf-8",data:'{"id":3,"username":"李四","sex":"男","brithday":"2012-12-12"}',success:function(rs){ alert(rs.username+"-->"+rs.sex); // json 字串轉換為js物件 },dataType:"json" }); }
三、檔案上傳
1、對頁面的要求:
form 的method:postform的enctype: 預設值: application/x-www-form-urlencoded 一定設定為: multipart/form-data使用<input type=”file”> 選擇檔案
2、對頁面的要求:
匯入檔案上傳的依賴: commons-fileupload commons-io
<dependency> <groupId>commons-fileupload</groupId> <artifactId>commons-fileupload</artifactId> <version>1.4</version> </dependency>
3、在springMVC配置檔案上傳的解析器
<!-- 檔案上傳 --> <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver"> <!-- 設定最大的上傳檔案大小 :10M--> <property name="maxUploadSize" value="10485760"></property> </bean>
注意:bean的id一定為multipartResolver,否則獲取不到資料
4、檔案程式碼
@PostMapping("/addUser.action") public String addUser(User user,MultipartFile photo,Model model) throws Exception{ if(photo == null) { throw new UserException("請選擇圖片"); }else { //儲存檔案 String savePath = "D:\\upload"; //File類 File pathFile = new File(savePath); if(!pathFile.exists()) { //建立資料夾 pathFile.mkdirs(); } //檔名取名: 時間戳 UUID //獲取上傳檔案的字尾名 String uploadFileName = photo.getOriginalFilename(); String suffix = uploadFileName.substring(uploadFileName.lastIndexOf(".")); String saveFilename = UUID.randomUUID().toString().replace("-","").toUpperCase()+suffix; //儲存 photo.transferTo(new File(savePath,saveFilename)); //給user物件的photoPath屬性賦值 user.setPhotoPath(saveFilename); //呼叫業務層,儲存使用者 userService.saveUser(user); model.addAttribute("msg","儲存成功"); } return "msg"; }
<img src="/img/${user.photoPath }"/>
需要在tomcat中配置對映路徑
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。