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、测试效果

14、SpringMVC之注解配置的更多相关文章

  1. 【Spring】SpringMVC非注解配置的两种方式

    目录结构: contents structure [+] SpringMVC是什么 Spring MVC的设计原理 SpringMVC配置的第一种方式 1,复制Jar包 2,Web.xml文件 3,M ...

  2. springmvc的注解配置

    springmvc大大减少了对xml的配置,减少了配置量,以及可以在一个controller类中进行多个请求配置 一.springmvc配置 context:component-scan 开启包扫描, ...

  3. SpringMVC 非注解配置

    web.xml配置: <servlet> <servlet-name>springmvc</servlet-name> <servlet-class>o ...

  4. 关于什么是SpringMVC,和SpringMVC基于xml配置、注解配置、纯注解配置

    首先我们先要了解一下,什么是SpringMVC? SpringMVC是Spring框架内置的MVC的实现.SpringMVC就是一个Spring内置的MVC子框架,也就是说SpringMVC的相关包都 ...

  5. spring mvc 第一天【注解实现springmvc的基本配置】

    创建pojo,添加标识类的注解@Controller,亦可添加该Handler的命名空间:设置类的@RequestMapping(value="/hr") 该类中的方法(Handl ...

  6. SpringMVC基础配置(通过注解配置,非xml配置)

    SpringMVC是什么,有多火,我这里就不再啰嗦了,SpringMVC比Struts2好用太多,我在学校的时候私下里两种都接触过,对比之后果断选择了SpringMVC,后来在做Android应用开发 ...

  7. SpringMVC整合mybatis基于纯注解配置

    Mybatis整合Spring配置 第一部分:配置Spring框架 配置SpringMVC的步骤 配置流程图 导入包(哪些包,基本包5个,1日志依赖包,2webmvc支持包)SpringMVC配置 & ...

  8. 记录一下SpringMVC扫描注解包的配置

    最近做了一个小项目,使用Spring4+SpringMVC+Hibernate5 但是整合完毕了之后,在页面上请求添加记录的时候发现无法开启事务,报错的信息如下: org.springframewor ...

  9. SpringMVC的注解方式配置

    SpringMVC支持使用注解方式配置,比配置文件方式更加灵活易用,是SpringMVC使用的主流模式. 1.在配置文件中开启SpringMVC的注解 <!-- 开启包扫描 --> < ...

  10. spring-mvc注解配置小记

    Controller中注解Service时,Service的实现类需加@Service,dao的实现类需加@Repository. 另:配置文件中对应的包也需要扫描到!!! <context:a ...

随机推荐

  1. 中国十大IT技术社区,你都知道哪些?

    中国5大新型IT技术社区与5大传统IT技术社区,你都知道哪些? 社区是聚集一类具有相同爱好或者相同行业的群体,IT技术社区就是聚集了IT行业内的技术人,在技术社区可以了解到行业的最新进展,学习最前沿的 ...

  2. switch的穿透

      // switch 的 穿透         // 什么是switch的穿透         // 如果在 switch 中没有定义break , switch 会从定位的程序,一直执行到所有sw ...

  3. SELinux 安全模型——MLS

    首发公号:Rand_cs SELinux 安全模型--MLS BLP 模型:于1973年被提出,是一种模拟军事安全策略的计算机访问控制模型,它是最早也是最常用的一种多级访问控制模型,主要用于保证系统信 ...

  4. MS SQL SERVER 创建表、索引、添加字段等常用脚本

    创建表: if not exists ( select 1 from sysobjects where id=object_id('PayChannelNm') ) create table [dbo ...

  5. Vue学习:2.V标签综合2

    接上一篇... V标签综合使用:书架案例 功能: 实现列表的渲染和删除 思路: 使用 v-for 渲染数据列表,并在每个列表项内放置一个绑定了 del方法的"删除"按钮,点击按钮时 ...

  6. 08-Python迭代器与生成器

    迭代器 什么是迭代器 迭代是Python最强大的功能之一,是访问序列中元素的一种方式. 迭代器是一个可以记住遍历的位置的对象. 迭代器对象从集合的第一个元素开始访问,直到所有的元素被访问完结束.迭代器 ...

  7. Windows无法调节亮度

    原因1:驱动问题 解决方式: 安装360驱动大师,一键安装. 也可以使用其他软件:如驱动精灵. 推荐使用电脑品牌本身的驱动软件:如联想:联想驱动管理 原因2:设备管理问题 解决方式: 计算机 -> ...

  8. 十大java应用服务器(web server)总结

    java应用服务器(web server),是指运行java程序的web应用服务器软件,不包括nginx.Apache等通用web服务器软件. 一.Tomcat Tomcat是Apache 软件基金会 ...

  9. DotNetGuide专栏C#/.NET/.NET Core充电站(让你学习不迷路)

    DotNetGuide简介 记录.收集和总结C#/.NET/.NET Core基础知识.学习路线.开发实战.编程技巧练习.学习视频.文章.书籍.项目框架.社区组织.开发必备工具.常见面试题.面试须知. ...

  10. python_8 拆包、内置函数和高阶函数

    一.查缺补漏 1. \t 子表符,用于对其二.拆包 1. 拆包:顾名思义就是将可迭代的对象如元组,列表,字符串,集合,字典,拆分出相对应的元素 2. 形式:拆包一般分两种方式,一种是以变量的方式来接收 ...