#Spring Web MVC工做原理 做用:開發Web MVC結構的程序。前端
主要組件java
做用:主控制器,用於接收客戶端請求,進行業務分發處理web
做用:維護請求和Controller業務控制器方法映射關係spring
SimpleUrlHandlerMapping:維護一個<props>列表
RequestMappingHandlerMapping:利用@RequestMapping("請求")session
做用:業務控制器,用於調用模型M組件處理請求mvc
做用:視圖解析器,用於生成視圖響應結果(響應HTML、JSON數據等等)
InternalResourceViewResolver:能夠調用JSP或HTML視圖組件。app
主要流程框架
請求-->主控制器DispatcherServlet-->RequestMappingHandlerMapping -->Controller組件-->ViewResolver-->JSP解析成HTML-->響應輸出jsp
##Spring Web MVC應用post
環境搭建
引入jar包和配置文件
2.編寫流程缺失組件
JSP視圖組件 涉及技術:JSP、EL、JSTL、前端技術
Controller組件 涉及規則:如何獲取請求參數、如何向響應JSP傳值、如何使用Session、如何重定向等
public class LoginController{ public ModelAndView/String xxx(); }
##Interceptor攔截器
做用:攔截器能夠對原有SpringMVC流程進行攔截,有3個攔截點,第一個是在Controller以前;第二個是在Controller以後ViewResolver以前;第三個是在JSP解析以後,結果輸出以前.
攔截器在實際應用時能夠在上述3個點插入額外功能,便於功能重用、靈活性(配置)。
使用規則
編寫攔截器實現類,實現HandlerInterceptor接口
public class CheckLoginInterceptor implements HandlerInterceptor{ //在請求處理完畢後,響應輸出以前執行 public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) throws Exception { System.out.println("---執行afterCompletion方法---"+arg2); } //Controller以後執行 public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3) throws Exception { System.out.println("---執行PostHandle方法---"+arg2); } //在Controller以前執行 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { System.out.println("---執行PreHandel方法---"+arg2); return true;//返回true繼續執行Controller;返回false阻止Controller執行 } }
配置攔截器,指定攔截哪些請求
<mvc:interceptors> <mvc:interceptor> <!-- 指定攔截的請求 --> <mvc:mapping path="/list.do"/> <!-- 指定不攔截的請求 --> <!-- <mvc:exclude-mapping path="/tologin.do"/> <mvc:exclude-mapping path="/login.do"/> --> <bean class="com.xdl.interceptor.CheckLoginInterceptor"></bean> </mvc:interceptor> </mvc:interceptors>
登陸檢查功能
思路:在preHandle方法中追加攔截邏輯,檢查session是否存在用戶信息,若是存在表示登陸;不存在表示未登陸
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception { System.out.println("---執行PreHandel方法---"+arg2); //檢查用戶是否登陸 HttpSession session = request.getSession(); if(session.getAttribute("user") == null){ //未登陸 response.sendRedirect("tologin.do"); return false;//返回false阻止Controller執行 } return true;//返回true繼續執行Controller; }
權限控制設計
攔截器和過濾器區別
##異常處理
全局異常處理
使用SimpleMappingExceptionResolver異常處理器。任何一個Controller請求方法出錯誤,都會調用該異常處理器處理。
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver"> <property name="exceptionMappings"> <props> <prop key="java.lang.Exception">error500</prop> <!-- <prop key="異常類型">錯誤頁面名稱</prop> <prop key="java.lang.NumberFormatException">error500</prop> --> </props> </property> </bean>
局部異常處理
在Controller組件中使用@Exceptionhandler註解標記定義一個方法,當Contoller拋異常後會優先調用@ExcepitonHadler方法處理。
public String xxx(Exception e,...); public ModelAndView xxx(Exception e,...);
Controller以外異常
能夠經過在web.xml追加配置
<error-page> <error-code>404</error-code> <location>/WEB-INF/error404.jsp</location> </error-page>
自定義異常處理器
編寫異常處理器類
public class MyExceptionResolver implements HandlerExceptionResolver{ public ModelAndView resolveException( HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3) { //追加異常處理邏輯 } }
使用時,追加< bean>定義便可
<bean class="com.xdl.util.MyExceptionResolver"> </bean>
##驗證碼應用
驗證碼意義:防止頻繁提交表單。
案例:顯示驗證碼(字節流響應)
image.do-->DispatcherServlet-->HandlerMapping-->ImageController-->返回一個圖片流
ImageController主要代碼以下:
@RequestMapping("/image.do") public void createImage(HttpServletResponse response) throws Exception{ //生成一個驗證碼圖片 BufferedImage image = new BufferedImage(80, 30, BufferedImage.TYPE_INT_RGB); Graphics graphic = image.getGraphics();//獲取畫筆 //TODO 畫圖片字符和干擾線信息 //將圖片流使用response輸出 ImageIO.write(image, "jpeg", response.getOutputStream()); }
案例:驗證碼校驗(JSON字符串響應)
(Ajax)checkImage.do-->DispatcherServlet-->HandlerMapping-->ImageController-->返回一個JSON字符串結果