SpringMVC

SpringMVC

1. Springmvc框架

1.1 什麼是Springmvc

  • Springmvc是基於Spring框架的一個模塊,springmvc和Spring無需通過中間整合層進行整合
  • Springmvc是一個基於mvc的web框架

1.2 Springmvc框架

  • 步驟:

    • 第一步:發起請求到前端控制器(DispatcherServlet)
    • 第二步:前端控制器請求HandlerMapping查找Handler
      • 可以根據xml配置,註解進行查找
    • 第三步:處理映射器HandlerMapping向前端控制器返回Handler
    • 第四步:前端控制器調用處理器適配器去執行Handler
    • 第五步:處理器適配器去執行Handler
    • 第六步:Handler執行完成給適配器返回ModelAndView
    • 第七步:處理器適配器向前端控制器返回ModelAndView
      • ModelAndView是springmvc框架的一個底層對象,包括model和view
    • 第八步:前端控制器請求視圖解析器去進行視圖解析
      • 根據邏輯視圖名解析成正真的視圖
    • 第九步:視圖解析器向前端控制器返回view
    • 第十步:前端控制器進行視圖渲染
      • 視圖渲染將模型數據(在ModelAndView對象中)填充到request域
    • 第十一步:前端控制器向用戶響應結果
  • 組件:

    • 1.前端控制器DispatcherServlet(不需要程序員開發)
      • 作用:接收請求響應結果,相當於轉發器,中央處理器,有了DispatcherServlet減少了其他組件之間的耦合度
    • 2.處理器映射器HandlerMapping(不需要程序員開發)
      • 作用:根據請求的url查找handler
    • 3.處理器適配器HandlerAdapter
      • 作用:按照特定規則(HandlerAdapter要求的規則)去執行Handler
    • 4.處理器Handler(需要程序員開發)
      • 注意:編寫Handler時按照HandlerAdapter的要求去做,這樣適配器纔可以去正確執行Handler
    • 5.視圖解析器View resolver(不需要程序員開發)
      • 作用:進行視圖解析,根據邏輯視圖名解析成真正的視圖(view)
    • 6.視圖view(需要程序員開發jsp)
      • view是一個接口,實現類支持不同的view類型(jsp,freemarker,pdf...)

2. 入門程序

2.1 導入Spring中所有jar包

2.2 配置前端控制器

  • web.xml配置servlet,攔截請求
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" id="WebApp_ID" version="3.0">
  <display-name>springmvc</display-name>
  <!--Springmvc前端控制器  -->
  <servlet>
      <servlet-name>springmvc</servlet-name>
      <servlet-class>org.Springframework.web.servlet.DispatcherServlet</servlet-class>
      <!-- contextConfigLocation配置springmvc加載的配置文件(配置處理器映射器,適配器等),如果不配置contextConfigLocation,
      默認加載的是/WEB-INF/servlet名稱-servlet.xml(springmvc-servlet.xml) -->
      <init-param>
          <param-name>contextConfig</param-name>
          <param-value>classpath:springmvc.xml</param-value>
      </init-param>
  </servlet>
  <servlet-mapping>
      <servlet-name>springmvc</servlet-name>
      <!-- 第一種:*.action,訪問以.action結尾的有DispatcherServlet進行解析
           第二種:/,所有訪問地址都由DispatcherServlet解析, 對於靜態文件需要配置不讓其解析
           第三種:/*,錯誤配置 -->
      <url-pattern>*.action</url-pattern>
  </servlet-mapping>

2.3 配置處理器適配器

  • 具體執行處理器(Controller方法)的對象,將ModelAndView返回給DispatcherServlet渲染視圖用的
    <!-- 處理器適配器:所有處理器適配器都實現HandlerAdapter接口 -->
    <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter" />

2.4 開發Handler

  • 創建mav對象,將Controller中需要返回給頁面的數據放在裏面
//創建ModelAndView對象
ModelAndView mav = new ModelAndView();
//相當於request的setAttribute,在jsp頁面中通過itemlist獲取數據
mav.addObject("itemlist",itemslist);
//指定視圖
mav.setViewName("/WEB-INF/jsp/items.itemlist.jsp")

2.5 視圖編寫

  • jsp頁面

2.6配置Handler

    <!-- 配置Handler -->
    <bean name="demo.action" class="com.voion.ssm.Controller.demoController"/>

2.7 配置映射器

  • 就是根據DispatcherServlet拿過來的用戶請求某部分路徑去尋找處理器(就是我們寫的具體的某個方法)
    <!-- 處理器映射器:將bean的name作爲url進行查找,需要在配置Handler時指定beanname(就是url) -->
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />

2.8 配置視圖解析器

  • 解析jsp,默認使用jstl標籤,classpath下得有jstl的包
    <!-- 視圖解析器 -->
    <!-- 視圖解析器的前綴和後綴配置-->  
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />  
    </bean> 

3. 非註解的處理器映射器和適配器

3.1 非註解的映射器

  • 多個映射器可以並存,前端控制器判斷url能讓哪些映射器映射,就讓正確的映射器處理
  • 處理器映射器(兩個)
    <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" />
    <bean class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping" />

3.2 非註解的適配器

  • 對於org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping
    • 要求編寫的Handler實現Controller接口
  • 對於org.springframework.web.servlet.handler.SimpleUrlHandlerMapping
    • 要求編寫的Handler實現HttpRequestHandle接口

4. 註解的映射器適配器

4.1 註解的映射器

  • 在Spring3.1之前使用
    • 映射器:org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
    • 適配器:org.springframework.web.servlet.mvc.annotation.Annotation.AnnotationMethodHandlerAdapter
  • 在Spring3.1之後使用
    • 映射器org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping
    • 適配器org.springframework.web.servlet.mvc.annotation.Annotation.RequestMappingHandlerAdapter

4.2 配置註解的映射器和適配器

  • 舊配置

    <!-- 註解映射器 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping.class"/>
    <!-- 註解適配器 -->
    <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.class"/>
  • 新配置

    • 使用mvc:annotation-driven代替上邊的註解映射器和註解適配器配置
    • mvc:annotation-driven默認加載了很多的參數綁定方法,比如json轉換解析器就默認加載了,使用後就不用在配置上面的註解映射器和適配器
    • 實際開發時使用mvc:annotation-driven
      <!--替代原來註解映射器和適配器的功能-->
      <mvc:annotation-driven></mvc:annotation-driven>

4.3 註解開發Handler

  • 使用註解的映射器和註解的適配器必須配對使用
  • 配置完後在Spring文件中掃描註解
<!--掃描有註解的包-->
 <context:component-scan base-package="com.voion.ssm.controller" />

5. 源碼分析

通過前端控制器源碼分析springmvc的執行過程

  • 第一步;前端控制器接收請求
    • 調用doDiapatch
  • 第二步:前端控制器調用處理器映射器查找Handler
  • 第三步:調用處理器適配器執行handler,得到執行結果ModelAndView
  • 第四步:視圖渲染:將model數據填充到request域

6. springmvc小結

  • 通過入門程序理解springmvc的前端控制器,處理器映射器,處理器適配器和視圖解析器的用法

6.1前端控制器配置

  • 方式一:*.action,以後綴作爲攔截
  • 方式二:/,對於靜態文件需喲啊配置不讓DispatcherServlet解析
    - 使用此種方式可以實現RESTful風格的url

6.2 處理器映射器

  • 非註解處理器映射器(瞭解)
  • 註解的處理器映射器(掌握)
    • 對標記@Controller類中標識有@RequestMapping的方法進行映射,在@RequestMapping裏面定義映射的url
    • 使用註解的映射器不用再xml中配置url和handler的映射關係

6.3 處理器適配器

  • 非註解處理器適配器(瞭解)
  • 註解的處理器適配器(掌握)
    • 註解處理器適配器和註解處理器映射器是配對使用

6.4 簡化配置

  • <mvc:annotation-driven></mvc:annotation-driven>可以代替註解的適配器和映射器的配置
  • 也是實際開發使用的方式

6.5 視圖解析器

  • 配置前後綴,程序中就不用再寫前綴和後綴了
    <!-- 視圖解析器的前綴和後綴配置-->  
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">  
        <property name="prefix" value="/WEB-INF/views/" />
        <property name="suffix" value=".jsp" />  
    </bean> 

7. springmvc和mybatis的整合

  • 架構圖
表現層
springmvc
Spring將各層進行整合:
1.通過Spring管理持久層的mapper(相當於到接口)
2.通過Spring管理業務層service,Service中可以調用mapper接口
3.Spring進行事務控制
4.通過Spring管理表現層Handler,Handler中可以調用Service接口

mapper,Service,handler都是javabean
業務層
service接口
持久層
mybatis
數據庫
mysql

  • Spring將各層進行整合
    • 通過Spring管理持久層的mapper(相當於mapper接口)
    • 通過Spring管理業務層Service,Service可以調用mapper接口
  • Spring進行實物控制
    • 通過Spring管理表現出Handler,handler中可以調用Service接口
    • mapper,service,handler都是javabean
  • 可以分開三層配置
    • sqlMapConfig.xml
    • application-dao.xml
    • application-Service.xml
    • application-transaction.xml
  • 也可以配置到一個文件夾中

7.1 第一步:整合dao層

  • mybatis和Spring整合,通過Spring管理mapper接口
  • 使用mapper的掃描器自動掃描mapper接口在Spring中進行註冊
  • mybatis配置文件(sqlMapConfig.xml)
<?xml version="1.0" encoding="utf-8" ?>
<!DOCTYPE configuration
         PUBLIC "-//mybatis.org//DTD Config 3.0//EN"
         "http://mybatis.org/dtd/mybatis-3-config.dtd">

 <configuration>
  <!-- 全局setting配置,根據需要添加 -->  

  <!-- 配置別名 -->
  <typeAliases>
      <!-- 批量掃描別名 -->
      <package name="com.voion.ssm.mapper"/>
  </typeAliases>

  <!-- 配置mapper:由於使用Spring和mybatis整合包進行mapper掃描,所以這裏不需要配置
          但是必須遵循:mapper.xml和mapper.java文件同名且在一個目錄 -->
  <!-- <mappers></mappers> -->
 </configuration>
  • Spring整合mybatis
    • applicationContext-dao.xml
    <!-- 1. 加載數據庫配置的屬性文件 -->
    <context:property-placeholder location="classpath:jdbc.properties"/>

    <!-- 2. 數據源dataSource  C3P0 -->
    <bean id="dataSource" class="com.mchange.v2.c3p0.ComboPooledDataSource">
        <property name="driverClass" value="${jdbc.driverClassName}"/>
        <property name="jdbcUrl" value="${jdbc.url}"/>
        <property name="user" value="${jdbc.username}"/>
        <property name="password" value="${jdbc.password}"/>
        <property name="maxPoolSize" value="${c3p0.pool.maxPoolSize}"/>
        <property name="minPoolSize" value="${c3p0.pool.minPoolSize}"/>
        <property name="initialPoolSize" value="${c3p0.pool.initialPoolSize}"/>
        <property name="acquireIncrement" value="${c3p0.pool.acquireIncrement}"/>
    </bean>

    <!-- 3. SessionFactory -->
    <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean">  
        <!-- 數據庫連接池 -->
        <property name="dataSource" ref="dataSource" />  
        <!-- 加載mybatis的全局配置文件 -->  
        <property name="configLocation" value="classpath:mybatis/sqlMapConfig.xml"/>
    </bean>
    <!-- 4. DAO接口所在包名,Spring會自動查找其下的類 -->
    <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
        <property name="basePackage" value="com.voion.ssm.dao" />
        <property name="sqlSessionFactoryBeanName" value="sqlSessionFactory"></property>
    </bean>  

7.2 第二步:整合service層

  • Spring整合Service
    • 只需要掃描Service包即可
    <!-- 配置包掃描器,掃描@Service主鍵的類 -->
    <context:component-scan base-package="com.taotao.service"/>
  • Spring事務配置
    <!-- 事務管理器 -->
    <bean id="transactionManager"
        class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <!-- 數據源 -->
        <property name="dataSource" ref="dataSource" />
    </bean>
    <!-- 通知 -->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <!-- 傳播行爲 -->
            <tx:method name="save*" propagation="REQUIRED" />
            <tx:method name="insert*" propagation="REQUIRED" />
            <tx:method name="add*" propagation="REQUIRED" />
            <tx:method name="create*" propagation="REQUIRED" />
            <tx:method name="delete*" propagation="REQUIRED" />
            <tx:method name="update*" propagation="REQUIRED" />
            <tx:method name="find*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="select*" propagation="SUPPORTS" read-only="true" />
            <tx:method name="get*" propagation="SUPPORTS" read-only="true" />
        </tx:attributes>
    </tx:advice>
    <!-- 切面 -->
    <aop:config>
        <aop:advisor advice-ref="txAdvice"
            pointcut="execution(* com.taotao.service.*.*(..))" />
    </aop:config>

7.3 第三步:整合springmvc

  • 由於springmvc是Spring的模塊,不需要整合,直接配置Spring的配置文件即可
  • 配置springmvc.xml
    <!-- 1.包掃描器,掃描@Controller註解 -->
    <context:component-scan base-package="com.taotao.controller" />

    <!-- 2.註解驅動 -->
    <mvc:annotation-driven />

    <!-- 3.視圖解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

    <!-- 4.配置資源映射,加載靜態資源 -->
    <mvc:resources location="/WEB-INF/js/" mapping="/js/**"/>
    <mvc:resources location="/WEB-INF/css/" mapping="/css/**"/>

7.4 第四步:配置web.xml文件

    <!-- 1.加載spring容器 -->
    <context-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>classpath:spring/applicationContext-*.xml</param-value>
    </context-param>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <!-- 2.解決post亂碼 -->
    <filter>
        <filter-name>CharacterEncodingFilter</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <!-- <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>true</param-value>
        </init-param> -->
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <!-- 3.springmvc的前端控制器 -->
    <servlet>
        <servlet-name>taotao-manager</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <!-- contextConfigLocation不是必須的, 如果不配置contextConfigLocation, springmvc的配置文件默認在:WEB-INF/servlet的name+"-servlet.xml" -->
        <init-param>
            <param-name>contextConfigLocation</param-name>
            <param-value>classpath:spring/springmvc.xml</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    <servlet-mapping>
        <servlet-name>taotao-manager</servlet-name>
        <url-pattern>/</url-pattern>
    </servlet-mapping>

8. springmvc和struts2的區別

8.1. springmvc是基於方法開發的,struts2基於類開發
  • Springmvc將url和Controller方法映射,映射成功後springmvc生成一個handler對象,對象中只包括了一個method,方法執行結束形參銷燬,多線程訪問不同的方法都會有單獨的空間
8.2 springmvc可以進行單例開發,並且建議使用單例開發,struts2通過類的成員變量接收參數,多線程操作會共享成員變量,所以無法使用單例
8.3 經過實際測試,struts2速度慢,在於使用struts標籤,如果使用struts建議使用jstl




posted @ 2019-01-22 04:28 kasi 閱讀(...) 評論(...) 編輯 收藏
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章