1、springmvc簡介
1.1、mvc架構
MVC 是一種著名的設計模式,特別是在 Web 應用程序領域。模式全都是關於將包含業務數據的模塊與顯示模塊的視圖解耦的。這是怎樣發生的?視圖(例如,JSP 頁面)怎樣能夠與其模型(例如,包含數據的 JavaBean)解耦?記得這句格言麼?一個層次的重定向幾乎可以解決計算機業中的所有問題。確實,在模型和視圖之間引入重定向層可以解決問題。此重定向層是控制器。控制器將接收請求,執行更新模型的操作,然後通知視圖關於模型更改的消息。依賴於模型的狀態並且依賴於請求的控制器可以決定要顯示哪個視圖。
MVC(Model-View-Controller)三元組的概念:
1、 Model(模型):數據模型,提供要展示的數據,因此包含數據和行爲,可以認爲是領域模型或 JavaBean 組件(包含數據和行爲),不過現在一般都分離開來:Value Object(數據) 和 服務層(行爲)。也就是模型提供了模型數據查詢和模型數據的狀態更新等功能,包括數據和業務。
2、 領域模型javaBean組件等價於 域模型層 + 業務邏輯層 + 持久層(M)
3、 View(視圖):負責進行模型的展示,一般就是我們見到的用戶界面,客戶想看到的東西(V)。
4、 Controller(控制器):接收用戶請求,委託給模型進行處理(狀態改變),處理完畢後把返回的模型數據返回給視圖(C)
1.2、springmvc架構
SpringMVC是Spring框架的一個模塊,Spring和SpringMVC無需通過中間整合層進行整合。SpringMVC是基於MVC架構的WEB框架。
SpringMVC框架是一個基於請求驅動的Web框架,使用了前端控制器模式來進行設計,再根據請求映射規則分發給相應的頁面控制器(動作/處理器)進行處理。首先讓我們來整體看一下Spring Web MVC請求的處理流程。
1.3、 SpringMVC請求處理流程
對工作原理解釋說明:
① 用戶發送請求到springmvc框架提供的DispatcherServlet 這個前端控制器
② 前端控制器會去找處理器映射器(HandlerMapping),處理器映射器根據請求url找到具體的處理器,生成處理器對象及處理器攔截器(如果有則生成)一併返回給DispatcherServlet 。
③ 根據處理器映射器返回的處理器,DispatcherServlet 會找“合適”的處理器適配器(HandlerAdapter)
④ 處理器適配器HandlerAdpater會去執行處理器(Handler開發的時候會被叫成Controller也叫後端控制器) 執行之前會有轉換器、數據綁定、校驗器等等完成上面這些纔會去正在執行Handler
⑤ 後端控制器Handler執行完成之後返回一個ModelAndView對象
⑥ 處理器適配器HandlerAdpater會將這個ModelAndView返回前端控制器DispatcherServlet。前端控制器會將ModelAndView對象交給視圖解析器ViewResolver。
⑦ 視圖解析器ViewResolver解析ModelAndView對象之後返回邏輯視圖。
⑧ 前端控制器DispatcherServlet對邏輯視圖進行渲染(數據填充)之後返回真正的物理View並響應給瀏覽器。
對組件說明:
1、 DispatherServlet:前端控制器
用戶請求到達前端控制器,相當於MVC中的C,而DispatherServlet是整個流程的核心,它來調用其他組件來處理用戶的請求,前端控制器的存在降低了其他組件之間的耦合度。
2、 HandlerMapping:處理器映射器
它的作用就好比去看電影要拿着電影票根據電影票上面的座位號找到座位其中座位就是Handler,電影票以及上面的座位號就是URL
HandlerMapping 負責根據用戶請求找到Handler即處理器,springmvc提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,註解方式等。
3、 HandlerAdapter:處理器適配器
通過HandlerAdapter對處理器進行執行,這是適配器模式的應用,通過適配器可以對更多類型的處理器進行執行。
播放的電影是3D的你看不清楚,因此電影院跟你說你要想看清電影就必須戴3D眼鏡。也就是說Handler滿足一定的要求才可以被執行。
4、 Handler:後端控制器
Handler是後端控制器,在前端控制器的控制下後端控制器對具體的用戶請求進行處理,Handler涉及到具體的用戶業務請求,所以一般情況下需要程序員根據業務需求開發.
5、 ViewResolver:視圖解析器
ViewResolver負責將處理結果生成View視圖,ViewResolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最後對View進行渲染將處理結果通過頁面展示給用戶。
2 第一個springMVC程序(掌握)
2.1 創建maven web工程
2.1.1 工程結構圖
2.1.2 配置pom.xml文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.zhiyou100</groupId>
<artifactId>springmvc01</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- junit start-->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
<scope>test</scope>
</dependency>
<!-- junit end-->
<!--spring start-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.4.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>4.3.4.RELEASE</version>
<scope>test</scope>
</dependency>
<!-- Servlet -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.0.1</version>
<scope>provided</scope>
</dependency>
<!-- JSP -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.2</version>
<scope>provided</scope>
</dependency>
<!-- JSTL -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
<scope>runtime</scope>
</dependency>
</dependencies>
<build>
<finalName>springmvc01</finalName>
</build>
</project>
2.1.3 修改web.xml內容,修改爲servlet3.0規範
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
</web-app>
2.1.4 在src/main/resources目錄下創建applicationContext-servlet.xml
<beans xmlns="http://www.springframework.org/schema/beans"
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-3.1.xsd">
</beans>
2.2 配置DispatcherServlet前端控制器
DispatcherServlet:前端控制器
用戶請求首先到達前端控制器, DispatherServlet是整個流程的核心,它來調用其他組件來處理用戶的請求,前端控制器的存在降低了其他組件之間的耦合度
在web.xml文件中添加如下配置:
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
<!-- DispatcherServlet:前端控制器 配置前端控制器servlet -->
<servlet>
<servlet-name>springmvc</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--加載前端控制器配置文件 上下文配置位置-->
<init-param>
<!--contextConfigLocation:指定springmvc配置的加載位置,
如果不指定則默認加 載WEB-INF/[DispatcherServlet的Servlet名字]-servlet.xml(例如springmvc-servlet.xml)。
-->
<param-name>contextConfigLocation</param-name>
<param-value>classpath:applicationContext-servlet.xml</param-value>
</init-param>
<!-- 表示隨WEB服務器啓動 -->
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>springmvc</servlet-name>
<!-- 可以攔截二種請求
第一種:攔截固定後綴的url,比如設置爲 *.do、*.action,
例如:/user/add.action 此方法最簡單,不會導致靜態資源(jpg,js,css)被攔截
第二種:攔截所有 設置爲/,
例如:/user/add /user/add.action此方法可以實現REST風格的url
很多互聯網類型的應用使用這種方式.但是此方法會導致靜態文件(jpg,js,css)被攔截後不能正常顯示.需要特殊處理
錯誤設置:攔截所有,設置爲/*,此設置方法錯誤,因爲請求到Action,
當action轉到jsp時再次被攔截,提示不能根據jsp路徑mapping成功.
-->
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
2.3 配置HandlerMapping處理器映射器
HandlerMapping:處理器映射器
它的作用就好比去看電影要拿着電影票根據電影票上面的座位號找到座位其中座位就是Handler,電影票以及上面的座位號就是URL
HandlerMapping 負責根據用戶請求找到Handler即處理器,springmvc提供了不同的映射器實現不同的映射方式,例如:配置文件方式,實現接口方式,註解方式等。
在applicationContext-servlet.xml添加處理映射器的配置
<beans xmlns="http://www.springframework.org/schema/beans"
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.xsd">
<!-- 處理器映射器 -->
<!-- 根據bean的name進行查找Handler處理器 將請求的url配置在bean的name中 -->
<!-- 這是一個默認的映射處理器,即使不配置,那麼也是默認就是這個 -->
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
</beans>
2.4 配置HandlerAdapter處理器適配器
HandlerAdapter:處理器適配器
通過HandlerAdapter對Handler(控制器)進行適配,通過適配器可以對更多類型的處理器進行適配。
播放的電影是3D的你看不清楚,因此電影院跟你說你要想看清電影就必須戴3D眼鏡。也就是說Handler滿足一定的要求才可以被執行。
在applicationContext-servlet.xml添加適配器的配置
<!-- HandlerAdapter適配器 -->
<!-- 注意:這個適配器不是必須配置的,這是默認的、他在servlet容器已啓動就被加載-->
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
2.5 開發Handler後端控制器
Handler:後端控制器
Handler是後端控制器,在前端控制器的控制下後端控制器對具體的用戶請求進行處理,Handler涉及到具體的用戶業務請求,所以一般情況下需要程序員根據業務需求開發.
2.5.1 創建HelloController類
自定義的HelloController類需要實現springmvc的org.springframework.web.servlet.mvc.Controller接口
ackage com.zhiyou100.controller;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.Controller;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
//1.收集參數、驗證參數
//2.綁定參數到命令對象
//3.將命令對象傳入業務對象進行處理
//4.選擇視圖返回
ModelAndView mv = new ModelAndView();
//添加模型數據,那麼這個數據可以是任意的POJO對象。
mv.addObject("hello", "hello springmvc !!");//request.setAtt..(“hello”,”hello springmvc!!”)
//設置邏輯視圖路徑
mv.setViewName("/WEB-INF/view/hello.jsp");//
//返回模型和視圖
return mv;
}
}
ModelAndView對象封裝了模型數據和視圖對象,有一個組件叫視圖解析器,就是用來解析這個對象的,它可以把這個對象解析成兩部分一個爲Model另一個爲View然後將model渲染到View上面(簡單點就是將model裏面的數據放到頁面),最終返回給用戶。
2.5.2 配置自定義Handler控制器
在applicationContext-servlet.xml添加HelloController控制器的配置
<!-- Handler後端控制器 -->
<!-- 配置controller ,使用beanName:name="/hello.do"進行進行請求映射匹配-->
<bean name="/hello.do" class="com.zhiyou100.controller.HelloController"/>
2.6 定義一個響應頁面
在WEB-INF/view/下創建hello.jsp頁面
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Hello SpringMVC</title>
</head>
<body>
${hello}
</body>
</html>
2.7 發佈項目
在瀏覽器輸入http://localhost:8080/hello,顯示如下內容,表示配置成功
2.8 配置視圖解析器
ViewResolver:視圖解析器
ViewResolver負責將處理結果生成View視圖,ViewResolver首先根據邏輯視圖名解析成物理視圖名即具體的頁面地址,再生成View視圖對象,最後對View進行渲染將處理結果通過頁面展示給用戶
在applicationContext-servlet.xml添加視圖解析器的配置
<!-- InternalResourceViewResolver:支持JSP視圖解析 -->
<!-- viewClass:JstlView表示JSP模板頁面需要使用JSTL標籤庫,所以classpath中必須包含jstl的相關jar包; -->
<!-- prefix 和suffix:查找視圖頁面的前綴和後綴,最終視圖的址爲: -->
<!-- 前綴+邏輯視圖名+後綴,邏輯視圖名需要在controller中返回ModelAndView指定,比如邏輯視圖名爲hello,-->
<!-- 則最終返回的jsp視圖地址 "WEB-INF/view/hello.jsp" -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/view/"/>
<property name="suffix" value=".jsp"/>
</bean>
2.9 修改HelloController控制器
public class HelloController implements Controller {
@Override
public ModelAndView handleRequest(HttpServletRequest request,
HttpServletResponse response) throws Exception {
//1.收集參數、驗證參數
//2.綁定參數到命令對象
//3.將命令對象傳入業務對象進行處理
//4.選擇視圖返回
ModelAndView mv = new ModelAndView();
//添加模型數據,那麼這個數據可以是任意的POJO對象。
mv.addObject("hello", "hello springmvc !!");
//mv.setViewName("/WEB-INF/view/hello.jsp");
//設置邏輯視圖名,視圖解析器會根據該名字解析到具體的視圖界面
mv.setViewName("hello");
//返回模型和視圖
return mv;
}
}
重複2.7章節測試過程
2.10 總結
到此HelloSpringmvc就完成了,我們主要進行了如下配置:
1、 前端控制器DispatcherServlet(在web.xml文件中配置);
2、 處理器映射器HandlerMapping(可不配置,使用默認)
3、 處理器適配器HandlerAdapter(可不配置,使用默認)
4、 處理器(後端控制器)Handler (需要編程開發和配置)
5、 視圖解析器ViewResolver(只需要配置一次)
6、 視圖(需要編程開發)