Spring MVC 簡單梳理

Spring MVC 和 Struts2  ---》實現MVC的結構
爲何使用:從模仿者變成了領跑者
 

1.網頁開發模式的演化

CGI--》servlet--》jsp--》標籤庫<jsp>,EL,JSTL-->mvc(model1,model2)
    
Spring MVC 使用的是基於Model2 的技術框架
Model1:
Model1的中心是JSP頁面,JSP頁面中結合業務邏輯、服務端處理過程和HTML等,這樣就在JSP頁面中同時實現了業務邏輯和流程控制。從而快速開發。
 
Model1的優缺點:
優勢:簡單,快速開發,適用小規模開發
缺點:業務邏輯和表示邏輯混合在JSP頁面中沒有進行抽象和分離,JSP負載太大。因此很是不利於應用系統業務的重用和改動,不便於維護
 
Model2:
Model 2表示的是基於MVC模式的框架。MVC 「Model」表明的是應用的業務邏輯(經過JavaBean,EJB組件實現),「View」是應用的表示面(由JSP頁面產生),「Controller」是提供應用的處理過程控制(通常是一個Servlet),經過這種設計模型把應用邏輯,處理過程和顯示邏輯分紅不一樣的組件實現。這些組件能夠進行交互和重用。從而彌補了Model1的不足。
 
Model2實際上是在Model1基礎上又抽了一層控制層。
 
Model2優缺點:
優勢:具備組件化的優勢從而更易於實現對大規模系統的開發和管理。職責劃分清晰。
缺點:不適合小項目開發

2.spring MVC流程展現

3.配置DispatcherServlet

默認獲取地址:
[/WEB-INF/chapter2-servlet.xml]    
默認名稱:[servlet-name]-servlet.xml
 
<init-param>
    <param-name>contextConfigLocation</param-name>
    <param-value>classpath:spring-servlet-config.xml</param-value>
</init-param>
 
自定義的獲取地址:
[spring-servlet-config.xml]
 

4.相關組件說明,及默認配置

spring 3.1 以後 提供了更好的實現
RequestMappingHandlerMapping
RequestMappingHandlerAdapter
 

5.接口的形式配置handler

接口的實現方式(繼承的實現方式)  實現Controller
在2.5版本以前使用較多,2.5以後逐漸被註解替代
 

6.@controller和@Requestmapping(其屬性與HTTP請求的對應)

替換組件的實現類,來支持註解的實現方式
@Requestmapping
target:Method,Type
屬性:value(),path(),params(),headers(),method(),consumes(),produces()
 

7.數據收集與數據綁定

支持的參數類型:
類型 說明 描述
ServletRequest 請求  
HttpServletRequest HTTP請求  
ServletResponse 響應  
HttpServletResponse HTTP響應  
InputStream 請求正文(字節流) 等價於request.getInputStream()
OutputStream 響應正文(字節流) 等價於response.getOutputStream()
Reader 請求正文(字符流) 等價於request.getReader()
Writer 響應正文(字符流) 等價於response.getWriter()
WebRequest 統一請求訪問接口 webRequest.getParameter:訪問請求參數區的數據,能夠經過getHeader()訪問請求頭數據;

webRequest.setAttribute/getAttribute:到指定的做用範圍內取/放屬性數據,Servlet定義的三個做用範圍分別使用以下常量表明:css

SCOPE_REQUEST :表明請求做用範圍;html

SCOPE_SESSION :表明會話做用範圍;web

SCOPE_GLOBAL_SESSION :表明全局會話做用範圍,即ServletContext上下文做用範圍。spring

 

NativeWebRequest 額外提供訪問本地servlet API nativeWebRequest.getNativeRequest/nativeWebRequest.getNativeResponse:獲得本地的Servlet API
HttpSession 會話 此處的session永遠不爲null。

 

注意:session訪問不是線程安全的,若是須要線程安全,須要設置AnnotationMethodHandlerAdapter或RequestMappingHandlerAdapter的synchronizeOnSession屬性爲true,便可線程安全的訪問session。json

命令對象/表單對象 一個自定義類 Spring Web MVC可以自動將請求參數綁定到功能處理方法的命令/表單對象上。
Model 同一個對象 渲染視圖須要的模型數據
注意和ModelAndView中model的關係
Map
ModelMap
RedirectAttributes return "redict:xxx/xxx" 相關類 addFlashAttribute()
SessionStatus   .setComplete()
 
 
註解:
@CookieValue、@RequestHeader、@PathVariable、@RequstParam、@RequestBody
@ResponseBody
  1. 引入json的轉換包。須要引入以下2個包:

  2. spring-servlet.xml文件中須要配置轉換的bean安全

複製代碼
    <bean
        class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
        <property name="messageConverters">
            <util:list id="beanList">
                <ref bean="mappingJacksonHttpMessageConverter" />
            </util:list>
        </property>
    </bean>
    <bean id="mappingJacksonHttpMessageConverter"
        class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">
        <property name="supportedMediaTypes">
            <list>
                <value>text/html;charset=UTF-8</value>
            </list>
        </property>
    </bean>
複製代碼

3. 最後,別忘了還要聲明util的schema文件和地址,在spring-servlet.xml文件的頭部聲明部分加入以下三行便可session

xmlns:util="http://www.springframework.org/schema/util"
       http://www.springframework.org/schema/util
    http://www.springframework.org/schema/util/spring-util-3.0.xsd
 
@ModelAttribute
    1) 標註方法的返回值,以給定名稱做爲屬性名,設置到model當中(可支持列表List)
    2) 標註處理器方法參數,將參數 以給定名稱做爲屬性名,設置到model當中。此處會檢測有無普通方法標註的同名屬性,若是名稱相同,則使用該方法返回值做爲此處對象;若是沒有,則新建一個。
 
@RequestMapping(value="/model1") //②
public String test1(@ModelAttribute("user") UserModel user, Model model) {
       System.out.println(model.containsAttribute("cityList"));
       System.out.println(user);
       return "success";
 }
 
@SessionAttribute
    1)方法開始前,從session中獲取value屬性指定的名稱所對應的值 ,找到後,將該值存入model當中
    2)方法結束時,從model中找value屬性指定的名稱所對應的值,存入session中
屬性:value(),type()
taget: type
 

8.攔截器

  1. preHandle方法:進入Handler方法以前執行。能夠用於身份認證、身份受權。好比若是認證沒有經過表示用戶沒有登錄,須要此方法攔截再也不往下執行(return false),不然就放行(return true)。
  2. postHandle方法:進入Handler方法以後,返回ModelAndView以前執行。能夠看到該方法中有個modelAndView的形參。應用場景:從modelAndView出發:將公用的模型數據(好比菜單導航之類的)在這裏傳到視圖,也能夠在這裏同一指定視圖。
  3. afterCompletion方法:執行Handler完成以後執行。應用場景:統一異常處理,統一日誌處理等。
配置:
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping">
    <property name="interceptors">
        <list>
            <ref bean="handlerInterceptor1"/>
            <ref bean="handlerInterceptor2"/>
        </list>
    </property>
</bean>
<bean id="handlerInterceptor1" class="ssm.intercapter.HandlerInterceptor1"/>
<bean id="handlerInterceptor2" class="ssm.intercapter.HandlerInterceptor2"/>
或者
 
<!-- 配置攔截器 -->
<mvc:interceptors>
    <!-- 多個攔截器,按順序執行 -->        
    <mvc:interceptor>
        <mvc:mapping path="/**"/> <!-- 表示攔截全部的url包括子url路徑 -->
        <bean class="ssm.interceptor.HandlerInterceptor1"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="ssm.interceptor.HandlerInterceptor2"/>
    </mvc:interceptor>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <bean class="ssm.interceptor.HandlerInterceptor3"/>
    </mvc:interceptor>
</mvc:interceptors>
 
 

不攔截靜態資源

  若是配置攔截相似於*.do格式的攔截規則,則對靜態資源的訪問是沒有問題的,可是若是配置攔截了全部的請求(如咱們上面配置的「/」),就會形成js文件、css文件、圖片文件等靜態資源沒法訪問。mvc

  攔截器的主要做用是是用於權限管理,攔截不合理的URL,因此不對靜態資源進行攔截app

  方案:使用<mvc:resources/> (mapping:請求,location:映射地址,注意必須是webapp根目錄下的路徑。)  框架

springMVC配置文件<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/images/**" location="/img/"/>
<mvc:resources mapping="/js/**" location="/js/"/>
相關文章
相關標籤/搜索