通过网盘分享的文件: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,重新测试

在这里插入图片描述

在这里插入图片描述

Logo

有“AI”的1024 = 2048,欢迎大家加入2048 AI社区

更多推荐