2

我无法让我的 spring mvc webapp 工作。我正在使用带有嵌入式码头服务器的 Spring MVC。

问题是我的 mvc:resources 标签不起作用,我不知道为什么。

以下是标签:

<mvc:resources mapping="/css/**" location="/css/"/>
<mvc:resources mapping="/js/**" location="js/"/>

我的目录结构:

  • 源代码
    • 主要的
      • 爪哇
      • 资源
        • 元信息
          • 应用程序上下文.xml
          • 网络上下文.xml
      • 网络应用
        • css
          • main.css
        • js
          • main.js

现在,当我转到 时http://localhost:8080/css/main.css,我在调试输出中看到了这一点:

Looking up handler method for path /css/main.css
Did not find handler method for [/css/main.css]
URI Template variables for request [/css/main.css] are {}
Mapping [/css/main.css] to HandlerExecutionChain with handler [org.springframework.web.servlet.resource.ResourceHttpRequestHandler@223c78ba] and 1 interceptor
Last-Modified value for [/css/main.css] is: -1
Trying relative path [main.css] against base location: ServletContext resource [/css/]
No matching resource found - returning 404

为什么这不起作用?是我的目录结构,还是我错过了一些配置?

我会很感激你的帮助。

编辑更多信息

我使用 Maven 来构建一个带有 shade 插件的胖罐子。我现在在我的 pom.xml 中添加了这个

<resources>
    <resource>
        <directory>src/main/webapp</directory>
    </resource>
    <resource>
        <directory>src/main/resources</directory>
    </resource>
</resources>

现在我的最终 jar 确实包含 css 目录,但仍然没有运气。

这是我启动嵌入式码头服务器的代码

int port = config.getInt("server.port");

final Server server = new Server();
final ServerConnector serverConnector = new ServerConnector(server);
serverConnector.setPort(port);
server.setConnectors(new Connector[]{serverConnector});

final DispatcherServlet servlet = new DispatcherServlet();
servlet.setContextConfigLocation("classpath:META-INF/web-context.xml");

ServletContextHandler context = new ServletContextHandler();
context.setContextPath("/");
context.addServlet(new ServletHolder("defaultServlet", servlet), "/*");

HandlerCollection handlers = new HandlerCollection();
handlers.setHandlers(new Handler[]{context, new DefaultHandler()});
server.setHandler(handlers);

server.start();
server.join();
4

3 回答 3

3

您可能需要为您的 servlet 上下文进行一些额外的配置,就像这样,以便在您通过正在构建的 jar 运行它时正确设置类路径内容:

final Resource base = Resource.newClassPathResource(".");

if (base != null) {
    context.setBaseResource(base);
} else {    
    // running in a jar
    final URI uri = Service.class.getProtectionDomain().getCodeSource().getLocation().toURI();
    context.setBaseResource(Resource.newResource("jar:" + uri + "!/"));
}
于 2013-04-24T01:06:09.717 回答
0

确保您的应用程序上下文中提到了 mvc 架构 xsd。

xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd   

带有 mvc 的基本应用程序 xml 文件,上下文模式应如下所示:

<beans:beans xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd   http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd   http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-3.1.xsd   http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">

//your beans go here

</beans:beana>
于 2013-04-21T08:35:54.803 回答
0

也许您缺少 url 中的上下文路径?

http://localhost:8080/<<context>>/css/main.css
于 2013-04-20T18:47:27.443 回答