SpringMVC的基本使用

SpringMVC簡介

SpringMVC是Spring提供的一套建立在Servlet基礎上,基于MVC模式的web解決方案

SpringMVC核心組件

  • DispatcherServlet:前置控制器,來自客戶端的所有請求都經由DispatcherServlet進行處理和分發
  • Handler:處理器,包括了攔截器和控制器中的方法,主要負責處理請求
  • HandlerMapping:映射器,解析文件和掃面注解,內部緩存了handler和handler的訪問路徑,被DispatcherServlet調用,用于查找路徑對應的handler
  • HandlerAdapter:適配器,處理請求參數和處理響應數據,DispatcherServlet就是通過HandlerAdapter間接調用handler
  • ViewResolver:視圖解析器,返回的視圖是邏輯視圖,需要進行解析、渲染之后才是給用戶看的頁面

img

SpringMVC的工作流程

前端發送的請求由DispatcherServlet接收到,然后DispatcherServlet調用HnadlerMapping映射器,通過URL去匹配對應的handler,因為無法確定處理的類型,所以調用HandlerAdapter適配器去適配handler,適配之后就會調用這個handler處理器(實際就是攔截器和控制器下的方法),如果返回的類型是ModelAndView,就會將這個ModelAndView返回給ViewResolver視圖解析器進行解析,得到視圖的位置,然后對這個視圖進行渲染,最后將渲染好的視圖交給DispatcherServlet返回給前端展示;如果在控制器(比如說類或者某個方法上)中加上了@ResponseBody這個注解,就代表handler的返回值是直接返回給前端的,不會經過視圖解析器

SpringMVC的使用

第一步:引入依賴

<properties><lombok-vesion>1.18.24</lombok-vesion><fastjson-version>2.0.42</fastjson-version><spring-context-version>5.3.8</spring-context-version><spring-context-supprt-version>5.3.8</spring-context-supprt-version><spring-aop-version>5.3.23</spring-aop-version><project.compile.source>1.8</project.compile.source><project.compile.target>1.8</project.compile.target><project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties><dependencies><dependency><groupId>org.springframework</groupId><artifactId>spring-context</artifactId><version>${spring-context-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-context-support</artifactId><version>${spring-context-supprt-version}</version></dependency><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>${lombok-vesion}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-aop</artifactId><version>${spring-aop-version}</version></dependency><dependency><groupId>org.aspectj</groupId><artifactId>aspectjweaver</artifactId><version>${aspectJ-version}</version></dependency><dependency><groupId>org.springframework</groupId><artifactId>spring-webmvc</artifactId><version>${spring-context-version}</version></dependency><dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>${fastjson-version}</version></dependency>
</dependencies>

第二步:創建spring.xml

在resources文件夾下創建spring.xml文件

錯誤一:命名空間的標簽不匹配,比如xmlns:mvc="http://www.springframework.org/schema/c",mvc應該對應的是../schema/mvc

錯誤二:沒有添加對應的xsi:schemaLocation,比如引入了xmlns:mvc="http://www.springframework.org/schema/mvc",但是沒有在最后添加http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd

<?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/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd"><!--視圖解析器:在控制器返回視圖的時候生效--><bean class="org.springframework.web.servlet.view.InternalResourceViewResolver"><!--視圖資源的前綴--><property name="prefix" value="/"/><!--視圖資源的后綴--><property name="suffix" value=".jsp"/></bean><!-- 映射器 --><!-- <bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"/> --><!-- 適配器 --><!-- <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"/> --><!-- 較新的版本支持注解驅動,效果等同于上面兩句 --><mvc:annotation-driven><mvc:message-converters><ref bean="stringHttpMessageConverter"/><ref bean="jsonConverter"/></mvc:message-converters></mvc:annotation-driven><!-- 添加需要掃描的包 --><context:component-scan base-package="cn.cnmd.controller, cn.cnmd.exception"/><!-- 編碼轉換器 --><!-- 字符串數據轉換器 --><bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/><!-- JSON格式數據轉換器 --><bean id="jsonConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property></bean></beans>

第三步:編寫controller類

報錯:415-不支持的媒體類型

解決方案:在spring.xml中配置編碼轉化器

<!--在注解驅動中添加編碼轉換器-->
<mvc:annotation-driven><mvc:message-converters><ref bean="stringHttpMessageConverter"/><ref bean="jsonConverter"/></mvc:message-converters>
</mvc:annotation-driven><!-- 字符串數據轉換器 -->
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/><!-- JSON格式數據轉換器 -->
<bean id="jsonConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property>
</bean>

UserController類

@RestController//@RestController = @Controller + @ResponseBody
@RequestMapping("/user")
public class UserController {/*** 獲取一個學生的信息** @param id 學生編號* @return 學生對象*/@GetMappingpublic Student getStudent(@RequestParam("id") int id) {// System.out.println(1/0); => 遇到異常會被帶有@RestControllerAdvice注解的ExceptionController處理return new Student();}/*** 添加一個學生** @param student 學生對象的JSON數據* @return 狀態碼*/@PostMappingpublic int addStudent(@RequestBody Student student) {System.out.println("student = " + student);return 0;}/*** 更新一個學生的信息** @param student 更新后的學生信息* @return 狀態碼*/@PutMappingpublic int updateStudent(@RequestBody Student student) {System.out.println("student = " + student);return 0;}/*** 通過學生id刪除一個學生** @param id 學生編號* @return 狀態碼*/@DeleteMapping("/{id}")public int deleteStudent(@PathVariable("id") int id) {System.out.println("id = " + id);return 0;}/*** 批量查詢學生** @param currentPage 當前頁數* @param pageSize    當頁數據條數* @return 學生集合*/@GetMapping("/stuList")public List<Student> getAllStudent(@RequestParam("currentPage") int currentPage,@RequestParam("pageSize") int pageSize) {System.out.println("currentPage = " + currentPage + ", pageSize = " + pageSize);return new ArrayList<>();}/*** 獲取請求頭中的數據** @param ua 請求頭中的User-Agent*/@GetMapping("/header")public void getHeader(@RequestHeader("User-Agent") String ua) {System.out.println("ua = " + ua);}/*** 獲取cookie中的數據** @param status cookie中的key:status*/@GetMapping("/cookie")public void getCookie(@CookieValue("status") String status) {System.out.println("status = " + status);}}

全局異常處理

@RestControllerAdvice
public class ExceptionController {/*** 處理全局異常的方法** @param e 異常對象* @return 異常信息*/@ExceptionHandler(Exception.class)public String exceptionHandler(Exception e) {return e.getMessage();}
}

常用的注解

實例都在上方

//用于標記是否是一個控制器
@Controller//匹配請求中的URL地址來調用對應的handler
@RequestMapping//用于匹配URL地址中的parameter參數
@RequestParam//用于匹配URL路徑上的參數
@PathVariable//用于匹配前端發送給后端的JSON數據
@RequestBody//用于匹配請求頭中的數據
@RequestHeader//用于匹配Cookie中的數據
@CookieValue//用于標記一個方法的返回值是否直接返回給前端
@ResponseBody//RESTFul風格下的注解,等同于@Controller + @ResponseBody
@RestController//RESTFul風格下的用于匹配不同請求方式
@GetMapping/@PostMapping/@PutMapping/@DeleteMapping//該注解只能應用在類上,表示這個類就是處理異常的控制器    
@ControllerAdvice//RESTFul風格下的用于表示這個類就是處理異常的控制器,并且返回值直接返回給前端,等同于@ControllerAdvice + @ResponseBody 
@RestControllerAdvice//該注解只能應用在@ControllerAdvice或者說@RestControllerAdvice標識的類的方法上,用來處理異常
@ExceptionHandler

靜態資源訪問解決

為什么靜態資源無法訪問?

因為在Tomcat的自帶的web.xml中有這樣一個配置

<!--.......-->
<servlet><servlet-name>default</servlet-name><servlet-class>org.apache.catalina.servlets.DefaultServlet</servlet-class><init-param><param-name>debug</param-name><param-value>0</param-value></init-param><init-param><param-name>listings</param-name><param-value>false</param-value></init-param><load-on-startup>1</load-on-startup>
</servlet>
<!--.......-->
<!-- The mapping for the default servlet -->
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>/</url-pattern>
</servlet-mapping>

說明在創建webapp項目時,我們在web.xml中配置的DispathcerServlet的映射覆蓋了DefaultServlet的映射,所以就不會再使用默認的DefaultServlet,造成了靜態資源無法訪問

解決方案

方案一:修改@XxxMapping中的url,比如加上后綴.do.action

方案二【推薦】:在web.xml中配置靜態資源的訪問地址,比如將js、css、圖片等靜態資源放在static文件夾下

<!-- web.xml -->
<servlet-mapping><servlet-name>default</servlet-name><url-pattern>/static/*</url-pattern>
</servlet-mapping>

方案三:在spring.xml文件中配置 default-servlet-handler

<!-- 
這個handler就是處理靜態資源的,它的處理方式就是將請求轉會到tomcat中名為default的Servlet 
-->
<mvc:default-servlet-handler/>
<!-- mapping是訪問路徑,location是靜態資源存放的路徑 -->
<mvc:resources mapping="/static/**" location="/static/" />

中文亂碼問題

解決方案:編碼轉換器

<!-- 編碼轉換器 -->
<!-- 字符串數據轉換器 -->
<bean id="stringHttpMessageConverter" class="org.springframework.http.converter.StringHttpMessageConverter"/><!-- JSON格式數據轉換器 -->
<bean id="jsonConverter" class="com.alibaba.fastjson.support.spring.FastJsonHttpMessageConverter"><property name="supportedMediaTypes"><list><value>text/html;charset=UTF-8</value><value>application/json;charset=UTF-8</value></list></property>
</bean>
<!--在注解驅動中添加編碼轉化器-->
<mvc:annotation-driven><mvc:message-converters><ref bean="stringHttpMessageConverter"/><ref bean="jsonConverter"/></mvc:message-converters>
</mvc:annotation-driven>

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

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

相關文章

三個方法教大家學會RAR文件轉換為ZIP格式

在日常工作當中&#xff0c;RAR和ZIP是兩種常見的壓縮文件格式。有時候&#xff0c;大家可能會遇到將RAR文件轉換為ZIP格式的情況&#xff0c;這通常是為了方便在特定情況下打開或使用文件。下面給大家分享幾個RAR文件轉換為ZIP格式的方法&#xff0c;下面隨小編一起來看看吧~ …

在mfc程序中,如何用c++找到exe文件所在的路徑

在 MFC&#xff08;Microsoft Foundation Class&#xff09;程序中&#xff0c;你可以使用 GetModuleFileName 函數來獲取當前運行的可執行文件&#xff08;.exe&#xff09;的路徑。 以下是一個示例代碼&#xff1a; #include <afxwin.h> #include <iostream>in…

KVM性能優化之CPU優化

1、查看kvm虛擬機vCPU的QEMU線程 ps -eLo ruser,pid,ppid,lwp,psr,args |awk /^qemu/{print $1,$2,$3,$4,$5,$6,$8} 注:vcpu是不同的線程&#xff0c;而不同的線程是跑在不同的cpu上&#xff0c;一般情況&#xff0c;虛擬機在運行時自身會點用3個cpus&#xff0c;為保證生產環…

通過MATLAB控制TI毫米波雷達的工作狀態

前言 前一章博主介紹了MATLAB上位機軟件“設計視圖”的制作流程,這一章節博主將介紹如何基于這些組件結合MATLAB代碼來發送CFG指令控制毫米波雷達的工作狀態 串口配置 首先,在我們選擇的端口號輸入框和端口波特率設置框內是可以手動填入數值(字符)的,也可以在點擊運行后…

匯凱金業:投資交易如何才能不虧損

投資交易中永不虧損是一個理想化的目標&#xff0c;現實中無法完全避免虧損。然而&#xff0c;通過科學的方法、合理的策略和嚴格的風險管理&#xff0c;投資者可以大幅減少虧損&#xff0c;并提高長期盈利的概率。以下是一些關鍵策略和方法&#xff0c;幫助投資者在交易中盡量…

【CSRF】

CSRF 原理&#xff1a;誘導用戶在訪問第三方site時&#xff0c;訪問攻擊者構造的site,攻擊者site會對原site進行惡意操作。 burp模擬攻擊&#xff1a; 對一個博客系統點擊發布文章時&#xff0c;Burp Suite抓包&#xff0c;右鍵CSRF PoC功能 -> Engagament tools -> Gen…

洛谷 P3954 [NOIP2017 普及組] 成績

本文由Jzwalliser原創&#xff0c;發布在CSDN平臺上&#xff0c;遵循CC 4.0 BY-SA協議。 因此&#xff0c;若需轉載/引用本文&#xff0c;請注明作者并附原文鏈接&#xff0c;且禁止刪除/修改本段文字。 違者必究&#xff0c;謝謝配合。 個人主頁&#xff1a;blog.csdn.net/jzw…

太陽能輻射系統加速材料老化的關鍵設備光照老化實驗箱

光照老化實驗箱概述 光照老化實驗箱是一種模擬太陽光照射對材料影響的實驗設備&#xff0c;主要用于加速材料的自然老化過程&#xff0c;以此來評估材料在實際使用環境中的耐久性和穩定性。該設備廣泛應用于汽車、航空、建筑、塑料制品等行業&#xff0c;尤其在汽車領域&#…

多商戶b2b2c商城系統怎么運營

B2B2C多用戶商城系統支持多種運營模式&#xff0c;以滿足不同類型和發展階段的企業需求。以下是五大主要的運營模式&#xff1a; **1. 自營模式&#xff1a;**平臺企業通過建立自營線上商城&#xff0c;整合自身多渠道業務。通過會員、商品、訂單、財務和倉儲等多用戶商城管理系…

OK527N-C開發板-簡單的性能測試

OK527N-C CoreMark 獲取CoreMark源碼 首先使用Git克隆倉庫&#xff1a; git clone https://github.com/eembc/coremark.git cd coremark修改Makefile 首先復制文件夾 cp -rf posix ok527之后修改ok527文件夾下的core_portme.mak文件&#xff0c;將CC修改如下 CC aarch6…

CPU占用率飆升至100%:是攻擊還是正常現象?

在運維和開發的日常工作中&#xff0c;CPU占用率突然飆升至100%往往是一個令人緊張的信號。這可能意味著服務器正在遭受攻擊&#xff0c;但也可能是由于某些正常的、但資源密集型的任務或進程造成的。本文將探討如何識別和應對服務器的異常CPU占用情況&#xff0c;并通過Python…

魔行觀察-探魚·鮮青椒爽麻烤魚-開關店監測-時間段:2013年1月 至 2024年6月

今日監測對象&#xff1a;探魚鮮青椒爽麻烤魚&#xff0c;監測時間段&#xff1a;2011年1月 至 2024年6月 本文用到數據源免費獲取地址 魔行觀察http://www.wmomo.com/ 品牌介紹&#xff1a; 探魚建立了產、供、銷一體全鏈條式供應鏈體系&#xff0c;并在低緯珠江口特設潮汐…

大公司圖紙管理的未來趨勢

隨著科技的不斷發展&#xff0c;大公司圖紙管理正朝著更加智能化、自動化和協同化的方向發展。以下是大公司圖紙管理的未來趨勢預測。 1. 智能化管理 利用人工智能和機器學習技術&#xff0c;實現圖紙的自動分類、標注和檢索。通過智能分析算法&#xff0c;預測圖紙的使用趨勢…

NSSCTF-Web題目19(數據庫注入、文件上傳、php非法傳參)

目錄 [LitCTF 2023]這是什么&#xff1f;SQL &#xff01;注一下 &#xff01; 1、題目 2、知識點 3、思路 [SWPUCTF 2023 秋季新生賽]Pingpingping 4、題目 5、知識點 6、思路 [LitCTF 2023]這是什么&#xff1f;SQL &#xff01;注一下 &#xff01; 1、題目 2、知識…

基于Vue的MOBA類游戲攻略分享平臺

你好呀&#xff0c;我是計算機學姐碼農小野&#xff01;如果有相關需求&#xff0c;可以私信聯系我。 開發語言&#xff1a;Java 數據庫&#xff1a;MySQL 技術&#xff1a;Java技術、SpringBoot框架、B/S模式、Vue.js 工具&#xff1a;MyEclipse、MySQL 系統展示 首頁 用…

在 Windows 上,使用 icacls 命令讓apache 用戶有權訪問

調試免費云服務器&#xff0c;三豐云&#xff0c;用戶權限過程。 在 Windows 上&#xff0c;icacls 命令是一個非常強大的工具&#xff0c;用于修改文件和目錄的權限。然而&#xff0c;需要注意的是&#xff0c;Windows 默認的 Web 服務器&#xff08;如 IIS&#xff09;通常運…

lstrip()方法——截掉字符串左邊的空格或指定的字符

自學python如何成為大佬(目錄):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm1001.2014.3001.5501 語法參考 lstrip()方法用于截掉字符串左邊的空格或指定的字符。lstrip()方法的語法格式如下&#xff1a; str.lstrip([chars]) 參數說明&#xff…

【算法】Merge Sort 合并排序

Merge Sort概述 分而治之算法 遞歸地將問題分解為多個子問題&#xff0c;直到它們變得簡單易解 將解決方案組合起來&#xff0c;解決原有問題 O&#xff08;n*log&#xff08;n&#xff09;&#xff09;運行時間 基于比較的算法的最佳運行時間 一般原則 合并排序: 1. 將數…

elasticsearch鏡像化安裝部署

1、鏡像安裝 docker network create --driver bridge --subnet192.128.0.0/10 --gateway192.128.1.1 mynetwork docker run -d --netmynetwork --ip192.128.10.1 -p 1000:22 --name redhat-es01 -it c70d72aaebb4 /bin/bash #拉取鏡像 docker pull elasticsearch:7.7.0 #啟動…

【瞎折騰日常】服務器的cpu飆高到1000%了怎么破

一、故障起因 起因是用戶反饋系統很卡,我登錄普羅米修斯一看,發現docker部署得集群下的一個java應用服務器cpu爆了,直接沖到了1000%以上了,接著就是各種接口超時報警等,趕緊打開對應的服務器查看進程情況,這會使用jstack和top命令定位哪個線程占用的cpu比較大,定位代碼問…