轉載:https://blog.kuangstudy.com/index.php/archives/311/
轉載:https://blog.kuangstudy.com/index.php/archives/318/
一.什么是SpringMVC
1.概述
Spring MVC是Spring Framework的一部分,是基於Java實現MVC的輕量級Web框架。
查看官方文檔:https://docs.spring.io/spring/docs/5.2.0.RELEASE/spring-framework-reference/web.html#spring-web
我們為什么要學習SpringMVC呢?
Spring MVC的特點:
-
輕量級,簡單易學
-
高效 , 基於請求響應的MVC框架
-
與Spring兼容性好,無縫結合
-
約定優於配置
-
功能強大:RESTful、數據驗證、格式化、本地化、主題等
-
簡潔靈活
Spring的web框架圍繞DispatcherServlet [ 調度Servlet ] 設計。
DispatcherServlet的作用是將請求分發到不同的處理器。從Spring 2.5開始,使用Java 5或者以上版本的用戶可以采用基於注解形式進行開發,十分簡潔;
正因為SpringMVC好 , 簡單 , 便捷 , 易學 , 天生和Spring無縫集成(使用SpringIoC和Aop) , 使用約定優於配置 . 能夠進行簡單的junit測試 . 支持Restful風格 .異常處理 , 本地化 , 國際化 , 數據驗證 , 類型轉換 , 攔截器 等等......所以我們要學習 .
最重要的一點還是用的人多 , 使用的公司多 .
二.SpringMVC入門程序
1.步驟
-
建立子項目spingmvc-02-hello,添加web框架
-
配置web.xml,注冊DispatcherServlet
-
在resources目錄中創建springmvc-servlet.xml,添加處理器映射器,處理器適配器,視圖解析器
-
在java目錄中創建ustc/wzh/controller/HelloController.java
-
注冊類到springmvc-servlet.xml
-
在WEB-INF下創建jsp/hello.jsp
-
查看是否導入lib包,配置Tomcat,執行程序
建立子項目spingmvc-02-hello,添加web框架
配置web.xml,注冊DispatcherServlet
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--1.注冊DispatcherServlet--> <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--關聯一個springmvc的配置文件:【servlet-name】-servlet.xml--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!--啟動級別-1--> <load-on-startup>1</load-on-startup> </servlet> <!--/ 匹配所有的請求;(不包括.jsp)--> <!--/* 匹配所有的請求;(包括.jsp)--> <servlet-mapping> <servlet-name>springmvc</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
在resources目錄中創建springmvc-servlet.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" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!--處理器映射器--> <bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/> <!--處理器適配器--> <bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/> <!--視圖解析器:DispatcherServlet給他的ModelAndView--> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="InternalResourceViewResolver"> <!--前綴--> <property name="prefix" value="/WEB-INF/jsp/"/> <!--后綴--> <property name="suffix" value=".jsp"/> </bean> </beans>
在java目錄中創建ustc/wzh/controller/HelloController.java
import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.mvc.Controller; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //注意:這里我們先導入Controller接口 public class HelloController implements Controller { public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { //ModelAndView 模型和視圖 ModelAndView mv = new ModelAndView(); //封裝對象,放在ModelAndView中。Model mv.addObject("msg","HelloSpringMVC!"); //封裝要跳轉的視圖,放在ModelAndView中 mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jsp return mv; } }
注冊類到springmvc-servlet.xml
<!--Handler-->
<bean id="/hello" class="ustc.wzh.controller.HelloController"/>
在WEB-INF下創建jsp/hello.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>hello spring mvc</title>
</head>
<body>
${msg}
</body>
</html>
查看是否導入lib包,配置Tomcat,執行程序
- 點擊1在WEB-INF目錄下添加一個lib目錄
- 點擊2添加library Files 導入所有包
- 點擊Apply和OK即可
三.SpringMVC的執行原理
圖為SpringMVC的一個較完整的流程圖,實線表示SpringMVC框架提供的技術,不需要開發者實現,虛線表示需要開發者實現。
1.簡要分析執行流程
-
DispatcherServlet表示前置控制器,是整個SpringMVC的控制中心。用戶發出請求,DispatcherServlet接收請求並攔截請求。
-
我們假設請求的url為 : http://localhost:8080/SpringMVC/hello
-
如上url拆分成三部分:
-
http://localhost:8080服務器域名
-
SpringMVC部署在服務器上的web站點
-
hello表示控制器
-
通過分析,如上url表示為:請求位於服務器localhost:8080上的SpringMVC站點的hello控制器。
-
-
HandlerMapping為處理器映射。DispatcherServlet調用HandlerMapping,HandlerMapping根據請求url查找Handler。
-
HandlerExecution表示具體的Handler,其主要作用是根據url查找控制器,如上url被查找控制器為:hello。
-
HandlerExecution將解析后的信息傳遞給DispatcherServlet,如解析控制器映射等。
-
HandlerAdapter表示處理器適配器,其按照特定的規則去執行Handler。
-
Handler讓具體的Controller執行。
-
Controller將具體的執行信息返回給HandlerAdapter,如ModelAndView。
-
HandlerAdapter將視圖邏輯名或模型傳遞給DispatcherServlet。
-
DispatcherServlet調用視圖解析器(ViewResolver)來解析HandlerAdapter傳遞的邏輯視圖名。
-
視圖解析器將解析的邏輯視圖名傳給DispatcherServlet。
-
DispatcherServlet根據視圖解析器解析的視圖結果,調用具體的視圖。
-
最終視圖呈現給用戶。
2.SpringMVC的原理如下圖所示:
-
當發起請求時被前置的控制器攔截到請求,根據請求參數生成代理請求,找到請求對應的實際控制器,控制器處理請求,創建數據模型,訪問數據庫,將模型響應給中心控制器,控制器使用模型與視圖渲染視圖結果,將結果返回給中心控制器,再將結果返回給請求者。
3.中心控制器
-
Spring的web框架圍繞DispatcherServlet設計。 DispatcherServlet的作用是將請求分發到不同的處理器。從Spring 2.5開始,使用Java 5或者以上版本的用戶可以采用基於注解的controller聲明方式。
-
Spring MVC框架像許多其他MVC框架一樣, 以請求為驅動 , 圍繞一個中心Servlet分派請求及提供其他功能,DispatcherServlet是一個實際的Servlet (它繼承自HttpServlet 基類)。
四.SpringMVC使用注解真實開發
1.步驟:
-
創建一個普通的maven子項目springmvc-03-annotation,在父和子項目中導入包以及解決資源過濾問題
-
添加web框架並且查看項目架構的打包是否有lib沒有就添加lib目錄並導包
-
配置web.xml
-
注冊Servlet
-
攔截所有請求
-
-
配置springmvc-servlet.xml
-
指定需要掃描注解的包
-
設置不處理靜態資源
-
開啟注解驅動
-
配置視圖解析器
-
-
編寫控制器controller
-
編寫視圖jsp
-
配置Tomcat並測試
創建一個普通的maven子項目springmvc-03-annotation,在父和子項目中導入包以及解決資源過濾問題
<build> <resources> <resource> <directory>src/main/java</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> <resource> <directory>src/main/resources</directory> <includes> <include>**/*.properties</include> <include>**/*.xml</include> </includes> <filtering>false</filtering> </resource> </resources> </build>
添加web框架並且查看項目架構的打包是否有lib沒有就添加lib目錄並導包
配置web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <!--1.注冊servlet--> <servlet> <servlet-name>SpringMVC</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!--通過初始化參數指定SpringMVC配置文件的位置,進行關聯--> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc-servlet.xml</param-value> </init-param> <!-- 啟動順序,數字越小,啟動越早 --> <load-on-startup>1</load-on-startup> </servlet> <!--所有請求都會被springmvc攔截 --> <servlet-mapping> <servlet-name>SpringMVC</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> </web-app>
配置springmvc-servlet.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: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.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"> <!-- 自動掃描包,讓指定包下的注解生效,由IOC容器統一管理 --> <context:component-scan base-package="ustc.wzh.controller"/> <!-- 讓Spring MVC不處理靜態資源 --> <mvc:default-servlet-handler /> <!-- 支持mvc注解驅動 在spring中一般采用@RequestMapping注解來完成映射關系 要想使@RequestMapping注解生效 必須向上下文中注冊DefaultAnnotationHandlerMapping 和一個AnnotationMethodHandlerAdapter實例 這兩個實例分別在類級別和方法級別處理。 而annotation-driven配置幫助我們自動完成上述兩個實例的注入。 --> <mvc:annotation-driven /> <!-- 視圖解析器 --> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" id="internalResourceViewResolver"> <!-- 前綴 --> <property name="prefix" value="/WEB-INF/jsp/" /> <!-- 后綴 --> <property name="suffix" value=".jsp" /> </bean> </beans>
編寫控制器controller
@Controller @RequestMapping("/HelloController") public class HelloController { //真實訪問地址 : 項目名/HelloController/hello @RequestMapping("/hello") public String sayHello(Model model){ //向模型中添加屬性msg與值,可以在JSP頁面中取出並渲染 model.addAttribute("msg","hello,SpringMVC"); //web-inf/jsp/hello.jsp return "hello"; } }
編寫視圖jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>hello</title> </head> <body> ${msg} </body> </html>