当前位置: 首页 > 知识库问答 >
问题:

针对静态资源定位,使用@EnableWebMvc和WebMvcConfigrerAdapter的Spring MVC配置会导致“转发:”和“重定向:”问题

骆利
2023-03-14

我有一个Spring Boot hello world for web和一些配置混乱:

Spring版本:1.2.6。释放

我的项目结构:

我需要提供一些静态内容,因此我决定在一些自定义WebConfig类中重新定义此类内容的源目录(用于学习目的):

javadoc for@EnableWebMvc说:

将此注释添加到@Configuration类将从WebMvcConfigurationSupport导入Spring MVC配置

要自定义导入的配置,请实现接口WebMvcConfigurer,或者更可能扩展空方法基类WebMVCConfigureAdapter并覆盖单个方法,例如:

于是下一个配置类诞生了:

@Configuration
@EnableWebMvc
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/r/**").addResourceLocations("classpath:/static/r/");
        registry.addResourceHandler("/favicon.ico").addResourceLocations("classpath:/static/r/favicon.ico");
    }
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("forward:/r/diploma/index.html");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
        super.addViewControllers(registry);
    }
}

如果运行应用程序并尝试访问http://localhost:8080/我得到下一个例外:

javax.servlet.ServletException: Could not resolve view with name 'forward:/r/diploma/index.html' in servlet with name 'dispatcherServlet'

但是如果我从我的网络配置中删除@EnableWebMvc,我就得到了我的索引。浏览器中的html。那么,这种行为的原因是什么呢?

事实上,我有一个生产项目,我用它作为例子来研究,它有两个@EnableWebMvc

共有1个答案

牛嘉谊
2023-03-14

您应该添加一个viewsolver来解析WebConfig中的视图,如下所示:

@Bean
public InternalResourceViewResolver defaultViewResolver() {
    return new InternalResourceViewResolver();
}

当您添加@EnableWebMvc时,您将关闭所有Spring Boot的Web自动配置,这些配置会自动为您配置这样一个解析器。通过删除注释,自动配置将再次打开,自动配置的ViewResolver解决了这个问题。

 类似资料:
  • 本文向大家介绍SpringMVC访问静态资源的方法,包括了SpringMVC访问静态资源的方法的使用技巧和注意事项,需要的朋友参考一下 在SpringMVC中常用的就是Controller与View。但是我们常常会需要访问静态资源,如html,js,css,image等。 默认的访问的URL都会被DispatcherServlet所拦截,但是我们希望静态资源可以直接访问。该肿么办呢? 在配置文件:

  • Fes.js 基于 html-webpack-plugin在新窗口打开 实现的模板功能,默认 HTML模板 是: <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta http-equiv="X-UA-Compatible" content="IE=edge"> <meta name="viewp

  • 我使用Spring MVC和spring security。我面临的问题是如何在jsp文件中建立静态资源路径。 假设我的应用程序部署在上下文名称 中 假设我想在所有jsp中包含一个文件,所以我为它编写,就像这个。现在会发生什么,如果我访问以下网址: > localhost/ctxt/dashboard(cssOK-浏览器中css的最终url变成=localhost/ctxt/static/css/

  • 我正在尝试使用spring Boot运行一个web应用程序。 将密码映射为硬编码值。 我的问题是:当应用程序运行并且在主类上使用注释时,只要它命中URL就会发生以下异常: javax.servlet.ServletException:在org.springframework.web.servlet.dispatcherservlet.render(dispatcherservlet.java:13

  • 本文向大家介绍java转发和重定向的区别,包括了java转发和重定向的区别的使用技巧和注意事项,需要的朋友参考一下 重定向和转发有一个重要的不同:当使用转发时,JSP容器将使用一个内部的方法来调用目标页面,新的页面继续处理同一个请求,而浏览器将不会知道这个过程。 与之相反,重定向方式的含义是第一个页面通知浏览器发送一个新的页面请求。因为,当你使用重定向时,浏览器中所显示的URL会变成新页面的URL

  • 在这上面开个头。文件说明: 默认情况下,Spring Boot将提供来自类路径中名为 /static(或 /public或 /resources或 /META-INF/resources)的目录或ServletContext根目录的静态内容。 并创建一个目录,将静态资源放在那里。当我运行应用程序时,我只得到404。当我删除EnableWebMvc时,资源将按预期提供。 在中添加: 所以我的问题是: