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 成為處理請(qǐng)求的控制器,而無須實(shí)現(xiàn)任

何接口。

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

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

1.1?SpringMVC是什么

1)一種輕量級(jí)的、基于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)行更簡(jiǎ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ī)制、能使用任何對(duì)象進(jìn)行數(shù)據(jù)綁定,不必實(shí)現(xiàn)特定框架的API
  • 更加簡(jiǎn)單、強(qiáng)大的異常處理
  • 對(duì)靜態(tài)資源的支持
  • 支持靈活的本地化、主題等解析

1.4 SpringMVC怎么玩

  • 將Web層進(jìn)行了職責(zé)解耦,基于請(qǐng)求-響應(yīng)模型
  • 常用主要組件
    • DispatcherServlet:前端控制器
    • Controller:處理器/頁面控制器,做的是MVC中的C的事情,但控制邏輯轉(zhuǎn)移到前端控制器了,用于對(duì)請(qǐng)求進(jìn)行處理
    • HandlerMapping:請(qǐng)求映射到處理器,找誰來處理,如果映射成功返回一個(gè)HandlerExecutionChain對(duì)象(包含一個(gè)Handler處理器(頁面控制器)對(duì)象、多個(gè)HandlerInterceptor攔截器對(duì)象)
    • 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>

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

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

  • 編寫處理請(qǐng)求的處理器,并標(biāo)識(shí)為處理器

package com.atguigu.springmvc.controller;

 

import org.springframework.stereotype.Controller;

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

 

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

public class HelloWorldController {

 

/**

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

?* 1. 使用 @RequestMapping 注解來映射請(qǐng)求的 URL

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

?* 會(huì)做如下的解析:

?* ????????????????通過 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>

  • 部署測(cè)試:

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

1.6 HelloWorld深度解析

? ?1)? HelloWorld請(qǐng)求流程圖解:

? ? 2)? 一般請(qǐng)求的映射路徑名稱和處理請(qǐng)求的方法名稱最好一致(實(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é)會(huì)出現(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)? 處理請(qǐng)求方式有哪幾種

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)流程分析:

基本步驟:

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