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...)
- 1.前端控制器DispatcherServlet(不需要程序員開發)
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,方法執行結束形參銷燬,多線程訪問不同的方法都會有單獨的空間