Spring MVC 是 Spring 提供的一個基于 MVC 設計模式的輕量級 Web 開發(fā)框架,本質(zhì)上相當于 Servlet。Spring MVC 使用 MVC 架構模式的思想,將 Web 應用進行職責解構,把一個復雜的 Web 應用劃分成模型(Model)、控制器(Contorller)以及視圖(View)三層,有效地簡化了 Web 應用的開發(fā),降低了出錯風險,同時也方便了開發(fā)人員之間的分工配合。
? 導入依賴:
org.springframework spring-webmvc5.3.22
二、工作流程? Spring MVC工作流程如下:
Spring MVC 的常用組件共有 6 個,它們分別是: DispatcherServlet(前端控制器)、HandlerMapping(處理器映射器)、HandlerAdapter(處理器適配器)、Handler(處理器)、ViewResolver(視圖解析器)和 View(視圖)。下表對各個組件的功能說明如下:
組件 | 提供者 | 說明 |
---|---|---|
DispatcherServlet(前端控制器) | 由框架提供 | 它是 Spring MVC 的核心,其本質(zhì)就是一個 Servlet。 它負責將所有的請求進行統(tǒng)一分發(fā),相當于一個 Spring MVC 的流程控制中心,控制整個流程的執(zhí)行,對各個組件進行統(tǒng)一調(diào)度,以降低組件之間的耦合性,有利于組件之間的拓展。 |
HandlerMapping(處理器映射器) | 由框架提供 | 負責根據(jù)請求的 url、method 等信息查找響應的 Handler 處理器(即 Controller 控制器方法)。 |
Handler(處理器) | 由開發(fā)人員提供 | 也就是我們常說的 Controller 控制器,負責在 DispatcherServlet 的控制下,對具體的用戶請求進行處理。 |
HandlerAdapter(處理器適配器) | 由框架提供 | 它負責根據(jù)?HandlerMapping 映射器找到的處理器(Handler)信息,按照特定規(guī)則執(zhí)行相關的處理器(Handler)方法。 |
ViewResolver(視圖解析器) | 由框架提供 | 通過 ModelAndView 對象中的 View 信息對邏輯視圖名進行解析,將其解析成真正的視圖 View(例如 ThymeleafView、InternalResourceView、RedirectView 等),并返回給 DispatcherServlet。 |
View(視圖) | View 對象本身由框架提供,但視圖所對應的前端頁面(例如 JSP、HTML)則需要開發(fā)人員自行編寫 | 將 Model 模型數(shù)據(jù)通過頁面展示給用戶。 |
Spring MVC 本質(zhì)就是對 Servlet 的進一步封裝,其核心組件是一個 DispatcherServelt。DispatcherServelt 是 Spring MVC 中請求最先到達的地方,負責請求在其他各個組件間的傳遞和加工。在此之前,像 DispatcherServlet 這樣的 Servlet,都是通過 web.xml 文件來進行配置的。
Spring 提供了一個 DispatcherServelt 的快速配置類AbstractAnnotationConfigDispatcher-ServletInitializer,它就是 WebApplicationInitializer 的實現(xiàn)類之一 ,其常用方法如下表。
方法 | 說明 |
---|---|
protected abstract Class>[] getRootConfigClasses(); | 該方法用于設置 Spring 的配置類。 |
protected abstract Class>[] getServletConfigClasses(); | 該方法用于設置 Spring MVC 的配置類。 |
protected abstract String[] getServletMappings(); | 該方法用于指定 DispatcherServelt 的映射規(guī)則,即 web.xml 中的 url-pattern。 |
protected Filter[] getServletFilters()? | 該方法用于添加各種過濾器(filter)。 |
如果我們自定義的初始化類繼承了 AbstractAnnotationConfigDispatcherServletInitializer 并將其部署到 Servlet 容器中,Servelt 容器會自動加載這個初始化類,并使用它來完成對?DispatcherServlet 和 Spring MVC 的配置工作。
//繼承加載 springMVC前端控制器 和 web容器加載監(jiān)聽器
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer {
//加載spring配置
@Override
protected Class>[] getRootConfigClasses() {
return new Class []{SpringConfig.class};
}
//加載springMVC配置
@Override
protected Class>[] getServletConfigClasses() {
return new Class[]{SpringMVCConfig.class};
}
//為dispatcherServlet設置請求路徑
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
//添加請求和響應過濾器
@Override
protected Filter[] getServletFilters() {
return null;
}
}
四、SpringMVC配置類?我們可以通過一個實現(xiàn)了 WebMvcConfigurer 接口的配置類(標注 @Configuration 的類)對 Spring MVC 的部分組件進行配置,例如攔截器、格式化程序、視圖控制器等。
方法 | 說明 |
---|---|
default void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {} | 將靜態(tài)文件交給?Servlet 容器(Tomcat)內(nèi)置的默認 Servlet 處理。 |
default void addInterceptors(InterceptorRegistry registry) {} | 添加 Spring MVC 攔截器,對請求進行攔截處理。 |
default void addResourceHandlers(ResourceHandlerRegistry registry) {} | 添加或修改靜態(tài)資源(例如圖片,js,css 等)映射; Spring Boot 默認設置的靜態(tài)資源文件夾就是通過重寫該方法設置的。 |
default void addViewControllers(ViewControllerRegistry registry) {} | 主要用于實現(xiàn)無業(yè)務邏輯跳轉,例如主頁跳轉,簡單的請求重定向,錯誤頁跳轉等 |
default void configureMessageConverters(List | 用于配置默認的消息轉換器(轉換 HTTP 請求和響應)。 |
default void extendMessageConverters(List | 直接添加消息轉換器,會關閉默認的消息轉換器列表; 實現(xiàn)該方法即可在不關閉默認轉換器的起提下,新增一個自定義轉換器。 |
default void configureHandlerExceptionResolvers(List | 配置異常解析器。 |
//核心配置類
@Configuration
//SpringMVC注解掃描
@ComponentScan("com.lulu.controller")
//開啟注解驅(qū)動
//會自動向 Spring MVC 中注冊
// RequestMappingHandlerMapping RequestMappingHandlerAdapter 以及 ExceptionHandlerExceptionResolver 三個Bean
// 其中 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter 都是控制器方法對請求進行分發(fā)的必須組件,為讀寫 JSON 數(shù)據(jù)提供支持
// 而 ExceptionHandlerExceptionResolver 則是 Spring MVC 的異常處理組件
// 除此之外標簽還默認注冊了一個 FormattingConversionServiceFactoryBean類型的Bean
// ConversionService 通過它,可以滿足我們大多數(shù)的類型轉換需求
@EnableWebMvc
public class SpringMVCConfig implements WebMvcConfigurer {}
五、ControllerDispatcherServlet 會攔截用戶發(fā)送來的所有請求進行統(tǒng)一處理,但不同的請求有著不同的處理過程,例如登陸請求和注冊請求就分別對應著登陸過程和注冊過程,因此我們需要 Controller 來對不同的請求進行不同的處理。
@Controller//聲明為controller
@RequestMapping("")//在類和方法上設置請求映射
獲取請求參數(shù):
@RequestParam("")//在方法參數(shù)上設置參數(shù)映射,參數(shù)名相同可省略
@PathVariable("")//將請求路徑以{}包括可通過該注解傳遞到參數(shù)上
@RequestBody//該注解將json字符串參數(shù)轉換為對象
? 獲取cookie和session:
@CookieValue("")
@SessionAttribute("")
轉發(fā)與重定向:
//轉發(fā)
//1.直接返回以forward:開頭的轉發(fā)路徑字符串
//2.通過ModelAndView.setViewName("")設置1中的轉發(fā)路徑
//重定向
//1.直接返回以redirect:開頭的重定向路徑字符串
//2.通過ModelAndView.setViewName("")設置1中的重定向路徑
????????響應數(shù)據(jù):
//方法返回字符串時,會默認進行請求轉發(fā),配置視圖解析器后會進行頁面跳轉
//方法返回對象時,需要聲明以下注解,對象會被解析為json字符串返回
@ResponseBody
//注意!當控制器方法的返回類型為void時,會把RequestMapping中指定的映射路徑作為邏輯視圖名稱然后解 //析為物理地址去訪問。此時,可以通過在void方法上聲明HttpServletResponse對象避免解析
共享數(shù)據(jù):
//使用ModelAndView向request域?qū)ο笾泄蚕頂?shù)據(jù),ModelAndView主要由 model(模型)和 view(視圖)兩
//部分組成;其中,model負責數(shù)據(jù)共享,而view則主要用于設置視圖,實現(xiàn)頁面跳轉,轉發(fā),重定向
public ModelAndView share(){
ModelAndView mv=new ModelAndView();
mv.addObject("",new Object());
mv.setViewName("");
return mv;
}
//使用Model向request域?qū)ο笾泄蚕頂?shù)據(jù)
@GetMapping("/share")
public String share(Model model){
model.addAttribute("book",new Book());
return "";
}
//此外還可以在方法上聲明HttpServletRequest向request域?qū)ο笾泄蚕頂?shù)據(jù),
//聲明HttpSession向sesion域?qū)ο笾泄蚕頂?shù)據(jù),
//通過兩者獲取ServletContext對象可以向application域?qū)ο笾泄蚕頂?shù)據(jù),
//其他方法通過聲明域?qū)ο髤?shù)即可獲取共享數(shù)據(jù)
六、RESTfulRESTful(REST 風格)是一種當前比較流行的互聯(lián)網(wǎng)軟件架構模式,它充分并正確地利用 HTTP 協(xié)議的特性,為我們規(guī)定了一套統(tǒng)一的資源獲取方式,以實現(xiàn)不同終端之間(客戶端與服務端)的數(shù)據(jù)訪問與交互。
類型轉換器:一般情況下,Spring MVC 內(nèi)置的類型轉換器就可以滿足我們?nèi)粘5拈_發(fā)需求,但對于一些較為復雜類型的轉換,例如 String 轉換 Date 類型,以及開發(fā)人員自定義格式的數(shù)據(jù)的轉換等,需要我們根據(jù)自身的需求開發(fā)自定義類型轉換器來轉換。
public class MyConverter implements Converter{
@Override
public String convert(String s) {
return null;
}
}
攔截器:在 Spring MVC 中,攔截器的作用與 Servlet 中的過濾器類似,它主要用于攔截用戶請求并做相應的處理,例如通過攔截器,我們可以執(zhí)行權限驗證、記錄請求信息日志、判斷用戶是否已登錄等操作。
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return HandlerInterceptor.super.preHandle(request, response, handler);
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
}
}
? 視圖解析器:Spring MVC 的控制器方法支持 ModelAndView、ModelMap、View、String 多種類型的返回值,但無論控制器方法的返回值是哪種類型,Spring MVC 內(nèi)部最終都會將它們封裝成一個 ModelAndView 對象。ModelAndView 對象由 model(模型數(shù)據(jù))和 view(視圖)兩部分組成,但這里的 view 通常并不是一個真正的 View 視圖對象,而僅僅是一個 String 類型的邏輯視圖名(View Name)而已,例如“success”、“index”等。這種情況下,Spring MVC 就需要借助?ViewResolver(視圖解析器)將 ModelAndView 對象中邏輯視圖名解析為真正的 View 視圖對象,然后才能響應給客戶端展示。
? 異常處理器:Spring MVC 提供了一個名為?HandlerExceptionResolver 的異常處理器接口,它可以對控制器方法執(zhí)行過程中出現(xiàn)的各種異常進行處理。Srping MVC 為 HandlerException- Resolver 接口提供了多個不同的實現(xiàn)類,其中最常用的實現(xiàn)類如下。
其中,ExceptionHandlerExceptionResolver、ResponseStatusExceptionResolver 和 DefaultHandlerExceptionResolver 是 Spring MVC 的默認異常處理器。如果程序發(fā)生異常,Spring MVC 會按照?ExceptionHandlerExceptionResolver → ResponseStatusExceptionResolver → DefaultHandlerExceptionResolver 的順序,依次使用這三個異常處理器對異常進行解析,直到完成對異常的解析工作為止。
? 文件上傳解析器:Spring MVC 提供了一個名為 MultipartResolver 的文件解析器,來實現(xiàn)文件上傳功能。MultipartResolver?本身是一個接口,該接口共有兩個實現(xiàn)類:StandardServlet- MultipartResolver 和 CommonsMultipartResolver 。注意:當我們在 Spring MVC 的配置文件中對?CommonsMultipartResolver 的 Bean 進行定義時,必須指定這個 Bean 的 id為 multipart- Resolver,否則就無法完成文件的解析和上傳工作。
? Spring MVC 主要配置如下:
//核心配置類
@Configuration
//springMVC注解掃描
@ComponentScan({"web.controller"})
//開啟注解驅(qū)動
//會自動向 Spring MVC 中注冊
// RequestMappingHandlerMapping RequestMappingHandlerAdapter 以及 ExceptionHandlerExceptionResolver 三個Bean
// 其中 RequestMappingHandlerMapping 和 RequestMappingHandlerAdapter 都是控制器方法對請求進行分發(fā)的必須組件,為讀寫 JSON 數(shù)據(jù)提供支持
// 而 ExceptionHandlerExceptionResolver 則是 Spring MVC 的異常處理組件
// 除此之外標簽還默認注冊了一個 FormattingConversionServiceFactoryBean類型的Bean
// ConversionService 通過它,可以滿足我們大多數(shù)的類型轉換需求
@EnableWebMvc
public class SpringMVCConfig implements WebMvcConfigurer {
//視圖解析器解析視圖后需要在應用內(nèi)部訪問靜態(tài)資源,
//這時請求路徑無需進行映射,DispatcherServlet找不到該映射,會交給Tomcat提供的默認的servlet處理
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
//配置類型轉換器和格式化器(輸入數(shù)據(jù)轉換為對象)
@Override
public void addFormatters(FormatterRegistry registry) {
WebMvcConfigurer.super.addFormatters(registry);
}
//配置攔截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
WebMvcConfigurer.super.addInterceptors(registry);
}
//配置視圖控制器(直接進行頁面跳轉)
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/index").setViewName("index");
registry.addViewController("/error").setViewName("error");
}
//配置視圖解析器(解析邏輯視圖并返回)
@Override
public void configureViewResolvers(ViewResolverRegistry registry) {
InternalResourceViewResolver viewResolver =new InternalResourceViewResolver();
viewResolver.setPrefix("/WEB-INF/page/");
viewResolver.setSuffix(".html");
registry.viewResolver(viewResolver);
}
//配置默認異常處理器
@Override
public void configureHandlerExceptionResolvers(Listresolvers) {
WebMvcConfigurer.super.configureHandlerExceptionResolvers(resolvers);
}
//配置文件上傳解析器
@Bean
public MultipartResolver multipartResolver(){
CommonsMultipartResolver resolver=new CommonsMultipartResolver();
resolver.setDefaultEncoding("utf-8");
resolver.setMaxUploadSize(1024);
return resolver;
}
//配置靜態(tài)資源訪問映射
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
WebMvcConfigurer.super.addResourceHandlers(registry);
}
//配置默認響應信息轉換器
@Override
public void configureMessageConverters(List>converters) {
WebMvcConfigurer.super.configureMessageConverters(converters);
}
//處理跨域
@Override
public void addCorsMappings(CorsRegistry registry) {
WebMvcConfigurer.super.addCorsMappings(registry);
}
}
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧
網(wǎng)頁標題:9.框架SpringMVC-創(chuàng)新互聯(lián)
文章源于:http://vcdvsql.cn/article46/ddgheg.html
成都網(wǎng)站建設公司_創(chuàng)新互聯(lián),為您提供ChatGPT、網(wǎng)站改版、網(wǎng)站維護、全網(wǎng)營銷推廣、商城網(wǎng)站、外貿(mào)建站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉載內(nèi)容為主,如果涉及侵權請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉載,或轉載時需注明來源: 創(chuàng)新互聯(lián)