Spring Web MVC工做原理

#Spring Web MVC工做原理 做用:開發Web MVC結構的程序。前端

  1. 主要組件java

    • DispactherServlet

    做用:主控制器,用於接收客戶端請求,進行業務分發處理web

    • HandlerMapping

    做用:維護請求和Controller業務控制器方法映射關係spring

    SimpleUrlHandlerMapping:維護一個<props>列表
    RequestMappingHandlerMapping:利用@RequestMapping("請求")session

    • Controller

    做用:業務控制器,用於調用模型M組件處理請求mvc

    • ViewResolver

    做用:視圖解析器,用於生成視圖響應結果(響應HTML、JSON數據等等)
    InternalResourceViewResolver:能夠調用JSP或HTML視圖組件。app

  2. 主要流程框架

    請求-->主控制器DispatcherServlet-->RequestMappingHandlerMapping -->Controller組件-->ViewResolver-->JSP解析成HTML-->響應輸出jsp

##Spring Web MVC應用post

  1. 環境搭建

    引入jar包和配置文件

2.編寫流程缺失組件

  • JSP視圖組件 涉及技術:JSP、EL、JSTL、前端技術

  • Controller組件 涉及規則:如何獲取請求參數、如何向響應JSP傳值、如何使用Session、如何重定向等

    public class LoginController{
    
            public ModelAndView/String xxx();
    
        }

##Interceptor攔截器

做用:攔截器能夠對原有SpringMVC流程進行攔截,有3個攔截點,第一個是在Controller以前;第二個是在Controller以後ViewResolver以前;第三個是在JSP解析以後,結果輸出以前.
攔截器在實際應用時能夠在上述3個點插入額外功能,便於功能重用、靈活性(配置)。

  1. 使用規則

    • 編寫攔截器實現類,實現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>
  2. 登陸檢查功能

    思路:在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;
     }
  3. 權限控制設計

  1. 攔截器和過濾器區別

    • 過濾器Filter屬於Java Web;攔截器屬於Spring Web MVC;
    • 請求發送過來先執行過濾器Filter,而後進入框架流程再執行攔截器
    • 攔截器能夠訪問框架內部特殊的對象元素;過濾器不行
    • 攔截器通常採用反射和代理技術實現調用;Filter採用回調機制調用;

##異常處理

  1. 全局異常處理

    使用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>

  2. 局部異常處理

    在Controller組件中使用@Exceptionhandler註解標記定義一個方法,當Contoller拋異常後會優先調用@ExcepitonHadler方法處理。

    public String xxx(Exception e,...);
     public ModelAndView xxx(Exception e,...);
  3. Controller以外異常

    能夠經過在web.xml追加配置

    <error-page>
       	<error-code>404</error-code>
       	<location>/WEB-INF/error404.jsp</location>
       </error-page>
  4. 自定義異常處理器

    • 編寫異常處理器類

      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字符串結果

相關文章
相關標籤/搜索