SpringMVC框架 第1章 SpringMVC 概述
第1章?SpringMVC 概述
1.1?SpringMVC 概述
? 1)? Spring 為展現層提供的基于 MVC 設計理念的優秀的 Web 框架,是目前最主流的
MVC 框架之一
2)Spring3.0 后全面超越 Struts2,成為最優秀的 MVC 框架。
3)Spring MVC 通過一套 MVC 注解,讓 POJO 成為處理請求的控制器,而無須實現任
何接口。
4)支持 REST 風格的 URL 請求。
5)采用了松散耦合可插拔組件結構,比其他 MVC 框架更具擴展性和靈活性。
1.1?SpringMVC是什么
1)一種輕量級的、基于MVC的Web層應用框架。偏前端而不是基于業務邏輯層。Spring框架的一個后續產品。
2)Spring框架結構圖(新版本):
1.3 SpringMVC能干什么
- 天生與Spring框架集成,如:(IOC,AOP)
- 支持Restful風格
- 進行更簡潔的Web層開發
- 支持靈活的URL到頁面控制器的映射
- 非常容易與其他視圖技術集成,如:Velocity、FreeMarker等等
- 因為模型數據不存放在特定的API里,而是放在一個Model里(Map數據結構實現,因此很容易被其他框架使用)
- 非常靈活的數據驗證、格式化和數據綁定機制、能使用任何對象進行數據綁定,不必實現特定框架的API
- 更加簡單、強大的異常處理
- 對靜態資源的支持
- 支持靈活的本地化、主題等解析
1.4 SpringMVC怎么玩
- 將Web層進行了職責解耦,基于請求-響應模型
- 常用主要組件
- DispatcherServlet:前端控制器
- Controller:處理器/頁面控制器,做的是MVC中的C的事情,但控制邏輯轉移到前端控制器了,用于對請求進行處理
- HandlerMapping:請求映射到處理器,找誰來處理,如果映射成功返回一個HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器對象)
- View Resolver: 視圖解析器,找誰來處理返回的頁面。把邏輯視圖解析為具體的View,進行這種策略模式,很容易更換其他視圖技術;
- 如InternalResourceViewResolver將邏輯視圖名映射為JSP視圖
- LocalResolver:本地化、國際化
- MultipartResolver:文件上傳解析器
- HandlerExceptionResolver:異常處理器
1.5 永遠的HelloWorld
- 新建Web工程,加入 jar 包
spring-aop-4.0.0.RELEASE.jar spring-beans-4.0.0.RELEASE.jar spring-context-4.0.0.RELEASE.jar spring-core-4.0.0.RELEASE.jar spring-expression-4.0.0.RELEASE.jar commons-logging-1.1.3.jar spring-web-4.0.0.RELEASE.jar spring-webmvc-4.0.0.RELEASE.jar |
- 在xml 中配置 DispatcherServlet
<!-- 配置SpringMVC核心控制器: --> <servlet> <servlet-name>springDispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 配置DispatcherServlet的初始化參數:設置文件的路徑和文件名稱 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:springmvc.xml</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>springDispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping> |
- 解釋配置文件的名稱定義規則:
實際上也可以不通過 contextConfigLocation 來配置 SpringMVC 的配置文件, 而使用默認的.默認的配置文件為: /WEB-INF/<servlet-name>-servlet.xml
? 3)? 加入 Spring MVC 的配置文件:xml
- 增加名稱空間
- 增加配置
<!-- 設置掃描組件的包: --> <context:component-scan base-package="com.atguigu.springmvc"/>
<!-- 配置映射解析器:如何將控制器返回的結果字符串,轉換為一個物理的視圖文件--> <bean id="internalResourceViewResolver" ??class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> |
- 需要創建一個入口頁面,index.jsp
<a href="${pageContext.request.contextPath }/helloworld">Hello World</a> |
- 編寫處理請求的處理器,并標識為處理器
package com.atguigu.springmvc.controller;
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping;
@Controller ?//聲明Bean對象,為一個控制器組件 public class HelloWorldController {
/** ?* 映射請求的名稱:用于客戶端請求;類似Struts2中action映射配置的action名稱 ?* 1. 使用 @RequestMapping 注解來映射請求的 URL ?* 2. 返回值會通過視圖解析器解析為實際的物理視圖, 對于 InternalResourceViewResolver 視圖解析器, ?* 會做如下的解析: ?* ????????????????通過 prefix + returnVal + suffix 這樣的方式得到實際的物理視圖, 然后做轉發操作. ?* ????????????????/WEB-INF/views/success.jsp ?*/ @RequestMapping(value="/helloworld",method=RequestMethod.GET) public String helloworld(){ ?????System.out.println("hello,world"); ?????return "success"; //結果如何跳轉呢?需要配置映射解析器 }???????? } |
- 編寫視圖
/WEB-INF/views/success.jsp
<h4>Sucess Page</h4> |
- 部署測試:
http://localhost:8080/SpringMVC_01_HelloWorld/index.jsp
1.6 HelloWorld深度解析
? ?1)? HelloWorld請求流程圖解:
? ? 2)? 一般請求的映射路徑名稱和處理請求的方法名稱最好一致(實質上方法名稱任意)
@RequestMapping(value="/helloworld",method=RequestMethod.GET) public String helloworld(){ //public String abc123(){ System.out.println("hello,world"); return "success"; } |
? ?3)? 演示一個錯誤
經常有同學會出現配置上錯誤,把“/WEB-INF/views/”配置成了?"/WEB-INF/views"
<bean id="internalResourceViewResolver" ??class="org.springframework.web.servlet.view.InternalResourceViewResolver"> <property name="prefix" value="/WEB-INF/views/"/> <property name="suffix" value=".jsp"/> </bean> |
? 4)? 處理請求方式有哪幾種
public enum RequestMethod?{ GET, HEAD, POST, PUT, PATCH, DELETE, OPTIONS, TRACE } |
? 5)? @RequestMapping可以應用在什么地方
@Target({ElementType.METHOD, ElementType.TYPE}) @Retention(RetentionPolicy.RUNTIME) @Documented @Mapping public @interface RequestMapping?{…} |
6)流程分析:
基本步驟:
- 客戶端請求提交到DispatcherServlet
- 由DispatcherServlet控制器查詢一個或多個HandlerMapping,找到處理請求的Controller
- DispatcherServlet將請求提交到Controller(也稱為Handler)
- Controller調用業務邏輯處理后,返回ModelAndView
- DispatcherServlet查詢一個或多個ViewResoler視圖解析器,找到ModelAndView指定的視圖
- 視圖負責將結果顯示到客戶端