Spring MVC Java WebMvcConfigurerAdapter.addResourceHandlers
Spring MVC Java WebMvcConfigurerAdapter.addResourceHandlers
我正在查看具有以下 Java 配置文件的项目:
@Configuration
@EnableWebMvc
@ComponentScan("spittr.web")
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
}
}
该项目在 webapps/resources 目录中有一些正在提供的静态资源。我的问题是我不确定为什么。看来这行得通,上面对 addResourceHandlers(...) 的调用应该是
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources");
}
我试图在 Spring 文档中查找可能指示默认值但找不到的内容,所以我不确定该项目为何有效。
由于 DefaultServletHandlerConfigurer
:
,该项目可以提供静态资源
Configures a request handler for serving static resources by forwarding the request to the Servlet container's "default" Servlet.
我在以下示例中使用 Jetty,但其他 servlet 容器(例如 Tomcat)的行为应该类似。下载 Jetty 9 发行版,然后在 webapps
中创建这些文件:
example/
hello.txt
启动 Jetty 服务器。我们有 deployed the simplest application 可以想象的。您应该能够访问该文件:
http://localhost:8080/example/hello.txt
servlet 容器无需任何额外配置即可提供静态资源。一旦 Spring MVC 发挥作用,这种行为就会被抑制。 Spring MVC 将创建一个 front controller, DispatcherServlet
, and park it at "/". Every incoming request will go through this single servlet, and the servlet will find the appropriate component in the app to actually process the request (e.g. a @RequestMapping
method in a @Controller
class)。如果找不到请求的处理程序,我们有 404s。
处理程序 DefaultServletHandlerConfigurer
的优先级最低。如果启用,它允许前端控制器首先处理请求。当失败时,它将请求转发到 servlet 容器,请求被视为静态资源读取。
这是一种提供静态文件的快速而肮脏的方式。实际上,您不希望通过 GET 获得任何不走寻常路的东西。您只想允许特定的文件和文件夹,您可以使用 WebMvcConfigurerAdapter.addResourceHandlers()
.
我正在查看具有以下 Java 配置文件的项目:
@Configuration
@EnableWebMvc
@ComponentScan("spittr.web")
public class WebConfig extends WebMvcConfigurerAdapter {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver resolver = new InternalResourceViewResolver();
resolver.setPrefix("/WEB-INF/views/");
resolver.setSuffix(".jsp");
return resolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
super.addResourceHandlers(registry);
}
}
该项目在 webapps/resources 目录中有一些正在提供的静态资源。我的问题是我不确定为什么。看来这行得通,上面对 addResourceHandlers(...) 的调用应该是
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/resources/**").addResourceLocations("/resources");
}
我试图在 Spring 文档中查找可能指示默认值但找不到的内容,所以我不确定该项目为何有效。
由于 DefaultServletHandlerConfigurer
:
Configures a request handler for serving static resources by forwarding the request to the Servlet container's "default" Servlet.
我在以下示例中使用 Jetty,但其他 servlet 容器(例如 Tomcat)的行为应该类似。下载 Jetty 9 发行版,然后在 webapps
中创建这些文件:
example/
hello.txt
启动 Jetty 服务器。我们有 deployed the simplest application 可以想象的。您应该能够访问该文件:
http://localhost:8080/example/hello.txt
servlet 容器无需任何额外配置即可提供静态资源。一旦 Spring MVC 发挥作用,这种行为就会被抑制。 Spring MVC 将创建一个 front controller, DispatcherServlet
, and park it at "/". Every incoming request will go through this single servlet, and the servlet will find the appropriate component in the app to actually process the request (e.g. a @RequestMapping
method in a @Controller
class)。如果找不到请求的处理程序,我们有 404s。
处理程序 DefaultServletHandlerConfigurer
的优先级最低。如果启用,它允许前端控制器首先处理请求。当失败时,它将请求转发到 servlet 容器,请求被视为静态资源读取。
这是一种提供静态文件的快速而肮脏的方式。实际上,您不希望通过 GET 获得任何不走寻常路的东西。您只想允许特定的文件和文件夹,您可以使用 WebMvcConfigurerAdapter.addResourceHandlers()
.