目錄
? ? 前言? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? 回顧MVC三層架構(gòu)? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? 1. SpringMVC簡(jiǎn)介? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? 1.1 SpringMVC的特點(diǎn)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
? ? 1.2 SpringMVC核心組件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ??
? ? 1.3 SpringMVC工作流程? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? 2. SpringMVC入門案例? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? 2.1 添加pom.xml依賴?
? ? 2.2 創(chuàng)建spring-mvc.xml?
? ? 2.3 配置web.xml?
? ? 2.4 編寫處理器類?
? ? 2.5 編寫hello.jsp?
? ? 2.6 運(yùn)行測(cè)試?
? ? 2.7 靜態(tài)資源處理?
? ? 前言? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
????????Spring MVC(Model-View-Controller)是一個(gè)基于Java的Web應(yīng)用程序框架,它是Spring框架的一部分。主要是用來(lái)進(jìn)行Web開發(fā),是對(duì)Servlet進(jìn)行了封裝,也可以理解為是Servlet的加強(qiáng)版。
? ? 回顧MVC三層架構(gòu)? ? ? ? ??? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
學(xué)習(xí)SpringMVC之前我們先來(lái)回顧下自定義MVC框架思想:
一個(gè)自定義MVC框架的基本工作流程如下:
- 用戶通過(guò)視圖與應(yīng)用程序交互,視圖將用戶的請(qǐng)求傳遞給控制器。
- 控制器接收用戶請(qǐng)求,根據(jù)請(qǐng)求的類型和內(nèi)容決定調(diào)用哪個(gè)模型處理請(qǐng)求,并根據(jù)處理結(jié)果決定需要更新哪個(gè)視圖。
- 模型處理請(qǐng)求的過(guò)程中可能需要與數(shù)據(jù)庫(kù)或其他數(shù)據(jù)源進(jìn)行交互,獲取所需數(shù)據(jù)并進(jìn)行相應(yīng)的處理。處理完成后,將結(jié)果返回給控制器。
- 控制器根據(jù)模型的處理結(jié)果,決定更新哪個(gè)視圖以展示結(jié)果給用戶。
- 視圖接收到控制器的指令后,根據(jù)要展示的內(nèi)容進(jìn)行相應(yīng)的處理和渲染,最終將結(jié)果呈現(xiàn)給用戶。
?
????????在自定義MVC中每個(gè)請(qǐng)求都需要寫一個(gè)Servlet,顯然是不方便了。SpringMVC的工作流程與此差不多,controller可以處理多個(gè)請(qǐng)求,并對(duì)請(qǐng)求進(jìn)行分發(fā),執(zhí)行不同的業(yè)務(wù)操作,對(duì)它進(jìn)行了加強(qiáng)讓開發(fā)更加便捷。
? ? SpringMVC簡(jiǎn)介? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
????????Spring MVC(Model-View-Controller)是一個(gè)基于Java的Web應(yīng)用程序框架,它是Spring框架的一部分。Spring MVC提供了一個(gè)簡(jiǎn)單、靈活且強(qiáng)大的模型,用于構(gòu)建Web應(yīng)用程序,它遵循MVC設(shè)計(jì)模式。這個(gè)模式有助于將應(yīng)用程序的表示層、業(yè)務(wù)邏輯層和數(shù)據(jù)訪問(wèn)層分離,使得開發(fā)更加模塊化和易于維護(hù)。
? ? SpringMVC的特點(diǎn)? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??
????????Spring MVC的核心原則是分離關(guān)注點(diǎn),將應(yīng)用程序的不同方面分離開來(lái),以便更好地管理和維護(hù)代碼。它通過(guò)將應(yīng)用程序分為模型(Model)、視圖(View)和控制器(Controller)三個(gè)部分來(lái)實(shí)現(xiàn)這一目標(biāo)。
-
模型(Model):模型代表應(yīng)用程序的數(shù)據(jù)和業(yè)務(wù)邏輯。它可以是一個(gè)POJO(Plain Old Java Object)或一個(gè)持久化實(shí)體類。模型負(fù)責(zé)處理數(shù)據(jù)的讀取、存儲(chǔ)和驗(yàn)證,并提供數(shù)據(jù)給視圖進(jìn)行展示。
-
視圖(View):視圖負(fù)責(zé)展示模型中的數(shù)據(jù)給用戶。它可以是一個(gè)JSP(JavaServer Pages)、HTML頁(yè)面或其他模板引擎生成的頁(yè)面。視圖通常是根據(jù)模型的數(shù)據(jù)來(lái)動(dòng)態(tài)生成的,以便將數(shù)據(jù)呈現(xiàn)給用戶。
-
控制器(Controller):控制器負(fù)責(zé)處理用戶請(qǐng)求并協(xié)調(diào)模型和視圖之間的交互。它接收用戶的請(qǐng)求,調(diào)用適當(dāng)?shù)哪P吞幚頂?shù)據(jù),并選擇合適的視圖來(lái)展示結(jié)果??刂破鬟€可以處理表單驗(yàn)證、異常處理和其他與請(qǐng)求相關(guān)的邏輯。
? ? SpringMVC核心組件? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?? ? ? ? ? ? ? ? ? ??
Spring MVC框架提供了一組核心組件來(lái)實(shí)現(xiàn)這種模型-視圖-控制器的架構(gòu)。其中包括:
-
DispatcherServlet:它是Spring MVC的前端控制器,負(fù)責(zé)接收所有的HTTP請(qǐng)求并將其分發(fā)給適當(dāng)?shù)奶幚沓绦颉?/p>
-
HandlerMapping:它負(fù)責(zé)將請(qǐng)求映射到適當(dāng)?shù)奶幚沓绦颍刂破鳎?/p>
-
Controller:它是處理程序的接口,負(fù)責(zé)處理用戶請(qǐng)求并返回適當(dāng)?shù)哪P秃鸵晥D。
-
ViewResolver:它負(fù)責(zé)將邏輯視圖名稱解析為實(shí)際的視圖對(duì)象。
-
View:它負(fù)責(zé)將模型數(shù)據(jù)渲染為最終的響應(yīng)結(jié)果,可以是JSP、HTML頁(yè)面或其他類型的視圖。
? ? ? ? 除了這些核心組件,Spring MVC還提供了許多其他功能,如數(shù)據(jù)綁定、表單處理、文件上傳、攔截器、國(guó)際化支持等,以幫助開發(fā)人員更輕松地構(gòu)建Web應(yīng)用程序。
?
? ? SpringMVC工作流程? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
- 用戶發(fā)來(lái)一個(gè)請(qǐng)求,首先進(jìn)入的是前端控制器DispatcherServlet
- 前端控制器(DispacherServlet)將用戶發(fā)來(lái)的請(qǐng)求發(fā)送給處理器映射器(HandlerMapping)
- 處理器映射器根據(jù)前端控制器發(fā)來(lái)的用戶的請(qǐng)求找到對(duì)應(yīng)符合的控制器(Handler),并且將其封裝成處理器執(zhí)行鏈,返回給前端控制器。
- 處理器適配器接收到來(lái)自前端控制器的執(zhí)行鏈后,找到對(duì)應(yīng)執(zhí)行此執(zhí)行鏈的處理器適配器(HandlerAdapter)來(lái)調(diào)用的具體的控制器(就是說(shuō)其對(duì)應(yīng)的方法或者邏輯)
- 處理器適配器 (HandlerAdaptoer) 會(huì)調(diào)用對(duì)應(yīng)的具體的 Controller(處理業(yè)務(wù)邏輯)
- 控制器執(zhí)行完成后,會(huì)返回一個(gè)ModelAndView對(duì)象給處理器適配器
- 處理器適配器將返回來(lái)的ModelAndView對(duì)象返回給前端控制器(到這里所有的業(yè)務(wù)處理過(guò)程就要完了,接下就是將結(jié)果以頁(yè)面的的形式響應(yīng)給用戶)
- 前端控制器將返回回來(lái)的ModelAndView對(duì)象交給視圖解析器(ViewResolver),視圖解析器根據(jù)傳過(guò)來(lái)的View對(duì)象解析成對(duì)應(yīng)的頁(yè)面對(duì)象
- ViewResolver 將封裝好的將頁(yè)面對(duì)象和Model對(duì)象返回給 DIspatcherServlet
- 前端控制器再將返回回來(lái)的對(duì)象交給視圖(View)
- 視圖根據(jù)傳過(guò)來(lái)的Model對(duì)象再一次的對(duì)頁(yè)面進(jìn)行渲染(將模型數(shù)據(jù)填充至視圖中),然后在返回給前端控制器。
- 前端控制器將完成的結(jié)果響應(yīng)給瀏覽器,然后瀏覽器在展現(xiàn)給用戶。
?
????SpringMVC入門案例? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?
? ? 添加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>org.example</groupId>
<artifactId>mybatis_spring</artifactId>
<packaging>war</packaging>
<version>1.0-SNAPSHOT</version>
<name>mybatis_spring Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
<maven.compiler.source>1.8</maven.compiler.source>
<maven.compiler.target>1.8</maven.compiler.target>
<maven.compiler.plugin.version>3.7.0</maven.compiler.plugin.version>
<!--添加jar包依賴-->
<!--1.spring 5.0.2.RELEASE相關(guān)-->
<spring.version>5.0.2.RELEASE</spring.version>
<!-- jstl+standard -->
<jstl.version>1.2</jstl.version>
<standard.version>1.1.2</standard.version>
<!-- spring -->
<spring.version>5.0.2.RELEASE</spring.version>
</properties>
<dependencies>
<!--1.spring相關(guān)-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
<version>${spring.version}</version>
</dependency>
<!-- spring mvc相關(guān)依賴 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>${jstl.version}</version>
</dependency>
<dependency>
<groupId>taglibs</groupId>
<artifactId>standard</artifactId>
<version>${standard.version}</version>
</dependency>
</dependencies>
<build>
<finalName>mybatis_spring</finalName>
</build>
</project>
缺少jstl+standard的這兩個(gè)jar包會(huì)報(bào)java.lang.NoClassDefFoundError: javax/servlet/jsp/jstl/core/Config,那是因?yàn)閛rg.springframework.web.servlet.view.JstlView在視圖解析時(shí)需要這二個(gè)jar包。
? ? 創(chuàng)建spring-mvc.xml?
<?xml version="1.0" encoding="UTF-8"?>
<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"
xmlns="http://www.springframework.org/schema/beans"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd">
<!--1) 掃描com.zking.zf及子子孫孫包下的控制器(掃描范圍過(guò)大,耗時(shí))-->
<context:component-scan base-package="com.ycxw"/>
<!--2) 此標(biāo)簽?zāi)J(rèn)注冊(cè)DefaultAnnotationHandlerMapping和AnnotationMethodHandlerAdapter -->
<mvc:annotation-driven/>
<!--3) 創(chuàng)建ViewResolver視圖解析器 -->
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<!-- viewClass需要在pom中引入兩個(gè)包:standard.jar and jstl.jar -->
<property name="viewClass"
value="org.springframework.web.servlet.view.JstlView"></property>
<property name="prefix" value="/WEB-INF/jsp/"/>
<property name="suffix" value=".jsp"/>
</bean>
<!--4) 單獨(dú)處理圖片、樣式、js等資源 -->
<!-- <mvc:resources location="/css/" mapping="/css/**"/>
<mvc:resources location="/js/" mapping="/js/**"/>
<mvc:resources location="WEB-INF/images/" mapping="/images/**"/>-->
</beans>
解釋:
這段代碼是一個(gè)Spring MVC應(yīng)用程序的XML配置文件。它用于配置Spring MVC的一些基本設(shè)置,包括組件掃描、注解驅(qū)動(dòng)、視圖解析器和靜態(tài)資源處理。下面是對(duì)這段代碼的逐行解釋:
<context:component-scan base-package="com.ycxw"/>
:?jiǎn)⒂媒M件掃描,讓Spring自動(dòng)掃描指定包(在這里是com.ycxw
)及其子包中的所有類,識(shí)別并注冊(cè)帶有特定注解(如@Controller
、@Service
等)的類為Spring容器中的bean。
<mvc:annotation-driven/>
:?jiǎn)⒂肧pring MVC的注解驅(qū)動(dòng)功能,讓Spring MVC自動(dòng)注冊(cè)默認(rèn)的處理器映射(DefaultAnnotationHandlerMapping
)和處理器適配器(AnnotationMethodHandlerAdapter
),以支持基于注解的控制器方法。
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
:定義一個(gè)視圖解析器(InternalResourceViewResolver
)的bean,用于將控制器返回的邏輯視圖名解析為實(shí)際的視圖資源(如JSP文件)。
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView">
:設(shè)置視圖解析器的viewClass
屬性,指定使用JstlView
類來(lái)處理JSTL標(biāo)簽。
<property name="prefix" value="/WEB-INF/jsp/"/>
:設(shè)置視圖解析器的prefix
屬性,指定視圖資源(如JSP文件)的前綴路徑。
<property name="suffix" value=".jsp"/>
:設(shè)置視圖解析器的suffix
屬性,指定視圖資源(如JSP文件)的后綴。
<!--4) 單獨(dú)處理圖片、樣式、js等資源 -->
:這是一個(gè)注釋,說(shuō)明接下來(lái)的配置是用于處理靜態(tài)資源。
<!-- <mvc:resources location="/css/" mapping="/css/**"/>
:這是一個(gè)注釋掉的配置,如果啟用,它會(huì)將請(qǐng)求路徑以/css/
開頭的請(qǐng)求映射到/css/
目錄下的靜態(tài)資源(如CSS文件)。
<!-- <mvc:resources location="/js/" mapping="/js/**"/>
:這是一個(gè)注釋掉的配置,如果啟用,它會(huì)將請(qǐng)求路徑以/js/
開頭的請(qǐng)求映射到/js/
目錄下的靜態(tài)資源(如JavaScript文件)。
<!-- <mvc:resources location="WEB-INF/images/" mapping="/images/**"/>
:這是一個(gè)注釋掉的配置,如果啟用,它會(huì)將請(qǐng)求路徑以/images/
開頭的請(qǐng)求映射到WEB-INF/images/
目錄下的靜態(tài)資源(如圖片文件)。????????總之,這段代碼配置了一個(gè)基本的Spring MVC應(yīng)用程序,包括組件掃描、注解驅(qū)動(dòng)、視圖解析器和靜態(tài)資源處理。
? ? 配置web.xml?
配置步驟:
- 配置Spring與Web項(xiàng)目集成
- 配置中文亂碼過(guò)濾器
- 配置SpringMVC核心控制器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_3_1.xsd"
version="3.1">
<display-name>Archetype Created Web Application</display-name>
<!-- Spring和web項(xiàng)目集成start -->
<!-- spring上下文配置文件 -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-context.xml</param-value>
</context-param>
<!-- 讀取Spring上下文的監(jiān)聽器 -->
<listener>
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
</listener>
<!-- Spring和web項(xiàng)目集成end -->
<!-- 中文亂碼處理 -->
<filter>
<filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<async-supported>true</async-supported>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<!-- Spring MVC servlet -->
<servlet>
<servlet-name>SpringMVC</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<!--此參數(shù)可以不配置,默認(rèn)值為:/WEB-INF/springmvc-servlet.xml-->
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring-mvc.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
<!--web.xml 3.0的新特性,是否支持異步-->
<async-supported>true</async-supported>
</servlet>
<servlet-mapping>
<servlet-name>SpringMVC</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
</web-app>
? ? 編寫處理器類?
package com.ycxw.web;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author 云村小威
* @site blog.csdn.net/Justw320
* @create 2023-09-04 20:11
*/
@Controller
public class HelloController {
@RequestMapping(value="/hello")
public String hello(){
System.out.println("調(diào)用了hello方法...");
return null;
}
}
-
@Controller
:使用@Controller
注解標(biāo)記這個(gè)類是一個(gè)Spring MVC控制器。這個(gè)注解告訴Spring框架,這個(gè)類將處理HTTP請(qǐng)求。 -
@RequestMapping(value="/hello")
:使用@RequestMapping
注解映射一個(gè)HTTP請(qǐng)求路徑(在這里是/hello
)到控制器的一個(gè)方法(在這里是hello()
方法)。當(dāng)用戶訪問(wèn)/hello
路徑時(shí),hello()
方法將被調(diào)用。
? ? 編寫hello.jsp?
在spring-mvc.xml文件已配置ViewResolver視圖解析器
? ? 運(yùn)行測(cè)試?
?
? ? 靜態(tài)資源處理?
所有文件都會(huì)被spring-mvc.xml配置文件進(jìn)行攔截,所以要添加配置,讓處理器掃描掃該資源
<mvc:resources location="/static/" mapping="/static/**"/>
?如路徑:
運(yùn)行測(cè)試:?文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-696886.html
文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-696886.html
到了這里,關(guān)于【SpringMVC】工作流程及入門案例的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!