具有嵌入式jetty服务器的Spring MVC资源

时间:2013-04-20 18:19:32

标签: java spring spring-mvc

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

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

以下是标签:

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

我的目录结构:

  • SRC
      • 的java
      • 资源
        • META-INF
          • 应用context.xml中
          • 网络context.xml中
      • web应用
        • 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用阴影插件构建一个胖罐。我现在在我的pom.xml中添加了这个

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

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

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

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();

3 个答案:

答案 0 :(得分: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 + "!/"));
}

答案 1 :(得分:0)

也许您错过了网址中的上下文路径?

http://localhost:8080/<<context>>/css/main.css

答案 2 :(得分:0)

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

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

基本应用程序xml文件与mvc,上下文模式应该像:

<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>