1. 學習計劃 第一天 1、SpringMVC介紹 2、入門程式 3、SpringMVC架構講解 a) 框架結構 b) 組件說明 4、SpringMVC整合MyBatis 5、參數綁定 a) SpringMVC預設支持的類型 b) 簡單數據類型 c) Pojo類型 d) Pojo包裝類型 e) 自定 ...
1. 學習計劃
第一天
1、SpringMVC介紹
2、入門程式
3、SpringMVC架構講解
a) 框架結構
b) 組件說明
4、SpringMVC整合MyBatis
5、參數綁定
a) SpringMVC預設支持的類型
b) 簡單數據類型
c) Pojo類型
d) Pojo包裝類型
e) 自定義參數綁定
6、SpringMVC和Struts2的區別
第二天
1、高級參數綁定
a) 數組類型的參數綁定
b) List類型的綁定
2、@RequestMapping註解的使用
3、Controller方法返回值
4、SpringMVC中異常處理
5、圖片上傳處理
6、Json數據交互
7、SpringMVC實現RESTful
8、攔截器
2. Spring入門
2.1. Springmvc是什麼
Spring web mvc和Struts2都屬於表現層的框架,它是Spring框架的一部分,我們可以從Spring的整體結構中看得出來,如下圖:
2.2. Springmvc處理流程
如下圖所示:
2.3. 入門程式
需求:使用瀏覽器顯示商品列表
2.3.1. 創建web工程
springMVC是表現層框架,需要搭建web工程開發。
如下圖創建動態web工程:
輸入工程名,選擇配置Tomcat(如果已有,則直接使用),如下圖:
配置Tomcat,如下圖:
選擇準備好的Tomcat,這裡用的是Tomcat7,如下圖:
選擇成功,點擊Finish,如下圖:
選擇剛剛設置成功的Tomcat,如下圖:
如下圖選擇web的版本是2.5,可以自動生成web.xml配置文件,
創建效果如下圖:
2.3.2. 導入jar包
從課前資料中導入springMVC的jar包,位置如下圖:
複製jar到lib目錄,工程直接載入jar包,如下圖:
2.3.3. 加入配置文件
創建config資源文件夾,存放配置文件,如下圖:
2.3.3.1. 創建springmvc.xml
創建SpringMVC的核心配置文件
SpringMVC本身就是Spring的子項目,對Spring相容性很好,不需要做很多配置。
這裡只配置一個Controller掃描就可以了,讓Spring對頁面控制層Controller進行管理。
創建springmvc.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:context="http://www.springframework.org/schema/context" xmlns:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd"> <!-- 配置controller掃描包 --> <context:component-scan base-package="cn.itcast.springmvc.controller" /> </beans>
配置文件需要的約束文件,位置如下圖:
創建包cn.itcast.springmvc.controller
效果如下圖:
2.3.3.2. 配置前端控制器
配置SpringMVC的前端控制器DispatcherServlet
在web.xml中
<?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_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>springmvc-first</display-name> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> <!-- 配置SpringMVC前端控制器 --> <servlet> <servlet-name>springmvc-first</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 指定SpringMVC配置文件 --> <!-- SpringMVC的配置文件的預設路徑是/WEB-INF/${servlet-name}-servlet.xml --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>springmvc-first</servlet-name> <!-- 設置所有以action結尾的請求進入SpringMVC --> <url-pattern>*.action</url-pattern> </servlet-mapping> </web-app>
2.3.4. 加入jsp頁面
把參考資料中的itemList.jsp複製到工程的/WEB-INF/jsp目錄下,如下圖:
2.3.5. 實現顯示商品列表頁
2.3.5.1. 創建pojo
分析頁面,查看頁面需要的數據,如下圖:
創建商品pojo
public class Item { // 商品id private int id; // 商品名稱 private String name; // 商品價格 private double price; // 商品創建時間 private Date createtime; // 商品描述 private String detail; 創建帶參數的構造器 set/get。。。 }
2.3.5.2. 創建ItemController
ItemController是一個普通的java類,不需要實現任何介面。
需要在類上添加@Controller註解,把Controller交由Spring管理
在方法上面添加@RequestMapping註解,裡面指定請求的url。其中“.action”可以加也可以不加。
@Controller public class ItemController { // @RequestMapping:裡面放的是請求的url,和用戶請求的url進行匹配 // action可以寫也可以不寫 @RequestMapping("/itemList.action") public ModelAndView queryItemList() { // 創建頁面需要顯示的商品數據 List<Item> list = new ArrayList<>(); list.add(new Item(1, "1華為 榮耀8", 2399, new Date(), "質量好!1")); list.add(new Item(2, "2華為 榮耀8", 2399, new Date(), "質量好!2")); list.add(new Item(3, "3華為 榮耀8", 2399, new Date(), "質量好!3")); list.add(new Item(4, "4華為 榮耀8", 2399, new Date(), "質量好!4")); list.add(new Item(5, "5華為 榮耀8", 2399, new Date(), "質量好!5")); list.add(new Item(6, "6華為 榮耀8", 2399, new Date(), "質量好!6")); // 創建ModelAndView,用來存放數據和視圖 ModelAndView modelAndView = new ModelAndView(); // 設置數據到模型中 modelAndView.addObject("list", list); // 設置視圖jsp,需要設置視圖的物理地址 modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp"); return modelAndView; } }
2.3.6. 啟動項目測試
啟動項目,瀏覽器訪問地址
http://127.0.0.1:8080/springmvc-first/itemList.action
效果如下圖:
為什麼可以用呢?我們需要分析一下springMVC的架構圖。
3. Springmvc架構
3.1. 框架結構
框架結構如下圖:
3.2. 架構流程
1、 用戶發送請求至前端控制器DispatcherServlet
2、 DispatcherServlet收到請求調用HandlerMapping處理器映射器。
3、 處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet。
4、 DispatcherServlet通過HandlerAdapter處理器適配器調用處理器
5、 執行處理器(Controller,也叫後端控制器)。
6、 Controller執行完成返回ModelAndView
7、 HandlerAdapter將controller執行結果ModelAndView返回給DispatcherServlet
8、 DispatcherServlet將ModelAndView傳給ViewReslover視圖解析器
9、 ViewReslover解析後返回具體View
10、 DispatcherServlet對View進行渲染視圖(即將模型數據填充至視圖中)。
11、 DispatcherServlet響應用戶
3.3. 組件說明(一個中心三個基本點)
以下組件通常使用框架提供實現:
黃色是三大組件,綠色是我們要寫的,白色部分是中心
u DispatcherServlet:前端控制器
用戶請求到達前端控制器,它就相當於mvc模式中的c,dispatcherServlet是整個流程式控制制的中心,由它調用其它組件處理用戶的請求,dispatcherServlet的存在降低了組件之間的耦合性。
u HandlerMapping:處理器映射器
HandlerMapping負責根據用戶請求url找到Handler即處理器,springmvc提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現介面方式,註解方式等。
u Handler:處理器
Handler 是繼DispatcherServlet前端控制器的後端控制器,在DispatcherServlet的控制下Handler對具體的用戶請求進行處理。
由於Handler涉及到具體的用戶業務請求,所以一般情況需要程式員根據業務需求開發Handler。
u HandlAdapter:處理器適配器
通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過擴展適配器可以對更多類型的處理器進行執行。
下圖是許多不同的適配器,最終都可以使用usb介面連接
u ViewResolver:視圖解析器
View Resolver負責將處理結果生成View視圖,View Resolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最後對View進行渲染將處理結果通過頁面展示給用戶。
u View:視圖
springmvc框架提供了很多的View視圖類型的支持,包括:jstlView、freemarkerView、pdfView等。我們最常用的視圖就是jsp。
一般情況下需要通過頁面標簽或頁面模版技術將模型數據通過頁面展示給用戶,需要由程式員根據業務需求開發具體的頁面。
說明:在springmvc的各個組件中,處理器映射器、處理器適配器、視圖解析器稱為springmvc的三大組件。 需要用戶開發的組件有handler、view |
3.4. 預設載入的組件
我們沒有做任何配置,就可以使用這些組件
因為框架已經預設載入這些組件了,配置文件位置如下圖:
# Default implementation classes for DispatcherServlet's strategy interfaces.
# Used as fallback when no matching beans are found in the DispatcherServlet context.
# Not meant to be customized by application developers.
org.springframework.web.servlet.LocaleResolver=org.springframework.web.servlet.i18n.AcceptHeaderLocaleResolver
org.springframework.web.servlet.ThemeResolver=org.springframework.web.servlet.theme.FixedThemeResolver
org.springframework.web.servlet.HandlerMapping=org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping,\
org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping
org.springframework.web.servlet.HandlerAdapter=org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter,\
org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter,\
org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter
org.springframework.web.servlet.HandlerExceptionResolver=org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerExceptionResolver,\
org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver,\
org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver
org.springframework.web.servlet.RequestToViewNameTranslator=org.springframework.web.servlet.view.DefaultRequestToViewNameTranslator
org.springframework.web.servlet.ViewResolver=org.springframework.web.servlet.view.InternalResourceViewResolver
org.springframework.web.servlet.FlashMapManager=org.springframework.web.servlet.support.SessionFlashMapManager
3.5. 組件掃描器
使用組件掃描器省去在spring容器配置每個Controller類的繁瑣。
使用<context:component-scan>自動掃描標記@Controller的控制器類,
在springmvc.xml配置文件中配置如下:
<!-- 配置controller掃描包,多個包之間用,分隔 --> <context:component-scan base-package="cn.itcast.springmvc.controller" />
3.6. 註解映射器和適配器
3.6.1. 配置處理器映射器
註解式處理器映射器,對類中標記了@ResquestMapping的方法進行映射。根據@ResquestMapping定義的url匹配@ResquestMapping標記的方法,匹配成功返回HandlerMethod對象給前端控制器。
HandlerMethod對象中封裝url對應的方法Method。
從spring3.1版本開始,廢除了DefaultAnnotationHandlerMapping的使用,推薦使用RequestMappingHandlerMapping完成註解式處理器映射。
在springmvc.xml配置文件中配置如下:
<!-- 配置處理器映射器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" />
註解描述:
@RequestMapping:定義請求url到處理器功能方法的映射
3.6.2. 配置處理器適配器
註解式處理器適配器,對標記@ResquestMapping的方法進行適配。
從spring3.1版本開始,廢除了AnnotationMethodHandlerAdapter的使用,推薦使用RequestMappingHandlerAdapter完成註解式處理器適配。
在springmvc.xml配置文件中配置如下:
<!-- 配置處理器適配器 --> <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" />
3.6.3. 註解驅動
直接配置處理器映射器和處理器適配器比較麻煩,可以使用註解驅動來載入。
SpringMVC使用<mvc:annotation-driven>自動載入RequestMappingHandlerMapping和RequestMappingHandlerAdapter
可以在springmvc.xml配置文件中使用<mvc:annotation-driven>替代註解處理器和適配器的配置。
<!-- 註解驅動 --> <mvc:annotation-driven />
3.7. 視圖解析器
視圖解析器使用SpringMVC框架預設的InternalResourceViewResolver,這個視圖解析器支持JSP視圖解析
在springmvc.xml配置文件中配置如下:
<!-- Example: prefix="/WEB-INF/jsp/", suffix=".jsp", viewname="test" -> "/WEB-INF/jsp/test.jsp" --> <!-- 配置視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <!-- 配置邏輯視圖的首碼 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 配置邏輯視圖的尾碼 --> <property name="suffix" value=".jsp" /> </bean>
邏輯視圖名需要在controller中返回ModelAndView指定,比如邏輯視圖名為ItemList,則最終返回的jsp視圖地址:
“WEB-INF/jsp/itemList.jsp”
最終jsp物理地址:首碼+邏輯視圖名+尾碼
3.7.1. 修改ItemController
修改ItemController中設置視圖的代碼
// @RequestMapping:裡面放的是請求的url,和用戶請求的url進行匹配 // action可以寫也可以不寫 @RequestMapping("/itemList.action") public ModelAndView queryItemList() { // 創建頁面需要顯示的商品數據 List<Item> list = new ArrayList<>(); list.add(new Item(1, "1華為 榮耀8", 2399, new Date(), "質量好!1")); list.add(new Item(2, "2華為 榮耀8", 2399, new Date(), "質量好!2")); list.add(new Item(3, "3華為 榮耀8", 2399, new Date(), "質量好!3")); list.add(new Item(4, "4華為 榮耀8", 2399, new Date(), "質量好!4")); list.add(new Item(5, "5華為 榮耀8", 2399, new Date(), "質量好!5")); list.add(new Item(6, "6華為 榮耀8", 2399, new Date(), "質量好!6")); // 創建ModelAndView,用來存放數據和視圖 ModelAndView modelAndView = new ModelAndView(); // 設置數據到模型中 modelAndView.addObject("itemList", list); // 設置視圖jsp,需要設置視圖的物理地址 // modelAndView.setViewName("/WEB-INF/jsp/itemList.jsp"); // 配置好視圖解析器首碼和尾碼,這裡只需要設置邏輯視圖就可以了。 // 視圖解析器根據首碼+邏輯視圖名+尾碼拼接出來物理路徑 modelAndView.setViewName("itemList"); return modelAndView; }
3.7.2. 效果
效果和之前一樣,如下圖:
4. 整合mybatis
為了更好的學習 springmvc和mybatis整合開發的方法,需要將springmvc和mybatis進行整合。
整合目標:控制層採用springmvc、持久層使用mybatis實現。
4.1. 創建資料庫表
sql腳本,位置如下圖:
創建資料庫表springmvc,導入到資料庫中,如下圖:
4.2. 需要的jar包
- spring(包括springmvc)
- mybatis
- mybatis-spring整合包
- 資料庫驅動
- 第三方連接池。
jar包位置如下圖:
4.3. 整合思路
Dao層:
1、SqlMapConfig.xml,空文件即可,但是需要文件頭。
2、applicationContext-dao.xml
a) 資料庫連接池
b) SqlSessionFactory對象,需要spring和mybatis整合包下的。
c) 配置mapper文件掃描器。
Service層:
1、applicationContext-service.xml包掃描器,掃描@service註解的類。
2、applicationContext-trans.xml配置事務。
Controller層:
1、Springmvc.xml
a) 包掃描器,掃描@Controller註解的類。
b) 配置註解驅動
c) 配置視圖解析器
Web.xml文件:
1、配置spring
2、配置前端控制器。
4.4. 創建工程
創建動態web工程springmvc-web,如下圖:
4.5. 加入jar包
複製jar包到/WEB-INF/lib中
工程自動載入jar包
4.6. 加入配置文件
創建資源文件夾config
在其下創建mybatis和spring文件夾,用來存放配置文件,如下圖:
4.6.1. sqlMapConfig.xml
使用逆向工程來生成Mapper相關代碼,不需要配置別名。
在config/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> </configuration>
4.6.2. applicationContext-dao.xml
配置數據源、配置SqlSessionFactory、mapper掃描器。
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 載入配置文件 --> <context:property-placeholder location="classpath:db.properties" /> <!-- 資料庫連接池 --> <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close"> <property name="driverClassName" value="${jdbc.driver}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> <property name="maxActive" value="10" /> <property name="maxIdle" value="5" /> </bean> <!-- 配置SqlSessionFactory --> <bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> <!-- 資料庫連接池 --> <property name="dataSource" ref="dataSource" /> <!-- 載入mybatis的全局配置文件 --> <property name="configLocation" value="classpath:mybatis/SqlMapConfig.xml" /> </bean> <!-- 配置Mapper掃描 --> <bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> <!-- 配置Mapper掃描包 --> <property name="basePackage" value="cn.itcast.ssm.mapper" /> </bean> </beans>
4.6.3. db.properties
配置資料庫相關信息
jdbc.driver=com.mysql.jdbc.Driver
jdbc.url=jdbc:mysql://localhost:3306/springmvc?characterEncoding=utf-8
jdbc.username=root
jdbc.password=root
4.6.4. applicationContext-service.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 配置service掃描 --> <context:component-scan base-package="cn.itcast.ssm.service" /> </beans>
4.6.5. applicationContext-trans.xml
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:context="http://www.springframework.org/schema/context" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.0.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.0.xsd http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-4.0.xsd"> <!-- 事務管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <!--