小工具      在线工具  汉语词典  dos游戏  css  js  c++  java

spring mvc配置类简介及放静态资源释放

# Spring,spring,mvc,java 额外说明

收录于:18天前

配置文件ApplicationContext.xml

基于spring的项目资源都是通过DispatcherServlet作为拦截器,DispatcherServlet是前置控制器,配置在web.xml文件中的。拦截匹配的请求,Servlet拦截匹配规则要自己定义,把拦截下来的请求,依据相应的规则分发到目标Controller来处理,是配置spring MVC的第一步。

Alt

DispatcherServlet主要用于职责调度工作。主要用于控制过程。其主要职责如下:

  1. 文件上传解析,如果请求类型为multipart,则通过MultipartResolver进行文件上传解析;
  2. 通过HandlerMapping,将请求映射到处理器(返回一个HandlerExecutionChain,其中包含一个处理器和多个HandlerInterceptor拦截器);
  3. 通过HandlerAdapter支持多种类型的处理器(HandlerExecutionChain中的处理器);
  4. 通过ViewResolver将逻辑视图名称解析为具体视图实现;
  5. 本地化分析;
  6. 渲染具体视图等;
  7. 如果执行过程中遇到异常将交给HandlerExceptionResolver来解析。
    DispatcherServlet初始化的上下文加载的Bean是只对SpringMVC有效的Bean,
    如Controller、HandlerMapping、HandlerAdapter等等,该初始化上下文只加载Web相关组件。

DispatcherServlet初始化主要做了如下两件事情:
1、初始化SpringMVC使用的Web上下文,并且可能指定父容器为(ContextLoaderListener加载了根上下文);
2、初始化DispatcherServlet使用的策略,如HandlerMapping、HandlerAdapter等。

DispatcherServlet中使用的特殊的Bean:
DispatcherServlet默认使用WebApplicationContext作为上下文,该上下文中特殊的Bean有:
1、Controller:
处理器/页面控制器,做的是MVC中的C的事情,但控制逻辑转移到前端控制器了,用于对请求进行处理;
2、HandlerMapping:
请求到处理器的映射,如果映射成功返回一个HandlerExecutionChain对象
(包含一个Handler处理器(页面控制器)对象、多个HandlerInterceptor拦截器)对象;
如BeanNameUrlHandlerMapping将URL与Bean名字映射,映射成功的Bean就是此处的处理器;
3、HandlerAdapter:
HandlerAdapter将会把处理器包装为适配器,从而支持多种类型的处理器,即适配器设计模式的应用,
从而很容易支持很多类型的处理器;
如SimpleControllerHandlerAdapter将对实现了Controller接口的Bean进行适配,
并且按处理器的handleRequest方法进行功能处理;
4、ViewResolver:
ViewResolver将把逻辑视图名解析为具体的View,通过这种策略模式,很容易更换其他视图技术;
如InternalResourceViewResolver将逻辑视图名映射为jsp视图;
5、LocalResover:
本地化解析,因为Spring支持国际化,因此LocalResover解析客户端的Locale信息从而方便进行国际化;
6、ThemeResovler:
主题解析,通过它来实现一个页面多套风格,即常见的类似于软件皮肤效果;
7、MultipartResolver:
文件上传解析,用于支持文件上传;
8、HandlerExceptionResolver:
处理器异常解析,可以将异常映射到相应的统一错误界面,从而显示用户友好的界面(而不是给用户看到具体的错误信息);
9、RequestToViewNameTranslator:
当处理器没有返回逻辑视图名等相关信息时,自动将请求URL映射为逻辑视图名;

在这里插入图片描述

释放SSM配置文件资源
SSM项目是离不开配置文件的,配置文件修改也是最简单的一种修改方式:Spring mvc释放静态资源的方法

通过配置文件添加配置信息覆盖默认的释放静态资源。

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

       <property name="prefix" value="/"></property>

       <property name="suffix" value=".jsp"></property>

</bean>

配置中添加这个这个在返回时View时更加方便,例如return "/index.jsp"可以直接写成return "index"

基于配置类WebMvcConfigurer

该配置类是spring提供的一种配置方式,采用JavaBean的方式替代传统的基于xml的配置来对spring框架进行自定义的配置。因此,在spring boot提倡的基于注解的配置,采用“约定大于配置”的风格下,当需要进行自定义的配置时,便可以使用WebMvcConfigurer接口或者继承该接口,或者其实现类WebMvcConfigurerAdapter这个抽象类等等,通过JavaBean来实现需要的配置。

换句话说,WebMvcConfigurer是ApplicationContext.xml的配置版本。

除了上面的配置文件也可以使用注解来更改配置,WebMvcConfigurer是MVC的配置类接口。
在这里插入图片描述
该接口定义了许多方法用于修改配置,源码如下:

public interface WebMvcConfigurer {
    
    void configurePathMatch(PathMatchConfigurer var1);
 
    void configureContentNegotiation(ContentNegotiationConfigurer var1);
 
    void configureAsyncSupport(AsyncSupportConfigurer var1);
 
    void configureDefaultServletHandling(DefaultServletHandlerConfigurer var1);
 
    void addFormatters(FormatterRegistry var1);
 
    void addInterceptors(InterceptorRegistry var1);
 
    void addResourceHandlers(ResourceHandlerRegistry var1);
 
    void addCorsMappings(CorsRegistry var1);
 
    void addViewControllers(ViewControllerRegistry var1);
 
    void configureViewResolvers(ViewResolverRegistry var1);
 
    void addArgumentResolvers(List<HandlerMethodArgumentResolver> var1);
 
    void addReturnValueHandlers(List<HandlerMethodReturnValueHandler> var1);
 
    void configureMessageConverters(List<HttpMessageConverter<?>> var1);
 
    void extendMessageConverters(List<HttpMessageConverter<?>> var1);
 
    void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> var1);
 
    void extendHandlerExceptionResolvers(List<HandlerExceptionResolver> var1);
 
    Validator getValidator();
 
    MessageCodesResolver getMessageCodesResolver();
}

可以通过该接口添加一些自定义的拦截器,例如跨域设置、类型转化器等,下面是其常用方法
在这里插入图片描述

 /* 拦截器配置 */
void addInterceptors(InterceptorRegistry var1);
/* 视图跳转控制器 */
void addViewControllers(ViewControllerRegistry registry);
/** *静态资源处理 **/
void addResourceHandlers(ResourceHandlerRegistry registry);
/* 默认静态资源处理器 */
void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer);
/** * 这里配置视图解析器 **/
void configureViewResolvers(ViewResolverRegistry registry);
/* 配置内容裁决的一些选项*/
void configureContentNegotiation(ContentNegotiationConfigurer configurer);
/** 解决跨域问题 **/
public void addCorsMappings(CorsRegistry registry) ;

继承WebMvcConfigurer后,可以在该类中自定义配置,也可以继承其实现类WebMvcConfigurerAdapter来扩展更多方法。不过Spring 5.0已经放弃了WebMvcConfigurerAdapter,但是WebMvcConfigurer现有的方法也满足了基本的使用。

和配置文件注册加载Bean一样,先定义后依赖注入在自动装配。通过WebMvcConfigurer的继承类实现也是同样的步骤:

//定义拦截器
public class LoginInterceptor extends HandlerInterceptorAdapter {
    

    private static final Logger logger = LoggerFactory.getLogger(LoginInterceptor.class);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
    
        logger.info("-----------------------------");
        logger.info(request.getRequestedSessionId());
        logger.info("-----------------------------");
        return true;
    }
}
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {
    
    /* * 拦截器配置*/
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
    
        registry.addInterceptor(new LoginInterceptor()).addPathPatterns("/**");
}
//跨域CORS配置
 public void addCorsMappings(CorsRegistry registry) {
    
     super.addCorsMappings(registry);
     registry.addMapping("/**")
             .allowedHeaders("*")
             .allowedMethods("POST","GET")
             .allowedOrigins("http://...")
             .allowCredentials(true);
 }

//配置ViewController

/** * 视图控制器配置 * @param registry */
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
    
        super.addViewControllers(registry);
        registry.addViewController("/").setViewName("forward:/index.html");
    }



//配置ViewResolver
/** * 配置请求视图映射 * * @return */
    @Bean
    public InternalResourceViewResolver resourceViewResolver() {
    
        InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
        //请求视图文件的前缀地址
        internalResourceViewResolver.setPrefix("/WEB-INF/jsp/");
        //请求视图文件的后缀
        internalResourceViewResolver.setSuffix(".jsp");
        return internalResourceViewResolver;
    }

    @Override
    public void configureViewResolvers(ViewResolverRegistry registry) {
    
        super.configureViewResolvers(registry);
        registry.viewResolver(resourceViewResolver());
    }


//配置Formatter
@Override
    public void addFormatters(FormatterRegistry registry) {
    
        registry.addFormatter(new Formatter<Date>() {
    
            @Override
            public Date parse(String date, Locale locale) {
    
                return new Date(Long.parseLong(date));
            }

            @Override
            public String print(Date date, Locale locale) {
    
                return Long.valueOf(date.getTime()).toString();
            }
        });
    }

在ssm项目中我们知道控制器对静态资源的拦截是通过继承WebMvcConfigurationSupport
WebMvcConfigurationSupport是webmvc的配置类,如果在springboot项目中,有配置类继承了WebMvcConfigurationSupport,那么webmvc的自动配置类WebMvcAutoConfiguration就会失效。

该类具有配置功能,例如释放静态资源:

public class WebMvcConfiguration extends WebMvcConfigurationSupport {
    

    private static final String[] CLASSPATH_RESOURCE_LOCATIONS = {
    
            "classpath:/META-INF/resources/", "classpath:/resources/",
            "classpath:/static/", "classpath:/public/"
    };

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    
        if (!registry.hasMappingForPattern("/webjars/**")) {
    
            registry.addResourceHandler("/webjars/**").addResourceLocations(
                    "classpath:/META-INF/resources/webjars/");
        }
        if (!registry.hasMappingForPattern("/**")) {
    
            registry.addResourceHandler("/**").addResourceLocations(
                    CLASSPATH_RESOURCE_LOCATIONS);
        }

    }
}


其他常用方法:

@Configuration
public class MyConfig extends WebMvcConfigurationSupport{
    
    
    //自定义的一个拦截器
    @Autowired
    HttpInterceptor httpInterceptor;
    
    //定义时间格式转换器
    @Bean
    public MappingJackson2HttpMessageConverter jackson2HttpMessageConverter() {
    
        MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter();
        ObjectMapper mapper = new ObjectMapper();
        mapper.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false);
        mapper.setDateFormat(new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"));
        converter.setObjectMapper(mapper);
        return converter;
    }

    //添加转换器
    //配置springmvc返回数据时 输出数据的格式,这里只配置了时间的输出格式
    @Override
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    
        //将我们定义的时间格式转换器添加到转换器列表中,
        //这样jackson格式化时候但凡遇到Date类型就会转换成我们定义的格式
        converters.add(jackson2HttpMessageConverter());
    }

    @Override
    protected void addInterceptors(InterceptorRegistry registry) {
    
        // TODO Auto-generated method stub
        //将我们自定义的拦截器注册到配置中 
        registry.addInterceptor(httpInterceptor).addPathPatterns("/**");
        super.addInterceptors(registry);
    }   
	

	/** * 防止@EnableMvc把默认的静态资源路径覆盖了,手动设置的方式 * 配置了静态资源访问 * 还能配置视图解析 访问服务器上的资源 * @param registry */
    @Override
    protected void addResourceHandlers(ResourceHandlerRegistry registry) {
    
        // 解决静态资源无法访问
        registry.addResourceHandler("/**").addResourceLocations("classpath:/static/");
        //配置视图解析,把url中后面带/image/***的路径映射到c盘photo文件中的资源
       	registry.addResourceHandler("/image/**").addResourceLocations("file:C://photo/");
        super.addResourceHandlers(registry);
    }

    //配置服务器跨域请求被允许
    @Override
    public void addCorsMappings(CorsRegistry registry) {
    
        registry.addMapping("/**")
                .allowedOrigins("*")
                .allowedMethods("GET", "POST", "PUT", "OPTIONS", "DELETE", "PATCH")
                .allowCredentials(true).maxAge(3600);
    }
}

. . .

相关推荐

额外说明

关系型数据库和NoSql非关系型数据库浅析

1 关系数据库    1.1 关系数据库的简介    支持关系模型的数据库系成之为关系数据库,是目前各类数据库中使用最为广泛的数据库系统。关系数据库在经过二十几年的发展,已经变的功能强大,使用广泛,产品成熟的数据库系统,现在使用主流的数据库都为关系型数据

额外说明

Navicat 所连接数据库保存位置

用新数据库做演示:  第一步:创建数据库:         2.(设置位置):建议: 每连接创建新数据库,在Mysql下创建子目录。                 如:D :\ Mysql \ 数据库名称           第二步:开始创建:    

额外说明

[二] java--> SpringBoot @注解大全总结(持续增肥中)[配合一使用]

目录 常用的注解大全  1. @RestController  ---->直接json 2. @controller ---> jsp/html  问: @RestController与@Controller的区别???? 4. @Value 为属性赋值

额外说明

异步方法 理解(demo附代码)

异步方法是什么? 每次启动程序时,系统会⾃动在内存中创建⼀个进程。进程是构成运⾏程序的资源的集合。这些资源包括虚地址空间、⽂件句柄和许多其他程序运 ⾏所需的资源。 在进程的内部,系统会创建⼀个称为线程的内核(Kerne)的对象,它代表了真正的运⾏程序。线

额外说明

VC++获取Widnows操作系统版本(附源码)

VC++常用功能开发汇总(专栏文章列表,欢迎订阅,持续更新...)https://blog.csdn.net/chenlycly/article/details/124272585C++软件异常排查从入门到精通系列教程(专栏文章列表,欢迎订阅,持续更新.

额外说明

Java实现:折半查找算法(递归、分治法)

Java实现:折半查找算法(递归)(分治法) 文章目录 Java实现:折半查找算法(递归)(分治法) 1. 问题 2. 解决方案 2.1. 分治法 2.2. 递归算法 2.3. 问题分析 3. 实现代码 4. 执行结果 1. 问题 递归的折半查找算法。

额外说明

阿里云centos7.4安装jdk和Tomcat的坑 阿里云自带jdk的坑 wget 带来的坑

这里写目录标题 进坑 阿里云自带jdk的坑 wget 带来的坑 避免上面的坑 winscp传包 配置环境变量 生效配置环境 安装成功 总结 进坑 要想了解这些坑,首先你的有阿里云服务器,阿里云服务器的官网地址是:https://www.aliyun.co

额外说明

【云原生】持续集成和部署(Jenkins)

文章目录 使用 helm 安装 Jenkins 到k8s集群,配置CI/CD CI/CD CI(Continuous Integration)持续集成 CD (Continuous Delivery)持续交付和(Continuous Deployment

额外说明

【C++】win 10:VC 6.0 中文版下载、安装、使用

目录 一、下载(win 10) 二、安装(win 10) 三、使用 (1)文件:新建工程 (2)文件:新建文件 (3)输入源程序代码(示例) (4)运行程序 (5)保存文件 一、下载(win 10) 我的资源下载地址:https://download.c

额外说明

解决Windows系统文件夹CertEnroll.dll文件丢失问题

其实很多用户玩单机游戏或者安装软件的时候就出现过这种问题,如果是新手第一时间会认为是软件或游戏出错了,其实并不是这样,其主要原因就是你电脑系统的该dll文件丢失了或没有安装一些系统软件平台所需要的动态链接库,这时你可以下载这个CertEnroll.dll

ads via 小工具