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不知道如何遵守静态资源的请求。 您需要为静态资源添加映射。 有几种不同的方法:
-
使用Web服务器提供的方式。 不幸的是,这取决于您拥有的服务器。
-
使用可以提供静态资源的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/*