分析讲解SpringMVC注解配置如何实现

目录
  • 简介
  • 注解类代替web.xml
  • 注解类代替Spring-mvc.xml

简介

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

在Servlet3.0环境中,容器会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器。 Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类又会查找实现WebApplicationInitializer的类并将配置的任务交给它们来完成。Spring3.2引入了一个便利的WebApplicationInitializer基础实现,名为AbstractAnnotationConfigDispatcherServletInitializer,当我们的类扩展了AbstractAnnotationConfigDispatcherServletInitializer并将其部署到Servlet3.0容器的时候,容器会自动发现它,并用它来配置Servlet上下文。

意思就是容器会自动发现继承了AbstractAnnotationConfigDispatcherServletInitializer的子类,并用它来配置servlet上下文。(用来代替web.xml)

注解类代替web.xml

package com.hxut.rj1192.annoation;
import org.springframework.web.filter.CharacterEncodingFilter;
import org.springframework.web.filter.HiddenHttpMethodFilter;
import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
import javax.servlet.Filter;
//代替web.xml   filter过滤器   spring  springmvc的配置类    dispracture的映射路径
public class webXml extends AbstractAnnotationConfigDispatcherServletInitializer {
    //    指定spring配置类
    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] {SpringConfig.class};
    }
    //    指定springmvc配置类
    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[]{SpringMvcConfig.class};
    }
    //    指定dispracture的映射路径 即url-pattern
    @Override
    protected String[] getServletMappings() {
        return new String[]{"/"};
    }
//注册编码过滤器
    @Override
    protected Filter[] getServletFilters() {
        CharacterEncodingFilter encodingFilter = new CharacterEncodingFilter();
        encodingFilter.setEncoding("UTF-8");
        encodingFilter.setForceRequestEncoding(true);
        HiddenHttpMethodFilter hiddenHttpMethodFilter = new HiddenHttpMethodFilter();
        return new Filter[]{encodingFilter, hiddenHttpMethodFilter};
    }
}

注解类代替Spring-mvc.xml

Spring-mvc配置文件(不管是xml还是注解的类)有如下八个功能

  • 视图解析器
  • 扫描包的范围(组件扫描)
  • view-controller(只返回视图的控制方法)
  • defalut-servlet-handler  静态资源处理
  • mvc注解驱动
  • 文件上传解析器
  • 异常处理
  • 拦截器
package com.hxut.rj1192.annoation;
import com.hxut.rj1192.InterceptorRegistry01;
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.multipart.commons.CommonsMultipartResolver;
import org.springframework.web.servlet.HandlerExceptionResolver;
import org.springframework.web.servlet.HandlerInterceptor;
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;
//1视图解析器   2扫描包的范围(组件扫描)  3view-controller(只返回视图的控制方法)  4defalut-servlet-handler  静态资源处理和
//5  mvc注解驱动  6文件上传解析器   7异常处理   8拦截器
//代替springmvc的配置文件
//扫描包的范围(组件扫描)
@ComponentScan("com.hxut.rj1192")
//开启MVC注解驱动
@EnableWebMvc
@Configuration
public class SpringMvcConfig implements WebMvcConfigurer {
    //配置视图解析器
//    这个注解是将类放进ioc容器中  因为web.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;
    }
//default-servlet configuure
    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        WebMvcConfigurer.super.configureDefaultServletHandling(configurer);
    }
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        InterceptorRegistry01 interceptorRegistry=new InterceptorRegistry01();
//        addPathPatterns("/");是设置拦截的url
//        excludePathPatterns(); 是设置不拦截的url
        registry.addInterceptor(interceptorRegistry).addPathPatterns("/");
    }
//视图控制器
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
      registry.addViewController("/hello").setViewName("succes");
    }
    //配置文件上传解析器
    @Bean
    public CommonsMultipartResolver multipartResolver(){
        CommonsMultipartResolver commonsMultipartResolver=new CommonsMultipartResolver();
        return commonsMultipartResolver;
    }
    //配置异常映射
    @Override
    public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> resolvers) {
        SimpleMappingExceptionResolver exceptionResolver = new SimpleMappingExceptionResolver();
        Properties prop = new Properties();
        prop.setProperty("java.lang.ArithmeticException", "error");
        //设置异常映射
        exceptionResolver.setExceptionMappings(prop);
        //设置共享异常信息的键
        exceptionResolver.setExceptionAttribute("ex");
        resolvers.add(exceptionResolver);
    }
}

全用xml写:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/context https://www.springframework.org/schema/context/spring-context.xsd http://www.springframework.org/schema/mvc https://www.springframework.org/schema/mvc/spring-mvc.xsd">
      <!--2.扫描包的范围(组件扫描)-->
    <context:component-scan base-package="com.hxut.rj1192.zyk"/>
    <!-- 1.配置Thymeleaf视图解析器 -->
    <bean id="viewResolver" class="org.thymeleaf.spring5.view.ThymeleafViewResolver">
        <property name="order" value="1"/>
        <property name="characterEncoding" value="UTF-8"/>
        <property name="templateEngine">
            <bean class="org.thymeleaf.spring5.SpringTemplateEngine">
                <property name="templateResolver">
                    <bean class="org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver">
                        <property name="prefix" value="/WEB-INF/templates/"/>
                        <property name="suffix" value=".html"/>
                        <property name="templateMode" value="HTML5"/>
                        <property name="characterEncoding" value="UTF-8"/>
                    </bean>
                </property>
            </bean>
        </property>
    </bean>
    <!--4.静态资源处理-->
    <mvc:default-servlet-handler/>
    <!--5.mvc注解驱动-->
    <mvc:annotation-driven/>
<mvc:interceptors>
    <bean class="com.hxut.rj1192.zyk.interceptor.interceptor01"/>
</mvc:interceptors>
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
        <property name="exceptionMappings">
            <props>
                <prop key="java.lang.ArithmeticException">error</prop>
            </props>
        </property>
        <property name="exceptionAttribute" value="ex"></property>
    </bean>
<! --3.view-controller-->
<mvc:view-controller path="/testView" view-name="success"></mvc:view-controller>
<! --4.文件上传解析器-->
    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    </bean>
<! --7.异常处理-->
    <bean class="org.springframework.web.servlet.handler.SimpleMappingExceptionResolver">
            <property name="exceptionMappings">
                <props>
                    <prop key="java.lang.ArithmeticException">error</prop>
                </props>
            </property>
            <!--        将错误信息放到ex这个变量中,并放进model中-->
            <property name="exceptionAttribute" value="ex"></property>
        </bean>
<! --8.拦截器-->
 <mvc:interceptors>
        <ref bean="first"></ref>
        <ref bean="second"></ref>
    </mvc:interceptors>
</beans>

拦截器文件

package com.hxut.rj1192;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class InterceptorRegistry01 implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        System.out.println("prehandle 执行");
        return true;
    }
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        System.out.println("posthandle 执行");
        HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
    }
    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        System.out.println("afterhandle 执行");
        HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
    }
}

到此这篇关于分析讲解SpringMVC注解配置如何实现的文章就介绍到这了,更多相关SpringMVC注解配置内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • SpringMVC程序简单实例

    StringMVC程序简单实例 第一步:导入jar包 第二步,在WEB-INF文件夹下创建spring-servlet.xml文件. <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-in

  • 详解SpringMVC在IDEA中的第一个程序

    MVC是模型(model),视图(view),控制器(controller)的简称,属于一种软件设计规范,通过将业务逻辑,数据,显示分离的方法来组织代码,它属于一种架构模式. Model(模型):数据模型,提供要展示的数据,属于领域模型或JavaBean组件,现在一般分离开来:Value Object(数据DAO)和服务层(行为Service).一般会包括数据和业务. View(视图):负责进行模型的展示,即所谓的用户界面. Controller(控制器):接受用户请求,委托给模型进行处理,处理

  • 世界著名程序SpringMVC完整过程

    目录 SpringMVC程序实现 一.什么是 MVC MVC 工作流程 二.什么是 SpringMVC SpringMVC 的特点 三.开发环境准备 四.动手实现 Hello world 1. 创建工程 2. 引入依赖 3. 配置 web.xml 3. 配置 spring 配置文件 4. 编写请求控制器 5. 编写页面文件 6. 启动项目 SpringMVC程序实现 一.什么是 MVC MVC 其实是一种架构思想,将软件按照模型.视图.控制器来划分. M:是指 Model,就是模型层,指工程中的

  • SpringMVC底层执行流程及原理解析

    一个简单的HelloSpringMVC程序 先在web,xml中注册一个前端控制器(DispatcherServlet) <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

  • 微信小程序 websocket 实现SpringMVC+Spring+Mybatis

    微信小程序实现websocket步骤: 后台: 1. 添加maven依赖 2. 创建握手 3. 创建处理器 4. spring配置(xml配置或javabean方式配置任选一种) 微信小程序: 1. 书写连接 java后台 1.添加maven依赖 <!-- websocket --> <dependency> <groupId>org.springframework</groupId> <artifactId>spring-websocket&l

  • 分析讲解SpringMVC注解配置如何实现

    目录 简介 注解类代替web.xml 注解类代替Spring-mvc.xml 简介 使用配置类和注解代替web.xml和SpringMVC配置文件的功能 在Servlet3.0环境中,容器会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置Servlet容器. Spring提供了这个接口的实现,名为SpringServletContainerInitializer,这个类又会查找实现WebApplicationI

  • springmvc注解配置实现解析

    springmvc大大减少了对xml的配置,减少了配置量,以及可以在一个controller类中进行多个请求配置 一.springmvc配置 context:component-scan 开启包扫描,对指定的包进行注解扫描 mvc:annotation-driven开启注解功能 二.controller配置 在类上加上@Controller 在指定的方法上@RequestMapping("/t请求名") 以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们.

  • SpringMVC使用注解配置方式

    目录 SpringMVC注解配置方式 一.创建初始化类 二.spring的配置类 三.WebConfig 配置类 剩余配置 SpringMVC注解配置方式 使用配置类和注解代替 web.xml 和 SpringMVC配置文件 的功能. 一.创建初始化类 在 Servlet3.0 环境中,容器会在类路径中查找实现javax.servlet.ServletContainerInitializer接口的类,如果找到的话就用它来配置 Servlet 容器. Spring 提供了这个接口的实现,名为Spr

  • Spring Boot示例分析讲解自动化装配机制核心注解

    目录 1. 自动化装配介绍 2. Spring Boot 自动化配置UML图解 3. Spring Boot 自动化配置核心注解分析 3.1 @Inherited 3.2 @SpringBootConfiguration 3.3 @EnableAutoConfiguration 3.4 @ComponentScan 3.5 @ConfigurationPropertiesScan 3.6 @AutoConfigurationImportSelector 3.7 @AutoConfiguratio

  • Java泛型与注解全面分析讲解

    目录 1.什么是泛型 2.为何使用泛型 2.1.如何定义泛型 2.2.通配符 2.3.受限泛型 2.4.泛型接口 2.5.泛型方法 3.java高级--注解 3.1.预定义注解 3.2.自定义注解(初级) 3.3.元注解 3.4.自定义注解(高级) 1.什么是泛型 其实我们在使用集合时就用过泛型List<T> 创建一个List对象List<Student> list=new ArrayList():<T>它就是泛型. 所谓的泛型就是在类定义时,不为类中属性和方法指定数据

  • Java @GlobalLock注解详细分析讲解

    目录 GlobalLock的作用 全局锁 为什么要使用GlobalLock 工作原理 GlobalLock的作用 对于某条数据进行更新操作,如果全局事务正在进行,当某个本地事务需要更新该数据时,需要使用@GlobalLock确保其不会对全局事务正在操作的数据进行修改.防止的本地事务对全局事务的数据脏写.如果和select for update组合使用,还可以起到防止脏读的效果. 全局锁 首先我们知道,seata的AT模式是二段提交的,而且AT模式能够做到事务ACID四种特性中的A原子性和D持久性

  • 使用注解开发SpringMVC详细配置教程

    1.使用注解开发SpringMVC 1.新建一个普通的maven项目,添加web支持 2.在pom.xml中导入相关依赖 SpringMVC相关 <dependency> <groupId>org.springframework</groupId> <artifactId>spring-webmvc</artifactId> <version>5.2.8.RELEASE</version> </dependency&

  • Java超详细讲解SpringMVC如何获取请求数据

    目录 1.获得请求参数 1)基本类型参数:​​​​​​​   2)POJO类型参数: 3)数组类型参数   4)集合类型参数   2.请求乱码问题 3.参数绑注解@RequestParam​​​​​​​ 4.获得Restful风格的参数 5.自定义类型转换器 6.获得请求头 7.文件上传 8.小结 1.获得请求参数 客户端请求参数的格式是:name=value&name=value- - 服务器端要获得请求的参数,有时还需要进行数据的封装,SpringMVC可以接收如下类型的参数: 1)基本类型

  • Java分析讲解序列化与字典功能的序列化

    目录 两种解决方案 字典注解定义 字典序列化与返序列化器的实现 字典序列化与反序列工具类 字典转换服务类 字典缓存服务 两种解决方案 前端查询字典数据然后前端转码 后端查询字典值,然后再转码返回给前段. 本文及时针对方案2 进行的改进 目标: 在需要返回给前段的字段上添加指定的注解例如:@DictDesc 则根据该字段定义的值结合注解配置生成 xxxDesc字段并自动赋值为注解属性值所对应的字典描述: 具体使用的技术涉及到jackson序列化与反序列化,其他JSON工具包也类型的效果; 字典注解

  • SpringCloud中分析讲解Feign组件添加请求头有哪些坑梳理

    目录 分析 解决 按官方修改的示例: #MidServerClient.java import feign.Param; import org.springframework.cloud.openfeign.FeignClient; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMethod; @FeignCl

随机推荐