使用 Spring 3 提供静态内容

Posted

技术标签:

【中文标题】使用 Spring 3 提供静态内容【英文标题】:Serving static content with Spring 3 【发布时间】:2011-10-14 08:55:37 【问题描述】:

我正在尝试使用 Spring 3 的资源映射功能,但它似乎不起作用。这是我所拥有的:

<servlet>
    <servlet-name>aaa</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
    <servlet-name>aaa</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

在我的 web.xml 中

然后在我的 aaa-servlet.xml 我有以下内容:

<resources mapping="/resources/**" location="/resources/" />

我正在像这样访问 jsp 中的内容:

<link href="<c:url value="/resources/css/blueprint/screen.css" />" rel="stylesheet" type="text/css">

我一直在阅读的所有内容都表明我已正确设置了所有内容,但它无法正常工作。我正在使用 weblogic 服务器,并且在启动时它会映射 /resources/ 文件夹。

任何帮助将不胜感激!

aaa-servlet.xml 全文:

<?xml version="1.0" encoding="UTF-8"?>
<beans:beans xmlns="http://www.springframework.org/schema/mvc"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:beans="http://www.springframework.org/schema/beans" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xsi:schemaLocation="
    http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd">

<!-- Enables the Spring MVC @Controller programming model -->
<annotation-driven />

<!-- Handles HTTP GET requests for /resources/** by efficiently serving up static resources in the $webappRoot/resources directory -->
<resources mapping="/resources/**" location="/resources/" />



<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/jsps directory -->
<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <beans:property name="prefix" value="/WEB-INF/jsps/" />
    <beans:property name="suffix" value=".jsp" />
</beans:bean>

<beans:bean id="messageSource"  
    class="org.springframework.context.support.ResourceBundleMessageSource">  
    <beans:property name="basename" value="messages"/>  
</beans:bean>  

<!-- Imports user-defined @Controller beans that process client requests -->
<beans:import resource="controllers.xml" />

controllers.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:mvc="http://www.springframework.org/schema/mvc"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:util="http://www.springframework.org/schema/util"
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.0.xsd
    http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.0.xsd
    http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.0.xsd">

<!-- Scans within the base package of the application for @Components to configure as beans -->
<context:component-scan base-package="com.app.controller" />

启动日志:

INFO : org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/**] onto handler 'org.springframework.web.servlet.resource.DefaultServletHttpRequestHandler#0'
INFO : org.springframework.web.servlet.handler.SimpleUrlHandlerMapping - Mapped URL path [/resources/**] onto handler 'org.springframework.web.servlet.resource.ResourceHttpRequestHandler#0'

【问题讨论】:

你试过加&lt;mvc:annotation-driven/&gt;吗? 您是否尝试过仅使用没有 c:url 的普通链接? @Jack:在这种情况下,mvc:annotation-driven 的目的应该是什么? @Ralph 我不完全确定:P。但我知道我遇到了一个非常相似的问题,添加&lt;mvc:annotation-driven/&gt; 神奇地解决了它。这里有更详细的描述:static.springsource.org/spring/docs/3.0.x/… 我已经使用 我得到错误 404--未找到 我已经尝试用常规链接替换 ​​c:url 如果我尝试将链接 localhost:7001/ XXX/resources/css/.....css直接进入浏览器 【参考方案1】:

解决了!

看起来 ResourceHttpRequestHandler 中有一个错误,它只出现在 Weblogic 中。

解决问题:

删除

<resources mapping="/resources/**" location="/resources/"/>

添加

<default-servlet-handler/>

我知道你们中的一些人建议使用 default-servlet-handler,但必须删除资源映射才能使其工作!

【讨论】:

so...如果必须删除资源映射,如何将目录映射为静态资源?【参考方案2】:

您正在将您的应用映射到根上下文,因此您可能应该包括

<mvc:default-servlet-handler/>

在你的 mvc 配置中。查看spring docs 中的 15.12.5。当我的调度程序 servlet 映射到 / 时,如果没有该设置,我无法让 mvc:resources 工作。至少,我记得几个月前在我的项目中配置它时,我似乎记得必须这样做。

【讨论】:

我实际上已经尝试过使用这个,尽管拥有这个并将服务器映射到 / 不是多余的吗?无论哪种方式,这条线都没有区别。 这根本不是多余的。仅当您将 dispatcherservlet 映射到根上下文时才需要它。文档中的第一行声明“此标记允许将 DispatcherServlet 映射到“/”(从而覆盖容器默认 Servlet 的映射),同时仍允许由容器的默认 Servlet 处理静态资源请求。在没有任何“default-servlet-name”的情况下使用它会根据容器使用合理的默认值,但如果您有其他用于默认 servlet 的内容,您也可以对其进行配置。【参考方案3】:

尝试替换您的&lt;resources mapping="/resources/**" location="/resources/" /&gt;

<mvc:annotation-driven />
<mvc:resources mapping="/resources/**" location="/resources/" />

【讨论】:

我已经在使用 我得到错误 404--未找到 我已经尝试用常规链接替换 ​​c:url 如果我尝试直接放置链接 localhost:7001/XXX/resources/css/.....css 会出现同样的错误进入浏览器 &lt;%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%&gt; &lt;%@taglib prefix="form" uri="http://www.springframework.org/tags/form"%&gt; &lt;%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %&gt; &lt;%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %&gt; &lt;!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"&gt; &lt;html&gt; &lt;head&gt; &lt;meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"&gt; &lt;title&gt;$title&lt;/title&gt; &lt;link href="&lt;c:url value="/resources/css/blueprint/screen.css" /&gt;" rel="stylesheet" type="text/css"&gt; &lt;/head&gt; 如果我查看源代码,css 链接会生成以下内容:&lt;link href="/XXX/resources/css/blueprint/screen.css" rel="stylesheet" type="text/css"&gt; 其中 XXX 是应用程序上下文。

以上是关于使用 Spring 3 提供静态内容的主要内容,如果未能解决你的问题,请参考以下文章

使用 Spring Boot 从不同端口提供 REST API 和静态内容

尽管使用 @RequestMapping("**") 在 Spring Boot 中提供静态内容

Spring boot:提供公共和私有(受限)静态内容

Spring-Boot Jersey:允许 Jersey 提供静态内容

Spring Boot with Security不提供我的静态内容

Spring Boot 2 和 Security With JWT 无法提供 Angular 构建的静态内容