Springweb詳解

Springweb詳解

一.springweb介紹

1.1 SpringWEB 特點

? SpringWEB 是 spring 家族原生產品,與 IOC 容器等基礎設施無縫對接.

? 基于原生的 Servlet,提供了一個前端控制器 DispatcherServlet ,開發者 無須額外開發控制器對象.

? 可以自動綁定用戶輸入,并正確地轉換數據類型.

? 代碼清新簡潔,大幅度提升開發效率.

? 內部組件化程度高,可插拔式組件即插即用.

? 性能卓著,尤其適合現代大型、超大型互聯網項目要求.

1.2 springweb組件

前端控制器:DispatcherServlet(不需要程序員開發)由框架提供,在 web.xml 中配置。 作用:統一處理請求和響應,整個流程控制的中心,由它調用其它組件處理 用戶的請求.

處理器映射器:HandlerMapping(不需要程序員開發),由框架提供。 作用:根據請求的 url 查找 Handler(處理器/Controller)

處理器適配器:HandlerAdapter(不需要程序員開發),由框架提供。 作用:按照特定規則(HandlerAdapter 要求的規則)去執行 Handler。

處理器:Handler(也稱之為 Controller,需要工程師開發)。 注意:編寫 Handler 時按照 HandlerAdapter 的要求去做,這樣適配器才可 以去正確執行 Handler。 作用:接受用戶請求信息,調用業務方法處理請求,也稱之為后端控制器

二.springweb搭建

2.1 導包
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.2.2.RELEASE</version>
</dependency>
2.2 配置DispatcherServlet

在 web.xml 文件中配置 DispatcherServlet

配置 spring 核心請求分發器

<servlet>
<servlet-name>application</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>classpath:spring.xml</param-value>
</init-param>
<load-on-startup>0</load-on-startup>
</servlet>
<!-- 請求映射 -->
<servlet-mapping>
<servlet-name>application</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
2.3 開啟Springweb注解
<mvc:annotation-driven></mvc:annotation-driven>
2.4 處理器類搭建

@RestController 用于標記在一個類上,使用它標記的類就是一個 SpringWEB 控制器類。用@RequestMapping標記一個類或方法,spring會掃描包中用了@RM的類,方法然后加入到IOC容器中,注入依賴

//@RequestMapping 用來為類和方法定義訪問地址,類上面的地址不能重復
@RequestMapping(path = "/loginCtl")
public class LoginController {@RequestMapping(path = "/login")public String login(){......}
}

三. 接受請求

3.1 @RequestMapping

@RequestMapping 是一個用來為處理器地址映射的注解,可用于類或方法上. 作用在類上,在整個項目中不能重復,作用在方法上,整個類中不能重復. 常用屬性 path,value,method. path 和 value 用來定義地址 method 用來定義請求方式 @RequestMapping(value = “/hello”,method = RequestMethod.GET) @RequestMapping(path= “/hello”,method = RequestMethod.POST)

//  path和value都表示定義一個此類或方法的地址    
//  method=RequestMethod.POST   指定允許哪些請求方式訪問此方法@RequestMapping(path = "/login",method = RequestMethod.POST)public String login(Admin admin){......}

ok我們來總結一下:

springweb好處:對web層進行封裝,讓我們可以快速搭建自己的后端處理程序(LoginController):

@RestController	//表示此類由spring創建管理
@RequestMapping(path = "/loginCtl")	//為類定義一個映射地址
public class LoginController {@AutowiredLoginService loginService;	//方便的注入其他對象//為方法定義映射地址,設置該方法允許哪些請求方式訪問,可以方便接收請求中的參數@RequestMapping(path = "/login",method = RequestMethod.POST)public String login(Admin admin){Admin admin1=loginService.login(admin);System.out.println(admin1);//可以直接將返回的對象,自動轉為json字符串return "success";	}
}

四.springweb請求的運行流程(截至目前)

一次請求到后端,先進入DispatcherServlet,統一進行攔截,再調用其他程序進行處理,調用HandlerMapping(處理器映射器) 解析請求中處理器的地址和方法地址。判斷地址是否存在,不存在返回404,如果存在,判斷該地址有沒有攔截器。如果有攔截器,進入攔截器。

然后會回到DispatcherServlet,再調用HandlerAdapter(處理器適配器),最終由處理器適配器調用我們自己的處理器(LoginController),由我們自己的處理器進行接受請求,處理請求,響應。

五.獲取請求數據

5.1 spring自動封裝

spring會自定進行數據封裝,這里需要注意的是,處理器接收參數的形參名稱必須和表單的name屬性保持一致

    @RequestMapping(path = "/login",method = RequestMethod.POST)    public String login(Admin admin,String mark){......return "success";}
5.2 當請求參數名和形參名不一致
5.2.1 可以使用@RequestParam(“”)進行參數綁定
    @RequestMapping(path = "/login",method = RequestMethod.POST)    public String login(Admin admin,@RequestParam("m") String mark){......return "success";}
5.2.2 可以使用@RequestHeader(“”)接收請求頭中的數據
    @RequestMapping(path = "/login",method = RequestMethod.POST) //因為請求頭中的User-Agent傳回來發現java中沒有-命名的變量,所以需要用到這個public String login(Admin admin,@RequestHeader("User-Agent") String userAgent){......return "success";}
5.3 使用實體類對象接收

@RequestBody 可以接收前端提交的json格式數據,將json格式封裝到對象中

    @RequestMapping(path = "/login",method = RequestMethod.POST)    public String login(@RequestBody Admin admin){......return "success";}
5.4 日期類型轉換

屬性類型為Date類型需要指定轉換格式,在聲明屬性上方添加:

	 @DateTimeFormat(pattern = "yyyy-MM-dd")private Date birthday;

@DateTimeFormat():前端提交到后端的數據日期指定轉換格式

@JsonFormat():后端把對象轉為json時,指定的日期格式

六.中文亂碼處理

SpringWEB 中已經為我們提供了過濾器,只需要在 web.xml 中配置即可:

<filter>
<filter-name>characterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>characterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

七.跨域訪問處理:

添加依賴:

<dependency>
<groupId>com.thetransactioncompany</groupId>
<artifactId>cors-filter</artifactId>
<version>2.5</version>
</dependency>

web.xml中配置:

<filter>
<filter-name>CORS</filter-name>
<filter-class>com.thetransactioncompany.cors.CORSFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>CORS</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

八.返回JSON

我們在后端返回的對象springweb會自動幫我們返回成json格式,只需要導入json組件即可:

<!--jackson-->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.13.3</version>
</dependency>

九.攔截器

springweb中的攔截器類似于servlet中的過濾器,主要用于攔截用戶請求并作相應的處理

spring中的攔截器與過濾器有本質的區別,過濾器是servlet規范中定義并實現的,在進入到servlet之前截獲請求,而攔截器時spring中定義的攔截機制,是對進入到處理器的請求進行攔截

配置攔截器:

    <!--配置攔截器--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/>   <!--定義哪些地址可以進入到攔截器中--><mvc:exclude-mapping path="/loginCtl/login"/>  <!--定義哪些地址不進入攔截器--><mvc:exclude-mapping path="/loginCtl/login"/>  <!--可以配多個--><bean id="admin" class="com.ffyc.ssm.interceptor.AdminTokenInterceptor"></bean> <!--配置攔截器的實現類--></mvc:interceptor></mvc:interceptors>

定義一個攔截器:

當請求進入攔截器時判斷token,符合則true然后繼續執行處理器,不符合false則不往后執行可以在此給用戶做出相應

//定義一個攔截器
public class AdminTokenInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("進入到攔截器");//獲得tokenString token = request.getHeader("token");if (token.equals("123456")) {return true;    //攔截器中返回true,請求就會離開攔截器,繼續向后執行,到達處理器}else{response.setContentType("text/html;charset=utf-8");PrintWriter writer=response.getWriter();writer.write("token驗證失敗");return false;   //攔截器中返回false,不會繼續向后執行,可以在攔截器中向用戶做出響應}}
}

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

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

相關文章

【SQL】聚簇索引與?聚簇索引的區別

聚簇索引&#xff08;Clustered Index&#xff09;和非聚簇索引&#xff08;Non-Clustered Index&#xff09;是數據庫索引的兩種主要類型&#xff0c;它們在數據存儲和訪問方式上有顯著區別。 聚簇索引 數據存儲順序&#xff1a;聚簇索引將數據行按照索引鍵的順序進行存儲。…

VSCode打開其它IDE項目注釋顯示亂碼的解決方法

問題描述&#xff1a;VSCode打開Visual Studio&#xff08;或其它IDE&#xff09;工程&#xff0c;注釋亂碼&#xff0c;如下圖所示&#xff1a; 解決方法&#xff1a;點擊VSCode右下角的UTF-8&#xff0c;根據提示點擊“通過編碼重新打開”&#xff0c;再選擇GB2312&#xff0…

R語言數據分析案例42-基于時間序列模型對股票預測分析和研究

一、研究背景和意義 隨著全球經濟的不斷發展和數字化轉型的加速推進&#xff0c;科技公司在全球市場中扮演著日益重要的角色。其中&#xff0c;中國的阿里巴巴集團作為全球最大的電子商務公司之一&#xff0c;其業務范圍覆蓋電子商務、云計算、金融科技等多個領域。由于其在中…

AI革命:RAG技術引領未來智能

AI革命:RAG技術引領未來智能 在人工智能的浪潮中,一種名為RAG(Retrieval-Augmented Generation)的技術正在悄然改變我們的世界。這種技術通過整合外部知識庫,極大地增強了大型語言模型(LLM)的性能,為智能助手、聊天機器人等應用帶來了革命性的提升。 1 突破性的RAG技…

【問題記錄】Jenkins Pipeline讀取變量的各種方法

方法一 輸出docker image鏡像標簽給IMAGE_TAG def IMAGE_TAG sh(script: docker images | grep ${SERVER_NAME} | grep $NAME_SPACE | awk {print $2}|grep ${BUILD_NUMBER}, returnStdout: true) 另外&#xff0c;如果想輸出docker image命令執行結果給IMAGE_TAG def IMAG…

【python】PyQt5可視化開發,如何設計鼠標顯示的形狀?

?? 歡迎大家來到景天科技苑?? &#x1f388;&#x1f388; 養成好習慣&#xff0c;先贊后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者簡介&#xff1a;景天科技苑 &#x1f3c6;《頭銜》&#xff1a;大廠架構師&#xff0c;華為云開發者社區專家博主&#xff0c;…

通信施工安全員B類測試題含答案

1.全國人民代表大會常務委員會關于修改<中華人民共和國安全生產法>的決定》由中華人民共和國第十二屆全國人民代表大會常務委員會第十次會議通過&#xff0c;自( )起施行。 A、2002年11月1日 B、2014年8月31日C、2014年12月1日(正確答案) D、2015年1月01日 2.生產經營單…

JMeter:循環控制器While Controller的用法小結

前言 在之前的博文“JMeter案例優化&#xff1a;測試執行結束后&#xff0c;實現tearDown的幾種方式”中&#xff0c;嘗試了JMeter的循環控制器While Controller&#xff0c;發現還有點小復雜&#xff0c;將學習過程記錄下來&#xff0c;免得遺忘。 注&#xff1a;我使用的是…

《C++20設計模式》外觀模式

文章目錄 一、前言二、實現1、UML類圖2、實現 一、前言 一句話總結外觀模式&#xff1a;簡化接口&#xff0c;或者簡化流程。&#x1f642; 相關代碼可以在這里&#xff0c;如有幫助給個star&#xff01;AidenYuanDev/design_patterns_in_modern_Cpp_20 二、實現 原來需要很…

動手學深度學習(Pytorch版)代碼實踐 -循環神經網絡-54~55循環神經網絡的從零開始實現和簡潔實現

54循環神經網絡的從零開始實現 import math import torch from torch import nn from torch.nn import functional as F from d2l import torch as d2l import matplotlib.pyplot as plt import liliPytorch as lp# 讀取H.G.Wells的時光機器數據集 batch_size, num_steps 32, …

多特征線性回歸

目錄 一、多特征符號意義說明&#xff1a;二、多特征模型表示&#xff1a;三、Numpy向量表示、內積計算&#xff1a;1.向量表示&#xff1a;2.內積計算&#xff1a; 四、多元線性回歸梯度下降算法&#xff1a; 一、多特征符號意義說明&#xff1a; x下標j&#xff1a;表示第j個…

怎么做外貿推廣:10個詳細教程和工具

1. 介紹 1.1 什么是外貿推廣 外貿推廣指的是將產品或服務推廣到國際市場的過程。它的主要目的是吸引海外客戶&#xff0c;增加銷售額&#xff0c;并擴大企業的全球影響力。外貿推廣不僅僅是銷售產品&#xff0c;它還包括品牌建設、市場研究和客戶關系管理。 谷歌外貿推廣案例…

機器學習---線性回歸

1、線性回歸 例如&#xff1a;對于一個房子的價格&#xff0c;其影響因素有很多&#xff0c;例如房子的面積、房子的臥室數量、房子的衛生間數量等等都會影響房子的價格。這些影響因子不妨用 x i x_{i} xi?表示&#xff0c;那么房價 y y y可以用如下公式表示&#xff1a; y …

吳恩達機器學習 第三課 week3 強化學習(月球著陸器自動著陸)

目錄 01 學習目標 02 概念 2.1 強化學習 2.2 深度Q學習&#xff08;Deep Q-Learning &#xff09; 03 問題描述 04 算法中的概念及原理 05 月球著陸器自動著陸的算法實現 06 拓展&#xff1a;基于pytorch實現月球著陸器著陸 07 總結 寫在最前&#xff1a;關于強化學習…

python conda查看源,修改源

查看源 conda config --show-sources 修改源 可以直接vim .condarc修改源&#xff0c;

Shell學習——Shell變量

文章目錄 Shell變量使用變量只讀變量刪除變量變量類型字符串變量&#xff1a; 在 Shell中&#xff0c;變量通常被視為字符串。整數變量&#xff1a; 在一些Shell中&#xff0c;你可以使用 declare 或 typeset 命令來聲明整數變量。數組變量&#xff1a; Shell 也支持數組&#…

平價貓糧新選擇!福派斯鮮肉貓糧,讓貓咪享受美味大餐!

福派斯鮮肉貓糧&#xff0c;作為一款備受鏟屎官們青睞的貓糧品牌&#xff0c;憑借其卓越的品質和高性價比&#xff0c;為眾多貓主帶來了健康與美味的雙重享受。接下來&#xff0c;我們將從多個維度對這款貓糧進行解析&#xff0c;讓各位鏟屎官更加全面地了解它的魅力所在。 1?…

【三】ubuntu24虛擬機集群配置免密登陸

文章目錄 環境背景1. 配置域名映射2. 配置免密登錄2.1 在每臺機器上生成SSH密鑰對&#xff1a;2.2 將公鑰分發到其他機器&#xff1a;2.2.1 報錯問題2.2.2 修復方法 3. 驗證免密登錄在 ubuntu1 上&#xff1a;在 ubuntu2 上&#xff1a;在 ubuntu3 上&#xff1a; 測試連接 環境…

三級_02_網絡系統結構與設計的基本原則

1.下列關于接入技術特征的描述中&#xff0c;錯誤的是()。 無線統一網絡中AC如果發現某個AP出現故障&#xff0c;將自動調高周圍AP的發射功率以覆蓋出現的空洞 ADSL技術具有非對稱帶寬特性 APON是一種無線接入技術 Cable Modem利用頻分復用的方法將信道分為上行信道和下行信…

Linux系統的服務——以Centos7為例

一、Linux系統的服務簡介 服務是向外部提供對應功能的進程&#xff0c;其運行在系統后臺&#xff0c;能夠7*24小時持續不斷的提供外界隨時發來的服務請求&#xff0c;且服務進程常駐在內存中&#xff0c;具有固定的端口號&#xff0c;通過端口號就能找到服務內容。 提供服務的一…