這份筆記詳細介紹了Spring MVC中的關鍵概念。在Ajax集成部分,通過引入相關依賴和開發控制器,展示瞭如何以JSON格式返回數據。特別強調了日期格式修正,使用@JsonFormat註解來規範日期顯示。 攔截器章節深入探討了攔截器的作用、特點和開發過程。與AOP進行對比,並解釋了其在請求處理階段... ...
第七章、SpringMVC與Ajax集成
-
引入相關依賴
<dependency> <groupId>com.fasterxml.jackson.core</groupId> <artifactId>jackson-databind</artifactId> <version>2.9.8</version> </dependency>
-
開發控制器
@Controller @RequestMapping("json") public class JsonController { /** * 引入jackson庫可以使用@ResponseBody自動轉換為json格式數據【推薦】 */ @RequestMapping("showAll") public @ResponseBody List<User> findAll() { //1.收集數據 //2.調用業務 List<User> users = new ArrayList<>(); users.add(new User(UUID.randomUUID().toString(), "小紅", 23, new Date())); users.add(new User(UUID.randomUUID().toString(), "小名", 29, new Date())); users.add(new User(UUID.randomUUID().toString(), "小撒", 25, new Date())); return users; } /** * 傳統寫法:引入阿裡fastjson手動轉換為json格式數據 */ @RequestMapping("findAll") public void findAll(HttpServletResponse response) throws IOException { //1.收集數據 //2.調用業務 List<User> users = new ArrayList<>(); users.add(new User(UUID.randomUUID().toString(), "小陳", 23, new Date())); users.add(new User(UUID.randomUUID().toString(), "小名", 29, new Date())); users.add(new User(UUID.randomUUID().toString(), "小撒", 25, new Date())); // fastjson String s = JSONObject.toJSONStringWithDateFormat(users, "yyyy-MM-dd"); response.setContentType("application/json;charset=UTF-8"); response.getWriter().println(s); } }
-
日期格式修正
@JsonFormat(pattern = "yyyy-MM-dd") private Date bir;
可以正常響應
第八章、SpringMVC的攔截器
-
攔截器 :Interceptor 攔截 中斷
類似於javaweb中的Filter,不過沒有Filter那麼強大
-
作用
Spring MVC的攔截器是一種用於在請求處理過程中進行預處理和後處理的機制。攔截器可以在請求到達控制器之前和之後執行一些操作,例如日誌記錄、許可權驗證、數據處理等。
-
攔截器特點
- 請求到達會經過攔截器,響應回來同樣會經過攔截器
- 攔截器只能Controller的請求,不能攔截jsp、靜態資源相關請求
- 攔截器可以中斷請求軌跡
-
開發攔截器
-
類 實現
implements HandlerInterceptor
介面中的方法 -
配置攔截器
註冊攔截器對象 bean id class=””
配置攔截器攔截請求路徑
-
-
編碼和測試結果
攔截器介面的實現
public class MyInterceptor implements HandlerInterceptor { @Override //**參數1:當前請求對象 參數2:當前請求響應對象 參數3:當前請求的控制器對應的方法對象** public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("handler = " + ((HandlerMethod)handler).getMethod().getName() ); System.out.println("MyInterceptor.preHandle"); //強制用戶登錄 Object user = request.getSession().getAttribute("user"); // if (user == null) { // // 重定向到登錄頁面 // response.sendRedirect(request.getContextPath() + "/login.jsp"); // return false; // } return HandlerInterceptor.super.preHandle(request, response, handler); } @Override // 參數1、2、3同上 **參數4:當前控制器方法的返回值** public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("modelAndView = " + modelAndView); System.out.println("MyInterceptor.postHandle"); HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } @Override // 參數1、2、3同上 **參數4:請求過程中出現異常時的異常對象** public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("MyInterceptor.afterCompletion"); if (ex != null) { System.out.println("ex.getMessage() = " + ex.getMessage()); } HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } }
dispatcher.xml 配置攔截器
<!--註冊攔截器--> <bean id="myInterceptor" class="com.baizhi.interceptors.MyInterceptor"/> <!--配置攔截器--> <mvc:interceptors> <!--配置一個攔截器--> <mvc:interceptor> <!-- mvc:mapping 代表攔截哪個請求路徑--> <mvc:mapping path="/json/test"/> <!--排除具體地攔截請求--> <mvc:exclude-mapping path="/json/showAll"/> <!--使用攔截器--> <ref bean="myInterceptor"/> </mvc:interceptor> </mvc:interceptors>
進行測試
@RequestMapping("test") public String test() { System.out.println("JsonController.test"); // throw new RuntimeException(); return "index"; }
按預期執行順序執行
看到攔截器的執行順序,我們會聯想到Spring中的AOP,兩者的底層邏輯都是通過動態代理實現的,雖然攔截器和AOP都可以用於在請求處理過程中添加額外的邏輯,但攔截器更專註於請求處理階段的任務,而AOP更適用於在不同模塊中實現橫切關註點的功能。
關於動態代理和AOP底層可以看之前學習的:Spring5學習隨筆-AOP底層實現(JDK、CGlib)、實現切麵(@Aspect)
Spring5學習隨筆-AOP系列Spring動態代理
第九章、SpringMVC中的全局異常處理
-
SpringMVC作為一個控制主要作用
- 處理請求 接收請求數據 調用業務對象
- 請求響應 跳轉對應視圖展示數據
-
現有控制器開發存在問題?
-
在處理用戶請求出現運行時異常直接響應給用戶的是一個錯誤節目,對於用戶的使用體驗不友好。
沒有使用全局異常處理時
-
-
全局異常處理機制
作用:用來解決整合系統中任意一個控制器拋出異常時的統一處理入口
-
編碼
開發控制類
public class GlobalExceptionResolver implements HandlerExceptionResolver { /** * 用來處理髮生異常時的方法 * * @param request 當前請求對象 * @param response 當前請求對應的響應對象 * @param handler 當前請求的方法對象 * @param ex 當前出現異常時的異常對象 * @return 出現異常時展示視圖和數據 */ @Override public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) { System.out.println("進入全局異常處理器,獲取的異常信息為:" + ex.getMessage()); ModelAndView modelAndView = new ModelAndView(); // 基於不同業務異常跳轉到不同頁面 modelAndView.setViewName("redirect:/error.jsp"); // return "error" -> error.jsp // modelAndView中的model預設放到request作用域,如果使用redirect跳轉,model中數據會自動拼接到跳轉url modelAndView.addObject("msg", ex.getMessage()); return modelAndView; } }
dispatcher.xml 配置全局異常處理類
<bean class="com.baizhi.handlerexception.GlobalExceptionResolver"/>
-
基於不同業務異常跳轉不同頁面
// 基於不同業務異常跳轉到不同頁面 if (ex instanceof NotFoundException) { modelAndView.setViewName("notFound"); } else if (ex instanceof GeneralException) { modelAndView.setViewName("generalException"); }
異常處理器的工作流程
作者:揚眉劍出鞘
出處: https://www.cnblogs.com/eyewink/
本文版權歸作者和博客園共有,歡迎轉載,但未經作者同意必須保留此段聲明,且在文章頁面明顯位置給出原文連接,否則保留追究法律責任的權利。