3

如何让 Spring MVC 在运行时(在方法中)返回静态资源?

解释得更好。我配置了我的应用程序(spring-mvc 3.2.4)来处理一些静态资源并使用两个视图解析器,FreeMaker 和 Json。我希望在控制器方法中我能够对 spring-mvc 说他必须将文件放入静态资源中,尽管其中一个视图解析器尝试使用 hadle。

我的配置类如下所示:

@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(),"");
    }
}
4

2 回答 2

0

不幸的是,我无法弄清楚如何使用 spring 在运行时返回静态资源,但我使用旧的和好的过滤器解决了这种情况。

于 2013-10-18T00:02:53.903 回答
0

如果您尝试分别访问静态和动态数据会更好,因为访问静态数据的控制器会浪费您的资源,增加延迟。

例如。如果你想从 jsp 访问 js,那么你可以使用 JSTL 标签库,它会动态返回输出目录,你可以从中获取静态资源。

这使您可以灵活地缓存静态资源(Akamei 或其他)或从 apache 而不是 tomcat 提供它们。

如果你真的想从控制器渲染你的静态资源,那么你需要有一个拦截器,它可以在任何视图解析器之前调用,它将识别所请求的资源是否为静态并相应地渲染。但是对于每个不可取的 tttp 请求都会调用它。

于 2013-10-16T11:37:59.393 回答