【SpringMVC】SpringMVC的概念、創建及相關配置

什么是SpringMVC

概述

中文翻譯版:Servlet 棧的 Web 應用

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的特點:

  1. 輕量級,簡單易學
  2. 高效 , 基于請求響應的MVC框架
  3. 與Spring兼容性好,無縫結合
  4. 約定優于配置
  5. 功能強大:RESTful、數據驗證、格式化、本地化、主題等
  6. 簡潔靈活

Spring的web框架圍繞DispatcherServlet [ 調度Servlet ] 設計。

DispatcherServlet的作用是將請求分發到不同的處理器。從Spring 2.5開始,使用Java 5或者以上版本的用戶可以采用基于注解形式進行開發,十分簡潔;

正因為SpringMVC好 , 簡單 , 便捷 , 易學 , 天生和Spring無縫集成(使用SpringIoCAop) , 使用約定優于配置 . 能夠進行簡單的junit測試 . 支持Restful風格 .異常處理 , 本地化 , 國際化 , 數據驗證 , 類型轉換 , 攔截器 等等……所以我們要學習 .

最重要的一點還是用的人多 , 使用的公司多 .

中心控制器

Spring的web框架圍繞DispatcherServlet設計。 DispatcherServlet的作用是將請求分發到不同的處理器。從Spring 2.5開始,使用Java 5或者以上版本的用戶可以采用基于注解的controller聲明方式

Spring MVC框架像許多其他MVC框架一樣, 以請求為驅動 , 圍繞一個中心Servlet分派請求及提供其他功能DispatcherServlet是一個實際的Servlet (它繼承自HttpServlet 基類)


SpringMVC的原理如下圖所示:

當發起請求時被前置的控制器攔截到請求,根據請求參數生成代理請求,找到請求對應的實際控制器,控制器處理請求,創建數據模型,訪問數據庫,將模型響應給中心控制器,控制器使用模型與視圖渲染視圖結果,將結果返回給中心控制器,再將結果返回給請求者。

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控制器。

  1. HandlerMapping為處理器映射。DispatcherServlet調用HandlerMapping,HandlerMapping根據請求url查找Handler。
  2. HandlerExecution表示具體的Handler,其主要作用是根據url查找控制器,如上url被查找控制器為:hello。
  3. HandlerExecution將解析后的信息傳遞給DispatcherServlet,如解析控制器映射等。
  4. HandlerAdapter表示處理器適配器,其按照特定的規則去執行Handler。
  5. Handler讓具體的Controller執行。
  6. Controller將具體的執行信息返回給HandlerAdapter,如ModelAndView。
  7. HandlerAdapter將視圖邏輯名或模型傳遞給DispatcherServlet。
  8. DispatcherServlet調用視圖解析器(ViewResolver)來解析HandlerAdapter傳遞的邏輯視圖名。
  9. 視圖解析器將解析的邏輯視圖名傳給DispatcherServlet。
  10. DispatcherServlet根據視圖解析器解析的視圖結果,調用具體的視圖。
  11. 最終視圖呈現給用戶。

創建一個SpringMVC項目:HelloSpring

配置版

  1. 新建一個Moudle , springmvc-02-hello , 添加web的支持!
  2. 確定導入了SpringMVC 的依賴!
  3. 配置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>
  1. 編寫SpringMVC 的 配置文件!名稱:springmvc-servlet.xml : [servletname]-servlet.xml

ps:名字隨便寫,符合格式就行,這里的名稱要求是按照官方來的;

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd"></beans>
  1. 添加 處理映射器
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"/>
  1. 添加 處理器適配器
<bean class="org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter"/>
  1. 添加 視圖解析器
<!--視圖解析器: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>
  1. 編寫我們要操作業務Controller ,要么實現Controller接口,要么增加注解;需要返回一個ModelAndView,裝數據,封視圖;
package com.demo.controller;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中。Modelmv.addObject("msg","HelloSpringMVC!");//封裝要跳轉的視圖,放在ModelAndView中mv.setViewName("hello"); //: /WEB-INF/jsp/hello.jspreturn mv;}}
  1. 將自己的類交給SpringIOC容器,注冊bean
<!--Handler-->
<bean id="/hello" class="com.demo.controller.HelloController"/>
  1. 寫要跳轉的jsp頁面,顯示ModelandView存放的數據,以及我們的正常頁面;
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>hello</title>
</head>
<body><h1>hello world</h1>
<h2>${msg}</h2></body>
</html>
  1. 配置Tomcat 啟動測試!

可能遇到的問題:訪問出現404,排查步驟:

  1. 查看控制臺輸出,看一下是不是缺少了什么jar包。
  2. 如果jar包存在,顯示無法輸出,就在IDEA的項目發布中,添加lib依賴!
  3. 重啟Tomcat 即可解決!

小結:看這個估計大部分同學都能理解其中的原理了,但是我們實際開發才不會這么寫,不然就瘋了,還學這個玩意干嘛!我們來看個注解版實現,這才是SpringMVC的精髓,到底有多么簡單,看這個圖就知道了。

有問題 參照 【JavaWeb】在復習MVC框架時,新建Servlet失敗,問題及解決方案 https://blog.csdn.net/qq_44896379/article/details/149666811

注解版

  1. 新建一個Moudle,springmvc-03-hello-annotation 。添加web支持!

建立包結構 com.demo.controller

  1. 由于Maven可能存在資源過濾的問題,我們將配置完善
<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>
  1. 在pom.xml文件引入相關的依賴:主要有Spring框架核心庫、Spring MVC、servlet , JSTL等。我們在父依賴中已經引入了!
<!-- 別忘了加上這個打包方式 -->
<packaging>war</packaging> 
  1. 配置web.xml

注意點:

  • 注意web.xml版本問題,要最新版!
  • servlet-class注冊DispatcherServlet
  • 關聯SpringMVC的配置文件param-value
  • 啟動級別load-on-startup為1
  • 映射路徑url-pattern/ 【不要用/*,會404】 :默認/ 是加載除jsp之外 所有文件
<?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>

/ 和 / 的區別:*
< url-pattern > / </ url-pattern > 不會匹配到 .jsp, 只針對我們編寫的請求;
即:.jsp 不會進入spring的 DispatcherServlet 類 。
< url-pattern > /** </ url-pattern > 會匹配 **.jsp,
會出現返回 jsp視圖 時再次進入spring的DispatcherServlet 類,導致找不到對應的controller所以報404錯。

  1. 添加Spring MVC配置文件
    • 讓IOC的注解生效
    • 靜態資源過濾 :HTML . JS . CSS . 圖片 , 視頻 ……
    • MVC的注解驅動
    • 配置視圖解析器

在resource目錄下添加springmvc-servlet.xml配置文件,配置的形式與Spring容器配置基本類似,為了支持基于注解的IOC,設置了自動掃描包的功能,具體配置信息如下:

<?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/beanshttp://www.springframework.org/schema/beans/spring-beans.xsdhttp://www.springframework.org/schema/contexthttps://www.springframework.org/schema/context/spring-context.xsdhttp://www.springframework.org/schema/mvchttps://www.springframework.org/schema/mvc/spring-mvc.xsd"><!-- 自動掃描包,讓指定包下的注解生效,由IOC容器統一管理 --><context:component-scan base-package="com.kuang.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>

在視圖解析器中我們把所有的視圖都存放在/WEB-INF/目錄下,這樣可以保證視圖安全,因為這個目錄下的文件,客戶端不能直接訪問。

  1. 創建Controller

編寫一個Java控制類: com.demo.controller.HelloController , 注意編碼規范

package com.kuang.controller;import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;@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.jspreturn "hello";}
}
- [@Controller](https://github.com/Controller)是為了讓Spring IOC容器初始化時自動掃描到;
- [@RequestMapping](https://github.com/RequestMapping)是為了映射請求路徑,這里因為類與方法上都有映射所以訪問時應該是`/HelloController/hello`;
- 方法中聲明Model類型的參數是為了把Action中的數據帶到視圖中;
- 方法返回的結果是視圖的名稱hello,加上配置文件中的前后綴變成WEB-INF/jsp/**hello**.jsp。
  1. 創建視圖層

在WEB-INF/ jsp目錄中創建hello.jsp , 視圖可以直接取出并展示從Controller帶回的信息;

可以通過EL表達式取出Model中存放的值,或者對象;

<%@ page contentType="text/html;charset=UTF-8" language="java" %><html><head><title>SpringMVC</title></head><body>${msg}</body></html>
  1. 配置Tomcat運行

配置Tomcat , 開啟服務器 , 訪問 對應的請求路徑!

OK,運行成功!

小結

實現步驟其實非常的簡單:

  1. 新建一個web項目
  2. 導入相關jar
  3. 編寫web.xml , 注冊DispatcherServlet
  4. 編寫springmvc配置文件
  5. 接下來就是去創建對應的控制類 , controller
  6. 最后完善前端視圖和controller之間的對應
  7. 測試運行調試.

使用springMVC必須配置的三大件:

處理器映射器、處理器適配器、視圖解析器

通常,我們只需要手動配置視圖解析器org.springframework.web.servlet.view.InternalResourceViewResolver,而處理器映射器處理器適配器只需要開啟注解驅動即可,而省去了大段的xml配置

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/91197.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/91197.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/91197.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

淺談存儲過程

問題引入 面試的時候有時候會問到知不知道存儲過程&#xff0c;用沒用過&#xff1f; 是什么 存儲過程&#xff08;Stored Procedure&#xff09;是在大型數據庫系統中&#xff0c;一組為了完成特定功能的SQL 語句集&#xff0c;它存儲在數據庫中&#xff0c;一次編譯后永久…

maven optional 功能詳解

前言 最近參與了一個項目,使用maven管理依賴.項目拆分了很多模塊.然后交個多個團隊各自開發.最后在一個項目骨架中,把各自的模塊引入進來,一起啟動. 后來隨著項目的深入.引入的jar包變多.發現 jar包太多,編譯太慢, 打包之后的war包非常大.這種情況就可以使用optional來優化什么…

Python基礎--Day04--流程控制語句

流程控制語句是計算機編程中用于控制程序執行流程的語句。它們允許根據條件來控制代碼的執行順序和邏輯&#xff0c;從而使程序能夠根據不同的情況做出不同的決策。流程控制實現了更復雜和靈活的編程邏輯。 順序語句 順序語句是按照編寫的順序依次執行程序中的代碼。代碼會按照…

【同濟大學】雙速率自動駕駛架構LeAD:端到端+LLM,CARLA實測93%路線完成率,性能SOTA!

近年來&#xff0c;隨著端到端的技術快速發展將自動駕駛帶到了一個新高度&#xff0c;并且取得了非常亮眼的成績。由于感知限制和極端長尾場景下訓練數據覆蓋不足&#xff0c;模型在高密度復雜交通場景下和不規則交通情況下的處理能力不足&#xff0c;導致在開放道路上大規模部…

github與git新手教程(快速訪問github)

0 序言 作為一個開發者&#xff0c;你必須知道github和git是什么&#xff0c;怎么使用。 github是一個存儲代碼等資源的遠程倉庫&#xff0c;一個大型項目往往需要很多人共同協作開發&#xff0c;而大家如何協同開發的進度與分工等要求需要有一個統一開放保存代碼的平臺。git…

Windows環境下安裝Python和PyCharm

可以只安裝PyCharm嗎&#xff1f;不可以&#xff01;&#xff01;&#xff01; 開發Python應用程序需要同時安裝Python和PyCharm。Python是一種編程語言&#xff0c;PyCharm是一個專門為Python開發設計的集成開發環境&#xff0c;提供豐富的功能以簡化編碼過程。 一、前期準備…

Qt 嵌入式系統資源管理

在嵌入式系統中&#xff0c;資源&#xff08;CPU、內存、存儲、網絡等&#xff09;通常非常有限&#xff0c;因此高效的資源管理對 Qt 應用的穩定性和性能至關重要。本文從內存優化、CPU 調度、存儲管理到電源控制&#xff0c;全面解析 Qt 嵌入式系統資源管理的關鍵技術。 一、…

小杰數據結構(one day)——心若安,便是晴天;心若亂,便是陰天。

1.數據結構計算機存儲、組織數據的方式&#xff1b;有特定關系的數據元素集合&#xff1b;研究數據的邏輯結構、物理結構&#xff08;真實存在&#xff09;和對應的算法&#xff1b;新結構仍保持原結構類型&#xff1b;選擇更高的運行或存儲效率的數據結構。邏輯結構——面向問…

力扣面試150(44/150)

7.30 155. 最小棧 設計一個支持 push &#xff0c;pop &#xff0c;top 操作&#xff0c;并能在常數時間內檢索到最小元素的棧。 實現 MinStack 類: MinStack() 初始化堆棧對象。void push(int val) 將元素val推入堆棧。void pop() 刪除堆棧頂部的元素。int top() 獲取堆棧頂…

Linux實戰:從零搭建基于LNMP+NFS+DNS的WordPress博客系統

前言 在數字化時代&#xff0c;擁有一個個人博客是技術愛好者展示成果、分享經驗的重要方式。本文將帶您從零開始&#xff0c;在Linux環境下通過兩臺服務器協作&#xff0c;搭建一個功能完整的WordPress博客系統。我們將整合LNMP架構、NFS文件共享和DNS域名解析服務&#xff0c…

Apache Ignite 的對等類加載(Peer Class Loading, P2P Class Loading)機制

這段內容是關于 Apache Ignite 的“對等類加載”&#xff08;Peer Class Loading, P2P Class Loading&#xff09;機制的詳細說明。這是 Ignite 為了簡化開發而設計的一個非常強大的功能&#xff0c;但同時也存在一些安全和性能上的考量。 下面我將用通俗易懂的語言 結構化解…

預過濾環境光貼圖制作教程:第四階段 - Lambert 無權重預過濾(Stage 3)

在完成高光反射的 GGX 預過濾后,我們還需要處理環境光的漫反射部分。本階段(Stage 3)將基于 Lambert 分布對環境貼圖進行無權重預過濾,生成用于漫反射計算的環境數據。與高光反射的方向性不同,漫反射是光線在粗糙表面的均勻散射,因此需要用更適合均勻分布的 Lambert 模型…

Spring與SpringBoot:從手動擋到自動擋的Java開發進化論

大家好&#xff01;我是程序員良辰&#xff0c;今天我們來聊聊Java開發界的兩位"重量級選手"&#xff1a;Spring 和 SpringBoot。它們之間的關系就像手動擋汽車和自動擋汽車——一個給你完全的控制權但操作復雜&#xff0c;一個讓你輕松上路但保留了切換手動模式的能…

1.4.Vue 的模板事件

Vue 的模板事件1. 最常見和推薦的做法。將復雜的邏輯封裝在 methods 中。<!-- ? 正確&#xff1a;調用 methods 中的方法 --> <button click"handleClick">點擊我</button>new Vue({methods: {handleClick(event) {// 這里可以寫任意語句if (this…

SQLite 子查詢詳解

SQLite 子查詢詳解 引言 SQLite 是一種輕量級的數據庫&#xff0c;以其簡單、易用和跨平臺而著稱。在數據庫查詢中&#xff0c;子查詢是一個非常重要的概念&#xff0c;它允許我們在查詢中使用查詢結果。本文將詳細講解 SQLite 中的子查詢&#xff0c;包括其定義、用法以及在實…

可以組成網絡的服務器 - 華為OD統一考試(JavaScript 題解)

題目描述 在一個機房中,服務器的位置標識在n*m的整數矩陣網格中,1表示單元格上有服務器,0表示沒有。如果兩臺服務器位于同一行或者同一列中緊鄰的位置,則認為它們之間可以組成一個局域網,請你統計機房中最大的局域網包含的服務器個數。 輸入描述 第一行輸入兩個正整數,…

redis,MongoDB等未授權訪問靶場復現

redis未授權訪問在docker中啟動vulhub對應的靶場目錄&#xff1a;cd /vulhub-master/redis/4-unacc在kali上安裝redis程序進行服務連接安裝redis apt-get install redis redis鏈接 redis-cli -h IP -p 端口輸入info可以查看信息接下來我們使用redis-rogue-server來獲取命令執行…

設計模式:代理模式 Proxy

目錄問題解決方案結構代碼代理是一種結構型設計模式&#xff0c;讓你能夠提供對象的替代品或其占位符。代理控制著對于原對象的訪問&#xff0c;并允許在將請求提交給對象前后進行一些處理。 問題 為什么要控制對于某個對象的訪問呢&#xff1f; 舉個例子&#xff1a; 有這樣一…

Linux零基礎Shell教學全集(可用于日常查詢語句,目錄清晰,內容詳細)(自學尚硅谷B站shell課程后的萬字學習筆記,附課程鏈接)

此文章為學習了 尚硅谷B站課程 后的學習筆記 【尚硅谷】Shell腳本從入門到實戰_嗶哩嗶哩_bilibilihttps://www.bilibili.com/video/BV1hW41167NW/?spm_id_from333.337.search-card.all.click&vd_source68e0bbe20c8b1102b59ced40f67db628注意&#xff1a;需要先學Linux基礎…

GitLab 中的分支和標簽的定義及操作

&#xff08;一&#xff09;GitLab 中的分支和標簽的定義及操作 1. 分支&#xff08;Branch&#xff09; 定義&#xff1a; 分支是代碼倉庫中的獨立開發路徑&#xff0c;允許你在不影響主線&#xff08;通常是 main 或 master 分支&#xff09;的情況下&#xff0c;進行實驗、開…