11.全注解开发
本文介绍了SpringMVC全注解开发方式,重点讲解了如何通过Servlet 3.0特性替代web.xml文件。主要内容包括: 使用ServletContainerInitializer接口实现Servlet上下文初始化 通过继承AbstractAnnotationConfigDispatcherServletInitializer类完成配置 搭建测试模块框架的项目结构和关键配置文件 演示了全注解
通过网盘分享的文件:SpringMVC6
链接: https://pan.baidu.com/s/1zXHQejjbU-hD3bMyBaGVJw?pwd=648t 提取码: 648t
–来自百度网盘超级会员v6的分享
十一、全注解开发
1、web.xml文件的替代
Servlet3.0新特性:web.xml文件可以不写了
在Servlet3.0的时候规范中提供了一个接口

服务器在启动的时候会自动从容器中找 ServletContainerInitializer接口的实现类,自动调用它的onStartup方法来完成Servlet上下文的初始化
在Spring3.1版本的时候提供了这样一个类,实现以上的接口

它的核心方法如下

可以看到在服务器启动的时候它会去加载所有实现WebApplicationInitializer接口的类

这个接口下有一个子类是我们需要的:AbstractAnnotationConfigDispatcherServletInitializer

当编写类继承AbstractAnnotationConfigDispatcherServletInitializer之后,web服务器在启动的时候会根据它来初始化Servlet上下文

2、搭建测试模块框架
(1)、项目结构

(2)、模块文件
-
pom.xml
<?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>com.longdidi</groupId> <artifactId>springmvc-11-001</artifactId> <version>1.0-SNAPSHOT</version> <!-- 打包方式设置为war方式 --> <packaging>war</packaging> <properties> <maven.compiler.source>21</maven.compiler.source> <maven.compiler.target>21</maven.compiler.target> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> </properties> <dependencies> <!-- Spring MVC依赖 --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>6.1.13</version> </dependency> <!--日志框架Logback依赖--> <dependency> <groupId>ch.qos.logback</groupId> <artifactId>logback-classic</artifactId> <version>1.5.11</version> </dependency> <!--Servlet依赖--> <dependency> <groupId>jakarta.servlet</groupId> <artifactId>jakarta.servlet-api</artifactId> <version>6.1.0</version> <scope>provided</scope> </dependency> <!--Spring6和Thymeleaf整合依赖--> <dependency> <groupId>org.thymeleaf</groupId> <artifactId>thymeleaf-spring6</artifactId> <version>3.1.2.RELEASE</version> </dependency> </dependencies> </project> -
hello.html
<!DOCTYPE html> <html lang="en" xmlns:th="http://www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>hello</title> </head> <body> <h1>hello</h1> </body> </html> -
test.html
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>test</title> </head> <body> <h1>Test!</h1> </body> </html> -
tip.html
<!DOCTYPE html> <html lang="en" xmlns:th="http:/www.thymeleaf.org"> <head> <meta charset="UTF-8"> <title>tip</title> </head> <body> <h1>出错了哦,请联系管理员!</h1> <hr> <div th:text="${e}"></div> </body> </html> -
HelloController
package com.longdidi.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; @Controller public class HelloController { @RequestMapping(value = "/hello") public String hello() { System.out.println("HelloController#hello()"); return "hello"; } } -
MyInterceptor
package com.longdidi.interceptors; import org.springframework.stereotype.Component; @Component public class MyInterceptor { } -
SpringConfig
package com.longdidi.config; import org.springframework.context.annotation.Configuration; @Configuration // 使用该注解指定这是一个配置类 public class SpringConfig { } -
SpringMvcConfig
package com.longdidi.config; public class SpringMvcConfig { } -
WebAppInitializer
package com.longdidi.config; import org.springframework.context.annotation.Configuration; @Configuration public class WebAppInitializer { }
3、全注解开发
(1)、编写WebAppInitializer
以下这个类就是用来代替web.xml文件的
继承AbstractAnnotationConfigDispatcherServletInitializer,实现其中几个主要的方法
- Spring的配置
- SpringMVC的配置
- 配置 DispatcherServlet 的映射路径
- 配置过滤器
package com.longdidi.config;
import jakarta.servlet.Filter;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
// 在这个配置类当中编写的其实就是web.xml文件中的配置
// 用来标注这个类当做配置文件
@Configuration
public class WebAppInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {
/**
* Spring的配置
* 用来指定Spring的配置文件类
*
* @return
*/
@Override
protected Class<?>[] getRootConfigClasses() {
/*return new Class[0];*/
return new Class[]{SpringConfig.class};
}
/**
* SpringMVC的配置
* 指定SpringMVC的配置文件类
*
* @return
*/
@Override
protected Class<?>[] getServletConfigClasses() {
return new Class[]{SpringMvcConfig.class};
}
/**
* 用来配置DispatcherServlet的 <url-pattern>
*
* @return
*/
@Override
protected String[] getServletMappings() {
return new String[]{"/"};
}
/**
* 配置过滤器
*
* @return
*/
@Override
protected Filter[] getServletFilters() {
// 配置字符编码过滤器
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setEncoding("UTF-8");
characterEncodingFilter.setForceResponseEncoding(true);
characterEncodingFilter.setForceRequestEncoding(true);
// 配置HiddenHttpMethodFilter过滤器
HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
return new Filter[]{characterEncodingFilter, hiddenHttpMethodFilter};
}
}
(2)、Spring配置如下
package com.longdidi.config;
import org.springframework.context.annotation.Configuration;
@Configuration // 使用该注解指定这是一个配置类
public class SpringConfig {
}
(3)、SpringMVC配置如下
package com.powernode.springmvc.config;
import org.springframework.context.annotation.Configuration;
/**
* ClassName: SpringMVCConfig
* Description:
* Datetime: 2024/3/29 17:03
* Author: 老杜@动力节点
* Version: 1.0
*/
@Configuration
public class SpringMVCConfig {
}
(4)、Spring MVC的配置
在springmvc.xml文件中常见的配置信息
1.组件扫描
2.视图解析器
3.静态资源处理 default-servlet-handler
4.视图控制器 view-controller
5.开启注解驱动 mvc:annotation-driven/
6.异常处理器
7.拦截器
组件扫描
// 以下相当于是 springmvc.xml 配置文件
@Configuration
// 组件扫描
@ComponentScan("com.longdidi.controller")
public class SpringMVCConfig {
}
开启注解驱动
// 以下相当于是 springmvc.xml 配置文件
@Configuration
// 组件扫描
@ComponentScan("com.longdidi.controller")
// 开启注解驱动
@EnableWebMvc
public class SpringMVCConfig {
}
视图解析器
// 以下相当于是 springmvc.xml 配置文件
@Configuration
// 组件扫描
@ComponentScan("com.longdidi.controller")
// 开启注解驱动
@EnableWebMvc
public class SpringMVCConfig {
// 以下三个方法合并起来就是开启视图解析器
@Bean
public ThymeleafViewResolver getViewResolver(SpringTemplateEngine springTemplateEngine) {
ThymeleafViewResolver resolver = new ThymeleafViewResolver();
resolver.setTemplateEngine(springTemplateEngine);
resolver.setCharacterEncoding("UTF-8");
resolver.setOrder(1);
return resolver;
}
@Bean
public SpringTemplateEngine templateEngine(ITemplateResolver iTemplateResolver) {
SpringTemplateEngine templateEngine = new SpringTemplateEngine();
templateEngine.setTemplateResolver(iTemplateResolver);
return templateEngine;
}
@Bean
public ITemplateResolver templateResolver(ApplicationContext applicationContext) {
SpringResourceTemplateResolver resolver = new SpringResourceTemplateResolver();
resolver.setApplicationContext(applicationContext);
resolver.setPrefix("/WEB-INF/templates/");
resolver.setSuffix(".html");
resolver.setTemplateMode(TemplateMode.HTML);
resolver.setCharacterEncoding("UTF-8");
resolver.setCacheable(false);//开发时关闭缓存,改动即可生效
return resolver;
}
}
开启默认Servlet处理
让SpringMVCConfig类实现这个接口:WebMvcConfigurer并且重写以下的方法
// 开启静态资源处理,开启默认的Servlet处理
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
view-controller
重写以下方法
// 视图控制器
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/test").setViewName("test");
}
异常处理器
重写以下方法
/*
<bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
<property name="exceptionMappings">
<props>
<prop key="java.lang.Exception">tip</prop>
</props>
</property>
<property name="exceptionAttribute" value="yiChang"/>
</bean>
*/
// 配置异常处理器
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
// 可以配置多个异常处理器,这是其中一个
SimpleMappingExceptionResolver resolver = new SimpleMappingExceptionResolver();
// 设置其中的 exceptionMappings 属性
Properties prop = new Properties();
prop.setProperty("java.lang.Exception", "tip");
resolver.setExceptionMappings(prop);
// 设置其中的 exceptionAttribute 属性
resolver.setExceptionAttribute("e");
// 将异常处理器添加到List集合中
resolvers.add(resolver);
}
拦截器
重写以下方法
// 配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
MyInterceptor myInterceptor = new MyInterceptor();
registry.addInterceptor(myInterceptor).addPathPatterns("/**").excludePathPatterns("/test");
}
(5)、定义拦截器
package com.longdidi.interceptors;
import org.springframework.stereotype.Component;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("MyInterceptor's preHandle");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("MyInterceptor's postHandle");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("MyInterceptor's afterCompletion");
}
}
(6)、测试
启动项目访问http://localhost:8080/springmvc/hello

修改MyInterceptor拦截器的preHandle方法返回值为false,重新测试


更多推荐



所有评论(0)