如何说Spring MVC在运行时(在方法中)返回静态资源?
更好地解释。我配置了我的应用程序(spring-mvc 3.2.4)来处理一些静态资源并使用两个视图解析器,FreeMaker和Json。我希望在控制器方法中,我可以对spring-mvc说他必须在静态资源中获取文件,尽管其中一个视图解析器尝试使用。
我的配置类如下所示:
@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.xxxx", excludeFilters = @Filter(Configuration.class)})
public class WebConfig extends WebMvcConfigurerAdapter {
...
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/app.js").addResourceLocations("/app.js");
}
...
@Bean
public ViewResolver contentNegotiatingViewResolver(ContentNegotiationManager manager) {
// Define the view resolvers
List<ViewResolver> resolvers = new ArrayList<ViewResolver>();
JsonViewResolver jsonViewResolver = new JsonViewResolver();
FreeMarkerViewResolver freeMarkerViewResolver = new FreeMarkerViewResolver();
freeMarkerViewResolver.setSuffix("rtl");
resolvers.add(jsonViewResolver);
resolvers.add(freeMarkerViewResolver);
ContentNegotiatingViewResolver resolver = new ContentNegotiatingViewResolver();
resolver.setContentNegotiationManager(manager);
resolver.setViewResolvers(resolvers);
return resolver;
}
}
我的控制器:
@Controller
@RequestMapping("/")
public class JSViewController {
@RequestMapping(value="*.js")
public String resolveArquivo(HttpServletRequest request){
// Here I would be able to say to sprint to return a static resource instead of hadle it with one of the View Resolvers.
return request.getRequestURI().replace(request.getContextPath(),"");
}
}
答案 0 :(得分:0)
如果您尝试单独访问静态和动态数据会更好,因为为静态数据命中控制器会浪费您的资源,增加延迟。
例如。如果你想从jsp访问js,那么你可以使用JSTL标记库,它可以动态地返回你可以获取静态资源的输出目录。
这使您可以灵活地缓存静态资源(Akamei或其他)或从apache而不是tomcat服务它们。
如果你真的想要从控制器渲染静态资源,那么你需要有一个拦截器,它可以在任何视图解析器之前被调用,它将识别所请求的资源是否为静态并相应地进行渲染。但是对于每个不可取的htttp请求都会调用它。
答案 1 :(得分:0)
不幸的是,我无法弄清楚如何在运行时使用spring返回静态资源,但我使用旧的和好的Filter解决了这种情况。