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

无法映射静态资源,即。JS,CSS,SpringMVC中的图像

柳珂
2023-03-14

我不确定这些静态资源是如何加载的,但是在我添加了一个新的控制器映射后,我没有在日志中找到静态资源警告消息的映射。

GET/testproject/org/css/style没有映射。css

让我先解释一下我的项目配置,以便更容易理解问题。

所有JSP位置(视图具有不同的文件夹,用于为不同的模块分隔JSP)

src/main/java/webapp/views/org/*.jsp  
src/main/java/webapp/views/*.jsp

静态资源定位

src/main/java/resources/static/css/*.css  
src/main/java/resources/static/js/*.js  
src/main/java/resources/static/images/*.jpg  
src/main/java/resources/static/fonts/*.ttf

应用性质

spring.mvc.view.prefix=/WEB-INF/views/
spring.mvc.view.suffix=.jsp
server.servlet.contextPath=/testproject

在application.properties添加最后一个配置后,现在我的任何视图页面的应用程序网址都会像

http://localhost:8080/testproject/dashboard

上述URL的控制器映射为:

@RequestMapping(value = "/dashboard", method = RequestMethod.GET)
    public String dashboard(ModelMap map) {return "org/dashboard";}

通过上述配置,静态资源路径的形成如下

http://localhost:8080/testproject/css/style.css

通过上面的配置,我可以使用下面的代码加载CSS文件

<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core"%>
<link href="<core:url value="css/style.css"/>" rel="stylesheet" type="text/css" media="all">

现在,由于我在单独的文件夹组织下定义了仪表板页面,所以我想更改控制器映射,使其与文件夹结构完全匹配

Spring Security配置,用于定义可以访问组织模块页面的用户角色

.蚂蚁匹配器(“/org/**”)。访问(“hasRole('ROLE_ORG')”)。anyRequest()

更改我的控制器映射后(从 /dashboard到 /org/dashboard)

@RequestMapping(value = "/org/dashboard", method = RequestMethod.GET)
    public String dashboard(ModelMap map) {return "org/dashboard";}

现在,Spring Security工作正常。它不允许在未登录或登录用户具有不同角色的情况下直接访问仪表板。

但是现在我的静态资源URL正在更改

http://localhost:8080/testproject/org/css/style.css

早些时候这个网址是

http://localhost:8080/testproject/css/style.css(工作)

我试图解决的问题

WebMvcConfig。JAVA

@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // TODO Auto-generated method stub
        registry.addResourceHandler("/res/**").addResourceLocations("/resources/static/");
        WebMvcConfigurer.super.addResourceHandlers(registry);
    }
}

已在应用程序中添加此属性。性质

spring.mvc.static-path-pattern=/resources/**

现在在JSP中,我尝试使用下面的代码访问CSS,但没有一个有效

<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core"%>
<link href="<core:url value="css/style.css"/>" rel="stylesheet" type="text/css" media="all">
<link href="<core:url value="resources/css/style.css"/>" rel="stylesheet" type="text/css" media="all">
<link href="<core:url value="res/css/style.css"/>" rel="stylesheet" type="text/css" media="all">

所以我在开发者工具中检查了为上面所有代码PFB创建的路径

<link href="<core:url value="css/style.css"/>" rel="stylesheet" type="text/css" media="all">

http://localhost:8080/testproject/org/css/style.css

<link href="<core:url value="resources/css/style.css"/>" rel="stylesheet" type="text/css" media="all">

http://localhost:8080/testproject/org/resources/css/style.css

<link href="<core:url value="res/css/style.css"/>" rel="stylesheet" type="text/css" media="all">

http://localhost:8080/testproject/org/res/css/style.css

让我知道我到底做错了什么。我知道上面的代码会工作,但有些配置我丢失或配置错误。

我试图捕捉所有可能导致此问题的细节。如果需要更多细节,请告诉我。

我创建了一个简单的SpringMVC项目,可以从下面的链接下载

https://drive.google.com/file/d/1-WqLnuEH2BffvcwBil7QcKcxqPay214Y/view?usp=sharing

毫无疑问

静态资源加载通常有以下代码,有或没有MvcWebC中的资源处理程序映射onfig.java只是取消注释第4行

我所做的唯一更改是css/test之前的value parm中的“/”。css。

<link href="<core:url value="/css/test.css"/>" rel="stylesheet" type="text/css" media="all">

但添加资源处理程序后,我看到404错误,帮我解决这个问题

@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // TODO Auto-generated method stub
        WebMvcConfigurer.super.addResourceHandlers(registry);
        
        registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/static/css");
    }

JSP更改

<link href="<core:url value="/resources/test.css"/>" rel="stylesheet" type="text/css" media="all">

请任何人解释一下所有这些映射之间的区别,或者让我知道其中任何一个是错误的。

假设src/main/java/resources/static/css/*。css是静态文件夹结构。

registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/static/css");

registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/");

registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");

以下内容将起作用,因为我已经更改了处理程序映射(myresources),而不是文件夹结构

registry.addResourceHandler("/myresources/**").addResourceLocations("classpath:/resources/static/css");

什么时候应该在位置中使用类路径?

registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/static/css");

共有2个答案

呼延承平
2023-03-14

必须定义全局静态资源处理程序。看看你的网站。xml添加与安全配置链接的筛选器(根据需要,也可以不添加)。或者在WebMvcConfig中。类文件。

编辑:从中添加示例https://www.baeldung.com/spring-mvc-static-resources

方法1)在您的web中。xml或应用程序。xml配置:

<mvc:resources mapping="/assets/**" location="/assets/" />

在你看来。jsp:

<c:url value="/assets/myCss.css" />

方法2)

spring.mvc.static-path-pattern=/assets/**

然后你只要把“/”放在前面,解析器就会处理这项工作。

方法3)更改默认静态资源位置

spring.resources.static-locations=classpath:/assets/,classpath:/static-files

4)方法

    @Configuration
    @EnableWebMvc
    public class MvcConfig implements WebMvcConfigurer {
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry
              .addResourceHandler("/assets/**")
              .addResourceLocations("/assets/");    
        }
    }

重要提示:使用Spring Security(以及其他安全LIB),您必须为静态资源提供安全通行证:

<intercept-url pattern="/assets/**" access="permitAll" />

上一个答案:也许你的路径必须是绝对的,以解决你的静态资源。否则,您的处理程序配置将无法解决它们:

<%@ taglib prefix="core" uri="http://java.sun.com/jsp/jstl/core"%>
<link href="<core:url value="/res/css/style.css"/>" rel="stylesheet" type="text/css" media="all">
湛钊
2023-03-14

下面的代码对我有用

registry.addResourceHandler("/res/**").addResourceLocations("classpath:/static/");

<link href="<core:url value="/res/css/test.css" />" rel="stylesheet" type="text/css">
registry.addResourceHandler("/resource/**").addResourceLocations("classpath:/static/");

<link href="<core:url value="/resource/css/test.css" />" rel="stylesheet" type="text/css">

他们中没有一个在下面给出的条件下工作

registry.addResourceHandler("/resources/**").addResourceLocations("classpath:/resources/static/css");
registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
registry.addResourceHandler("/res/**").addResourceLocations("/static/");
registry.addResourceHandler("/res/**").addResourceLocations("/resources/");
 类似资料:
  • 主要内容:WebJars 映射,默认静态资源映射在 Web 应用中会涉及到大量的静态资源,例如 JS、CSS 和 HTML 等。我们知道,Spring MVC 导入静态资源文件时,需要配置静态资源的映射;但在 SpringBoot 中则不再需要进行此项配置,因为 SpringBoot 已经默认完成了这一工作。 Spring Boot 默认为我们提供了 3 种静态资源映射规则: WebJars 映射 默认资源映射 静态首页(欢迎页)映射 WebJ

  • 我有以下servlet映射- 我的图像链接在html是"/图像/文件夹/ImageName.jpg"-这些图像给我一个404,而如果更改链接到"/图像/ImageName.jpg"和移动图像直接下的图像文件夹,它得到我的图像。 我是否需要以任何方式修改我的servlet映射以考虑层次结构?

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

  • 我使用Spring Boot1.3.3我的应用程序资源存在于src/main/Resources/静态下例如:src/main/Resources/静态/index.html我试图映射我的静态资源与前缀像/*/资源/** 以便它匹配网址像 /main/resource/**和 /app/resource/** 当我尝试使用以下代码时 当我请求域:8080/app/resource/index时,它

  • 在发布帖子时,我在网络控制台上看到了上述错误。 源地图错误:请求失败,状态404资源URL:超文本传输协议://{mysite}/js/app.js源地图URL:bootstrap.js.map 我的资源/js/app.js是这样的 还有这个网页。js看起来像这样 我的部分工作输出 我的错误是这样的

  • Hi在运行我的java类时得到以下错误:创建会话工厂失败,出现异常org.hibernate.mappingException:无法从资源中读取映射:software.hbm.xml org.hibernate.cfg.configuration.addResource(configuration.java:485),在org.hibernate.cfg.cfiguration.parsemapp