SpringMVC和静态资源

我是java和spring的新手。 我正在尝试制作你好世界的应用程序而不会得到我做错了什么。

这是我的目录结构:

test_app -pom.xml -src --main ---java ----com.example.web -----IndexController.java ---webapp ----static -----img ------example.jpg ----WEB-INF -----web.xml -----dispatcher-servlet.xml -----jsp ------index.jsp 

和来源:web.xml

    Movie Reminder WebApp  contextConfigLocation WEB-INF/dispatcher-servlet.xml   dispatcher org.springframework.web.servlet.DispatcherServlet 1   dispatcher /   org.springframework.web.context.ContextLoaderListener   org.springframework.web.context.request.RequestContextListener   

调度员servlet.xml中:

           

IndexController.java

 package com.example.web; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; @Controller public class IndexController { @RequestMapping(value = "/") public ModelAndView index() { return new ModelAndView("index"); } } 

的index.jsp

     Hello Spring!   " />   

当我部署我的应用程序和请求时,我得到404图像请求

 http://localhost:8081/ --- http 200 ok http://localhost:8081/static/img/example.jpg - http 404 not found 

当我将mvc:resources添加到dispatcher-servlet.xml时

    

并重新编译我得到404 /请求

 http://localhost:8081/ --- http 404 not foundok http://localhost:8081/static/img/example.jpg - http 200 ok 

请帮我弄清楚我做错了什么

只需将这两行添加到dispatcher-servlet.xml

   

以下是default-servlet-handler的文档说:

通过转发到Servlet容器的默认Servlet,配置用于提供静态资源的处理程序。 使用此处理程序允许使用与DispatcherServlet的“/”映射,同时仍使用Servlet容器来提供静态资源。 此处理程序将所有请求转发到默认Servlet。 因此,重要的是它按照所有其他URL HandlerMappings的顺序保持最后。 如果您使用“annotation-driven”元素,或者如果您要设置自定义的HandlerMapping实例,请务必将其“order”属性设置为低于DefaultServletHttpRequestHandler ,即Integer.MAX_VALUE

这是因为servlet映射。 所有进入的请求都被路由到servlet。 但是servlet不知道如何遵守静态资源的请求。 您需要为静态资源添加映射。 有几种不同的方法:

  1. 使用Web服务器提供的方式。 不幸的是,这取决于您拥有的服务器。

  2. 使用可以提供静态资源的servlet。

你使用什么Web服务器?

从Spring 3.0及更高版本开始,您需要在Spring配置中添加以下内容:

  

这告诉您的调度程序servlet如何解析静态资源。 我希望这有帮助。

使用这个,它会一直工作。祝你好运:)

 @Configuration @EnableWebMvc public class WebConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/resources/**").addResourceLocations("/public-resources/").setCachePeriod(31556926);`enter code here` } } 

我在web.xml中配置默认​​servlet以提供所有静态资产,因此只需路由请求即可到达控制器:

  default /resources/*