SpringMVC中的注解配置

文章目录

    • 13、注解配置springmvc
      • 13.1、创建初始化的类,代替web.xml
      • 13.2、使用流程
        • 声明一个类来继承AbstractAnnotationConfigDispatcherServletInitializer,并且实现他的抽象方法
        • 实现配置SpringConfig的java文件
        • 实现SpringMvcConfig的java文件
      • 13.3、实例代码
        • 1.继承AbstractAnnotationConfigDispatcherServletInitializer的java文件
        • 2.SpringMvcConfig.java文件
        • 3.SpringConfig.java

13、注解配置springmvc

使用配置类和注解代替web.xml和SpringMVC配置文件的功能

13.1、创建初始化的类,代替web.xml

在Servlet3.0环境中,容器会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。 Spring提供了这个接口的实现,名为

SpringServletContainerInitializer,这个类反过来又会查找实现WebApplicationInitializer的类并将配置的任务交给它们来完成。Spring3.2引入了一个便利的WebApplicationInitializer基础实现,名为AbstractAnnotationConfigDispatcherServletInitializer,当我们的类扩展了

AbstractAnnotationConfigDispatcherServletInitializer并将其部署到Servlet3.0容器的时候,容器会自动发现它,并用它来配置Servlet上下文。

13.2、使用流程

  1. 声明一个类来继承AbstractAnnotationConfigDispatcherServletInitializer,并且实现他的抽象方法
  2. 实现配置SpringConfig的java文件
    @Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}
    
  3. 实现SpringMvcConfig的java文件
    @Override
    protected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};
    }
    

13.3、实例代码

1.继承AbstractAnnotationConfigDispatcherServletInitializer的java文件
/*** @author ning0* @date 2024/6/25 22:24* @description WebInit*/
public class WebInit extends AbstractAnnotationConfigDispatcherServletInitializer {//加载spring配置类@Overrideprotected Class<?>[] getRootConfigClasses() {return new Class[]{SpringConfig.class};}//加载springmvc配置类@Overrideprotected Class<?>[] getServletConfigClasses() {return new Class[]{SpringMvcConfig.class};}//设置DispatcherServlet的url-pattern@Overrideprotected String[] getServletMappings() {return new String[]{"/"};}@Overrideprotected Filter[] getServletFilters() {// 创建编码过滤器CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();// 设置编码格式characterEncodingFilter.setEncoding("UTF-8");// 设置强制编码characterEncodingFilter.setForceEncoding(true);// 创建请求方式的过滤器HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter};}
}
2.SpringMvcConfig.java文件
package com.qc.config;import com.qc.interceptors.FirstInterceptor;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.ComponentScan;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;
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 javax.servlet.ServletContext;
import java.util.List;
import java.util.Properties;/*** @author ning0* @date 2024/6/25 22:27* @description SpringMvcConfig*/
// 配置类
@Configuration
// 扫描controller
@ComponentScan("com.qc.controller")
// 开启SpringMvc注解
@EnableWebMvc
public class SpringMvcConfig implements WebMvcConfigurer {// 默认servlet处理器 静态资源映射@Overridepublic void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {configurer.enable();}@Override// 配置视图控制器public void addViewControllers(ViewControllerRegistry registry) {registry.addViewController("/").setViewName("index");}@Overridepublic void addInterceptors(InterceptorRegistry registry) {FirstInterceptor firstInterceptor = new FirstInterceptor();registry.addInterceptor(firstInterceptor).addPathPatterns("/**").excludePathPatterns("/");}// 异常解析器@Overridepublic void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {SimpleMappingExceptionResolver simpleMappingExceptionResolver = new SimpleMappingExceptionResolver();Properties properties = new Properties();properties.setProperty("java.lang.ArithmeticException", "error");simpleMappingExceptionResolver.setExceptionMappings(properties);simpleMappingExceptionResolver.setExceptionAttribute("ex");resolvers.add(simpleMappingExceptionResolver);}// 配置视图解析器@Beanpublic ITemplateResolver templateResolver() {WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();ServletContextTemplateResolver templateResolver = new ServletContextTemplateResolver(webApplicationContext.getServletContext());templateResolver.setPrefix("/WEB-INF/pages/");templateResolver.setSuffix(".html");templateResolver.setCharacterEncoding("UTF-8");templateResolver.setTemplateMode(TemplateMode.HTML);return templateResolver;}// 配置模板引擎@Beanpublic SpringTemplateEngine templateEngine(ITemplateResolver templateResolver) {SpringTemplateEngine templateEngine = new SpringTemplateEngine();templateEngine.setTemplateResolver(templateResolver);return templateEngine;}// 配置视图解析器注入引擎@Beanpublic ViewResolver viewResolver(SpringTemplateEngine templateEngine) {ThymeleafViewResolver viewResolver = new ThymeleafViewResolver();viewResolver.setCharacterEncoding("UTF-8");viewResolver.setTemplateEngine(templateEngine);return viewResolver;}}
3.SpringConfig.java
package com.qc.config;import org.springframework.context.annotation.Configuration;/*** @author ning0* @date 2024/6/25 22:26* @description SpringConfig*///将该类标注为配置类
@Configuration
public class SpringConfig {}

g.springframework.context.annotation.Configuration;

/**

  • @author ning0
  • @date 2024/6/25 22:26
  • @description SpringConfig
    */

//将该类标注为配置类
@Configuration
public class SpringConfig {

}


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/864242.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【每日刷题】Day78

【每日刷题】Day78 &#x1f955;个人主页&#xff1a;开敲&#x1f349; &#x1f525;所属专栏&#xff1a;每日刷题&#x1f34d; &#x1f33c;文章目录&#x1f33c; 1. 1608. 特殊数组的特征值 - 力扣&#xff08;LeetCode&#xff09; 2. 1385. 两个数组间的距离值 - …

R可视化:好看的气泡图

加载R包 library(tidyverse) library(camcorder)gg_record(dir "tidytuesday-temp", device "png", width 8, height 8, units "in", dpi 320)导入数据 team_results <- readr::read_csv(https://raw.githubusercontent.com/rfordata…

设置Docker中时区不生效的问题

项目中使用docker-compose&#xff0c;并通过以下方式设置了时区 environment:- SET_CONTAINER_TIMEZONEtrue- CONTAINER_TIMEZONEAsia/Shanghai 但是并没有正确生效&#xff0c;网上有很多博客都在推荐这个做法&#xff0c;另外一种是使用标准环境标量 -TZAsia/Shangehai …

24 年程序员各岗位薪资待遇汇总(最新)

大家好&#xff0c;我是程序员鱼皮。今天分享 24 年 6 月最新的程序员各岗位薪资待遇汇总。 数据是从哪儿来的呢&#xff1f;其实很简单&#xff0c;BOSS 直聘上有一个免费的薪酬查询工具&#xff0c;只要认证成为招聘者就能直接看&#xff0c;便于招聘者了解市场&#xff0c;…

RabbitMQ消息可靠性等机制详解(精细版三)

目录 七 RabbitMQ的其他操作 7.1 消息的可靠性(发送可靠) 7.1.1 confim机制(保证发送可靠) 7.1.2 Return机制(保证发送可靠) 7.1.3 编写配置文件 7.1.4 开启Confirm和Return 7.2 手动Ack(保证接收可靠) 7.2.1 添加配置文件 7.2.2 手动ack 7.3 避免消息重复消费 7.3.…

python(63): dict: del/pop不释放内存

Python中的字典&#xff0c;只有不再使用的时候才会释放对应的内存。在使用 pop 或者 delete 删除字典中的item(或者说entry)后&#xff0c;为了保证hash table 探测链的完整&#xff0c;那个被删除的entry只是被标记成了空&#xff0c;并没有真正被删除掉&#xff0c;所以该字…

如何解决安卓模拟器无法上网的问题

如何使安卓模拟器上网 在使用Android模拟器进行开发时&#xff0c;有时会遇到模拟器无法联网的问题。这篇博客将分享我解决这个问题的步骤和方法。 看了网上很多解决android studio内置模拟器无法联网的问题&#xff0c;基本上都是在模拟器手机上配置dns&#xff0c;个人试了多…

【C语言】23.文件操作

由于要对数据进行持久化保存&#xff0c;我们就有了文件。 一、程序文件与数据文件 磁盘&#xff08;硬盘&#xff09;上的文件是文件。 但是在程序设计中&#xff0c;我们⼀般谈的文件有两种&#xff1a;程序文件、数据文件&#xff08;从文件功能的角度来分类的&#xff09…

“论云上自动化运维及其应用”写作框架,软考高级论文,系统架构设计师论文

论文真题 云上自动化运维是传统IT运维和DevOps的延伸&#xff0c;通过云原生架构实现运维的再进化。云上自动化运维可以有效帮助企业降低IT运维成本&#xff0c;提升系统的灵活度&#xff0c;以及系统的交付速度&#xff0c;增强系统的可靠性&#xff0c;构建更加安全、可信、…

go语言里怎么使用kafka怎么拉取消息?

Apache Kafka 是一个分布式流处理平台&#xff0c;它允许你发布和订阅记录流。在 Go 语言中&#xff0c;你可以使用第三方库如 segmentio/kafka-go 或 Shopify/sarama 来与 Kafka 进行交互。 以下是一个使用 segmentio/kafka-go 库的简单示例&#xff0c;说明如何在 Go 语言中从…

MySQL中update语法的使用(超详细)

在MySQL中&#xff0c;UPDATE 语句用于修改已存在的表中的记录。以下是对 UPDATE 语句的详细解释和使用方法&#xff1a; 语法 UPDATE table_name SET column1 value1, column2 value2, ... WHERE condition; table_name&#xff1a;要更新的表名。SET&#xff1a;用于…

2024年最适合Python小白的零基础入门教程!

伴随着云计算、大数据、AI等技术的迅速崛起&#xff0c;市场对Python人才的需求和市场人才的匮乏&#xff0c;让长期沉默的Python语言一下子备受众人的关注&#xff0c;再加上简单易学&#xff0c;使得Python一跃成为TIOBE排行榜的第一。 准备学Python或者想学Python的小伙伴们…

13 Redis-- 数据一致性模型、MySQL 和 Redis 的数据一致性

数据一致性模型 根据一致性的强弱分类&#xff0c;可以将一致性模型按以下顺序排列&#xff1a; 强一致性 > 最终一致性 > 弱一致性 数据一致性模型一般用于分布式系统中&#xff0c;目的是定义多个节点间的同步规范。 在这里&#xff0c;我们将其引入数据库和缓存组…

【正点原子K210连载】第十四章 按键输入实验 摘自【正点原子】DNK210使用指南-CanMV版指南

1&#xff09;实验平台&#xff1a;正点原子ATK-DNK210开发板 2&#xff09;平台购买地址https://detail.tmall.com/item.htm?id731866264428 3&#xff09;全套实验源码手册视频下载地址&#xff1a; http://www.openedv.com/docs/boards/xiaoxitongban 第十四章 按键输入实…

Vue3 登录成功,浏览器存在toke,再次访问/login路由到/index 首页页面

文章目录 目录 文章目录 流程 小结 概要流程技术细节小结 概要 首先需要清楚知道浏览器localstorage和Session storage的区别 localStorage 和 sessionStorage 是 HTML5 提供的两种客户端存储数据的方法&#xff0c;它们在使用和生命周期上有一些区别&#xff1a; 1. 生命周期…

单机的redis安装

前些天发现了一个人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;最重要的屌图甚多&#xff0c;忍不住分享一下给大家。点击跳转到网站。 单机的redis安装很简单 安装EPEL&#xff08;Extra Packages for Enterprise Linux&#xff09;存储库 sudo y…

【嵌入式——FreeRTOS】延时函数

相对延时&#xff1a;每次延时都是从执行函数vTaskDelay()开始&#xff0c;直到延时指定的时间结束&#xff1b; 绝对延时&#xff1a;将整个任务的运行周期看成一个整体&#xff0c;适用于需要按照一定频率运行的任务。 延时函数解析 判断延时时间是否大于0&#xff0c;大于…

@Cacheable解决复杂对象形参导致的缓存失效问题(如Map参数)

在Spring中使用 Cacheable 注解可以非常方便地实现方法的自动缓存机制。如以下代码&#xff1a; Cacheable(value "YwtbToken", key "#p0") public String createToken(String dlzh) {...}但当Cacheable 注解修饰的方法参数使用了复杂对象&#xff0c;如…

物联网数据可视化利器:云组态设计器全新升级

数据可视化已成为数据展示与分析领域非常重要的工具。由多种图表、3D图形组成的大屏能够帮助用户非常直观简洁地了解数据。在物联网环境下,用户在制作数据展示大屏时,对数据可视化工具提出了更高的要求,例如能够展示3D组件、灵活的图层结构、支持多种数据源、实时的数据更新、图…

函数创建单链表---无n型,需要 while 循环 + scanf

题目&#xff1a; #include <stdlib.h> struct link{int data;struct link *next; }; struct link* creatLink(); int main(){struct link *head,*p;headcreatLink();for(phead->next ;p;pp->next )printf("%d ",p->data );return 0; }/* 请在这里填…