SpringMVC框架 第1章 SpringMVC 概述

1?SpringMVC 概述

1.1?SpringMVC 概述

? 1)? Spring 為展現(xiàn)層提供的基于 MVC 設(shè)計(jì)理念的優(yōu)秀的 Web 框架,是目前最主流的

MVC 框架之一

2)Spring3.0 后全面超越 Struts2,成為最優(yōu)秀的 MVC 框架。

3)Spring MVC 通過一套 MVC 注解,讓 POJO 成為處理請求的控制器,而無須實(shí)現(xiàn)任

何接口。

4)支持 REST 風(fēng)格的 URL 請求。

5)采用了松散耦合可插拔組件結(jié)構(gòu),比其他 MVC 框架更具擴(kuò)展性和靈活性。

1.1?SpringMVC是什么

1)一種輕量級的、基于MVC的Web層應(yīng)用框架。偏前端而不是基于業(yè)務(wù)邏輯層。Spring框架的一個(gè)后續(xù)產(chǎn)品。

2)Spring框架結(jié)構(gòu)圖(新版本):

1.3 SpringMVC能干什么

  • 天生與Spring框架集成,如:(IOC,AOP)
  • 支持Restful風(fēng)格
  • 進(jìn)行更簡潔的Web層開發(fā)
  • 支持靈活的URL到頁面控制器的映射
  • 非常容易與其他視圖技術(shù)集成,如:Velocity、FreeMarker等等
  • 因?yàn)槟P蛿?shù)據(jù)不存放在特定的API里,而是放在一個(gè)Model里(Map數(shù)據(jù)結(jié)構(gòu)實(shí)現(xiàn),因此很容易被其他框架使用)
  • 非常靈活的數(shù)據(jù)驗(yàn)證、格式化和數(shù)據(jù)綁定機(jī)制、能使用任何對象進(jìn)行數(shù)據(jù)綁定,不必實(shí)現(xiàn)特定框架的API
  • 更加簡單、強(qiáng)大的異常處理
  • 對靜態(tài)資源的支持
  • 支持靈活的本地化、主題等解析

1.4 SpringMVC怎么玩

  • 將Web層進(jìn)行了職責(zé)解耦,基于請求-響應(yīng)模型
  • 常用主要組件
    • DispatcherServlet:前端控制器
    • Controller:處理器/頁面控制器,做的是MVC中的C的事情,但控制邏輯轉(zhuǎn)移到前端控制器了,用于對請求進(jìn)行處理
    • HandlerMapping:請求映射到處理器,找誰來處理,如果映射成功返回一個(gè)HandlerExecutionChain對象(包含一個(gè)Handler處理器(頁面控制器)對象、多個(gè)HandlerInterceptor攔截器對象)
    • View Resolver: 視圖解析器,找誰來處理返回的頁面。把邏輯視圖解析為具體的View,進(jìn)行這種策略模式,很容易更換其他視圖技術(shù);
      • 如InternalResourceViewResolver將邏輯視圖名映射為JSP視圖
    • LocalResolver:本地化、國際化
    • MultipartResolver:文件上傳解析器
    • HandlerExceptionResolver:異常處理器

1.5 永遠(yuǎn)的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的初始化參數(shù):設(shè)置文件的路徑和文件名稱 -->

<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>

  • 解釋配置文件的名稱定義規(guī)則:

實(shí)際上也可以不通過 contextConfigLocation 來配置 SpringMVC 的配置文件, 而使用默認(rèn)的.默認(rèn)的配置文件為: /WEB-INF/<servlet-name>-servlet.xml

 

? 3)? 加入 Spring MVC 的配置文件:xml

  • 增加名稱空間

  • 增加配置

<!-- 設(shè)置掃描組件的包: -->

<context:component-scan base-package="com.atguigu.springmvc"/>

 

<!-- 配置映射解析器:如何將控制器返回的結(jié)果字符串,轉(zhuǎn)換為一個(gè)物理的視圖文件-->

<bean id="internalResourceViewResolver"

??class="org.springframework.web.servlet.view.InternalResourceViewResolver">

<property name="prefix" value="/WEB-INF/views/"/>

<property name="suffix" value=".jsp"/>

</bean>

  • 需要創(chuàng)建一個(gè)入口頁面,index.jsp

<a href="${pageContext.request.contextPath }/helloworld">Hello World</a>

  • 編寫處理請求的處理器,并標(biāo)識為處理器

package com.atguigu.springmvc.controller;

 

import org.springframework.stereotype.Controller;

import org.springframework.web.bind.annotation.RequestMapping;

 

@Controller ?//聲明Bean對象,為一個(gè)控制器組件

public class HelloWorldController {

 

/**

?* 映射請求的名稱:用于客戶端請求;類似Struts2中action映射配置的action名稱

?* 1. 使用 @RequestMapping 注解來映射請求的 URL

?* 2. 返回值會通過視圖解析器解析為實(shí)際的物理視圖, 對于 InternalResourceViewResolver 視圖解析器,

?* 會做如下的解析:

?* ????????????????通過 prefix + returnVal + suffix 這樣的方式得到實(shí)際的物理視圖, 然后做轉(zhuǎn)發(fā)操作.

?* ????????????????/WEB-INF/views/success.jsp

?*/

@RequestMapping(value="/helloworld",method=RequestMethod.GET)

public String helloworld(){

?????System.out.println("hello,world");

?????return "success"; //結(jié)果如何跳轉(zhuǎn)呢?需要配置映射解析器

}????????

}

  • 編寫視圖

/WEB-INF/views/success.jsp

<h4>Sucess Page</h4>

  • 部署測試:

http://localhost:8080/SpringMVC_01_HelloWorld/index.jsp

1.6 HelloWorld深度解析

? ?1)? HelloWorld請求流程圖解:

? ? 2)? 一般請求的映射路徑名稱和處理請求的方法名稱最好一致(實(shí)質(zhì)上方法名稱任意)

@RequestMapping(value="/helloworld",method=RequestMethod.GET)

public String helloworld(){

//public String abc123(){

System.out.println("hello,world");

return "success";

}

? ?3)? 演示一個(gè)錯(cuò)誤

經(jīng)常有同學(xué)會出現(xiàn)配置上錯(cuò)誤,把“/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可以應(yīng)用在什么地方

@Target({ElementType.METHOD, ElementType.TYPE})

@Retention(RetentionPolicy.RUNTIME)

@Documented

@Mapping

public @interface RequestMapping?{…}

6)流程分析:

基本步驟:

  • 客戶端請求提交到DispatcherServlet
  • 由DispatcherServlet控制器查詢一個(gè)或多個(gè)HandlerMapping,找到處理請求的Controller
  • DispatcherServlet將請求提交到Controller(也稱為Handler)
  • Controller調(diào)用業(yè)務(wù)邏輯處理后,返回ModelAndView
  • DispatcherServlet查詢一個(gè)或多個(gè)ViewResoler視圖解析器,找到ModelAndView指定的視圖
  • 視圖負(fù)責(zé)將結(jié)果顯示到客戶端