14.1、概述 在實際工作中,一般使用配置類和註解代替web.xml和SpringMVC配置文件的功能; 在 Servlet3.0 環境中,容器會在類路徑中查找實現了 javax.servlet.ServletContainerInitializer 介面的類, 如果找到了的話,就會用它來配置 Se ...
14.1、概述
-
在實際工作中,一般使用配置類和註解代替web.xml和SpringMVC配置文件的功能;
-
在 Servlet3.0 環境中,容器會在類路徑中查找實現了 javax.servlet.ServletContainerInitializer 介面的類,
如果找到了的話,就會用它來配置 Servlet 容器; -
Spring 提供了 ServletContainerInitializer 這個介面的實現,類名為 SpringServletContainerInitializer,
這個類又會查找實現了 WebApplicationInitializer 介面的類,並將配置的任務交給它們來完成; -
Spring3.2 引入了一個便利的 WebApplicationInitializer 基礎實現,類名為 AbstractAnnotationConfigDispatcherServletInitializer;
-
當自定義的類繼承了 AbstractAnnotationConfigDispatcherServletInitializer 並將其部署到 Servlet3.0 容器的時候,
容器會自動發現它,並用它來配置 Servlet 上下文。
14.2、環境搭建
14.2.1、在project創建新module
12.2.2、選擇maven
14.2.3、設置module名稱和路徑
14.2.4、module初始狀態
14.2.5、配置打包方式和引入依賴
註意:預設的打包方式為 jar,為了能配置web資源,需要將打包方式設置為 war
<?xml version="1.0" encoding="UTF-8"?>
<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/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>online.liaojy</groupId>
<artifactId>spring_mvc_annotation</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- SpringMVC (基於依賴的傳遞性,會間接引入Spring的依賴)-->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>5.3.1</version>
</dependency>
<!-- 日誌(Thymeleaf必須要sl4j,logback則是sl4j的實現) -->
<dependency>
<groupId>ch.qos.logback</groupId>
<artifactId>logback-classic</artifactId>
<version>1.2.3</version>
</dependency>
<!-- ServletAPI -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- Spring5和Thymeleaf整合包 -->
<dependency>
<groupId>org.thymeleaf</groupId>
<artifactId>thymeleaf-spring5</artifactId>
<version>3.0.12.RELEASE</version>
</dependency>
<!--文件上傳-->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.1</version>
</dependency>
</dependencies>
</project>
14.2.6、配置web資源目錄
打開Project Structure,選擇對應的module,併為該module創建一個web.xml文件
註意:web.xml文件需要放到web資源路徑(工程路徑\src\main\webapp)下
因為使用配置類和註解來配置 Servlet 上下文,所以 web.xml 不再需要配置。
14.2.7、創建攔截器
package online.liaojy.interceptor;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* @author liaojy
* @date 2023/11/15 - 7:22
*/
public class AAAInterceptor implements HandlerInterceptor {
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
return true;
}
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
14.2.8、創建模板目錄及頁面模板
註意:html要引入thymeleaf的約束:xmlns:th="http://www.thymeleaf.org"
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>首頁</title>
</head>
<body>
<h1>index.html</h1>
</body>
</html>
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<head>
<meta charset="UTF-8">
<title>錯誤頁面</title>
</head>
<body>
<h1>errorPage.html</h1>
</body>
</html>
14.2.9、配置tomcat
14.3、web.xml的註解配置
14.3.1、創建Spring配置類
package online.liaojy.config;
/**
* @author liaojy
* @date 2023/11/16 - 23:59
* 該類用於代替spring的配置文件
*/
public class SpringConfig {
//ssm整合之後,spring的配置信息寫在此類中
}
14.3.2、創建SpringMVC配置類
package online.liaojy.config;
/**
* @author liaojy
* @date 2023/11/17 - 0:02
* 該類用於代替SpringMVC的配置文件
*/
public class SpringMVCConfig {
}
14.3.3、創建代替web.xml的初始化類
package online.liaojy.config;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import javax.servlet.Filter;
/**
* @author liaojy
* @date 2023/11/17 - 0:04
*/
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {
// 指定代替 Spring 配置文件的配置類(可以按功能或需要來劃分多個)
protected Class<?>[] getRootConfigClasses() {
return new Class[]{SpringConfig.class};
}
// 指定代替 SpringMVC 配置文件的配置類(可以按功能或需要來劃分多個)
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMVCConfig.class};
}
// 設置 SpringMVC 的前端控制器 DispatcherServlet 需要處理的請求路徑(即 url-pattern )
protected String[] getServletMappings() {
return new String[]{"/"};
}
// 設置過濾器
@Override
protected Filter[] getServletFilters() {
// 配置編碼過濾器
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceEncoding(true);
// 配置處理請求方式的過濾器
// 註意該過濾器所在的包路徑為 org.springframework.web.filter.HiddenHttpMethodFilter
HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
// 配置要使用的過濾器
return new Filter[]{characterEncodingFilter,hiddenHttpMethodFilter};
}
}
14.4、SpringMVC配置類的詳細配置
14.4.1、將類標識為配置類
// @Configurable 註解:將類標識為配置類
@Configurable
14.4.2、實現 WebMvcConfigurer 介面
14.4.3、配置掃描組件
先創建一個需要掃描的包及組件
package online.liaojy.controller;
import org.springframework.stereotype.Controller;
/**
* @author liaojy
* @date 2023/11/19 - 16:56
*/
@Controller
public class TestController {
}
// @ComponentScan 註解:用於掃描指定包的組件
@ComponentScan("online.liaojy.controller")
14.4.4、配置預設servlet處理器
// 配置預設servlet處理器
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
14.4.5、配置mvc註解驅動
// @EnableWebMvc 註解:開啟mvc的註解驅動
@EnableWebMvc
14.4.6、配置視圖控制器
// 配置視圖控制器
public void addViewControllers(ViewControllerRegistry registry) {
// addViewController 設置視圖控制器要處理的請求路徑,setViewName 設置匹配請求路徑的邏輯視圖
registry.addViewController("/").setViewName("index");
}
14.4.7、配置文件上傳解析器
// 配置文件上傳解析器
// @Bean 註解:用於將所標識方法的返回值作為一個 bean 來進行管理,bean的id為方法名
@Bean
public CommonsMultipartResolver multipartResolver(){
return new CommonsMultipartResolver();
}
14.4.8、配置攔截器
// 配置攔截器
public void addInterceptors(InterceptorRegistry registry) {
AAAInterceptor aaaInterceptor = new AAAInterceptor();
// addInterceptor 設置要使用的攔截器,
// addPathPatterns 設置該攔截器要攔截的請求路徑( /** 表示所有路徑),excludePathPatterns 設置要排除的攔截路徑
registry.addInterceptor(aaaInterceptor).addPathPatterns("/**").excludePathPatterns("/abc");
}
14.4.9、配置異常解析器
// 配置異常解析器
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
// 創建 SimpleMappingExceptionResolver 異常解析器,來對控制器方法出現的異常進行自定義異常處理
SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();
// 設置異常和錯誤提示頁面的映射關係
Properties properties = new Properties();
properties.setProperty("java.lang.ArithmeticException", "errorPage");
simpleMappingExceptionResolver.setExceptionMappings(properties);
// 設置共用到域對象中的異常信息的屬性名
simpleMappingExceptionResolver.setExceptionAttribute("exceptionMessage");
// 添加要使用的異常解析器器
resolvers.add(simpleMappingExceptionResolver);
}
14.4.10、配置視圖解釋器
配置視圖解釋器,無論是通過xml還是配置類都比較複雜;一般直接都是複製配置模板,然後根據實際修改視圖首碼及尾碼即可
//配置生成模板解析器
@Bean
public ITemplateResolver templateResolver() {
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
// ServletContextTemplateResolver 需要一個 ServletContext 作為構造參數,可通過 WebApplicationContext 的方法獲得
ServletContextTemplateResolver templateResolver =
new ServletContextTemplateResolver(webApplicationContext.getServletContext());
templateResolver.setPrefix("/WEB-INF/templates/");
templateResolver.setSuffix(".html");
templateResolver.setCharacterEncoding("UTF-8");
templateResolver.setTemplateMode(TemplateMode.HTML);
return templateResolver;
}
//生成模板引擎併為模板引擎註入模板解析器
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
return templateEngine;
}
//生成視圖解析器併為解析器註入模板引擎
@Bean
public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setCharacterEncoding("UTF-8");
viewResolver.setTemplateEngine(templateEngine);
return viewResolver;
}
14.4.11、全配置彙總
package online.liaojy.config;
import online.liaojy.interceptor.AAAInterceptor;
import org.springframework.beans.factory.annotation.Configurable;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.ViewResolver;
import org.springframework.web.servlet.config.annotation.*;
import org.springframework.web.servlet.handler.SimpleMappingExceptionResolver;
import org.thymeleaf.spring5.SpringTemplateEngine;
import org.thymeleaf.spring5.view.ThymeleafViewResolver;
import org.thymeleaf.templatemode.TemplateMode;
import org.thymeleaf.templateresolver.ITemplateResolver;
import org.thymeleaf.templateresolver.ServletContextTemplateResolver;
import java.util.List;
import java.util.Properties;
/**
* @author liaojy
* @date 2023/11/17 - 0:02
* 該類用於代替SpringMVC的配置文件
*/
// @Configurable 註解:將類標識為配置類
@Configurable
// @ComponentScan 註解:用於掃描指定包的組件
@ComponentScan("online.liaojy.controller")
// @EnableWebMvc 註解:開啟mvc的註解驅動
@EnableWebMvc
public class SpringMVCConfig implements WebMvcConfigurer {
// 配置預設servlet處理器
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
// 配置視圖控制器
public void addViewControllers(ViewControllerRegistry registry) {
// addViewController 設置視圖控制器要處理的請求路徑,setViewName 設置匹配請求路徑的邏輯視圖
registry.addViewController("/").setViewName("index");
}
// 配置文件上傳解析器
// @Bean 註解:用於將所標識方法的返回值作為一個 bean 來進行管理,bean的id為方法名
@Bean
public CommonsMultipartResolver multipartResolver(){
return new CommonsMultipartResolver();
}
// 配置攔截器
public void addInterceptors(InterceptorRegistry registry) {
AAAInterceptor aaaInterceptor = new AAAInterceptor();
// addInterceptor 設置要使用的攔截器,
// addPathPatterns 設置該攔截器要攔截的請求路徑( /** 表示所有路徑),excludePathPatterns 設置要排除的攔截路徑
registry.addInterceptor(aaaInterceptor).addPathPatterns("/**").excludePathPatterns("/abc");
}
// 配置異常解析器
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
// 創建 SimpleMappingExceptionResolver 異常解析器,來對控制器方法出現的異常進行自定義異常處理
SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();
// 設置異常和錯誤提示頁面的映射關係
Properties properties = new Properties();
properties.setProperty("java.lang.ArithmeticException", "errorPage");
simpleMappingExceptionResolver.setExceptionMappings(properties);
// 設置共用到域對象中的異常信息的屬性名
simpleMappingExceptionResolver.setExceptionAttribute("exceptionMessage");
// 添加要使用的異常解析器器
resolvers.add(simpleMappingExceptionResolver);
}
//配置生成模板解析器
@Bean
public ITemplateResolver templateResolver() {
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
// ServletContextTemplateResolver 需要一個 ServletContext 作為構造參數,可通過 WebApplicationContext 的方法獲得
ServletContextTemplateResolver templateResolver =
new ServletContextTemplateResolver(webApplicationContext.getServletContext());
templateResolver.setPrefix("/WEB-INF/templates/");
templateResolver.setSuffix(".html");
templateResolver.setCharacterEncoding("UTF-8");
templateResolver.setTemplateMode(TemplateMode.HTML);
return templateResolver;
}
//生成模板引擎併為模板引擎註入模板解析器
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(templateResolver);
return templateEngine;
}
//生成視圖解析器併為解析器註入模板引擎
@Bean
public ViewResolver viewResolver(SpringTemplateEngine templateEngine) {
ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();
viewResolver.setCharacterEncoding("UTF-8");
viewResolver.setTemplateEngine(templateEngine);
return viewResolver;
}
}
14.5、測試效果
本文來自博客園,作者:Javaer1995,轉載請註明原文鏈接:https://www.cnblogs.com/Javaer1995/p/17833503.html