在同一路径上共享静态内容和mvc控制器

时间:2014-06-25 13:54:37

标签: java maven spring-mvc static-content

道歉,如果这感觉重复,我会聚集很多人问这个,但我还没有找到一个有效的答案。

我有一个使用maven构建的网络应用程序。我使用Spring 4 MVC来提供RESTful Json API。我还有很多静态内容(html,css,js),我使用Angular.js在数据API上做了一个漂亮的面孔。

对于我的生活,我无法弄清楚如何在不弄乱他们的路径的情况下同时获得这两者。

  • 我真的很想在我的浏览器中访问{APP_ROOT}/people/{id},并直接与我的REST api进行交互,而不会对/api//rest/

  • 我真的很想在我的浏览器中访问{APP_ROOT}/css/style.css,并在src/main/webapp/css/style.css内提供内容,而不会对resourcesstatic做任何废话

  • 另外,我真的很想用带注释的Java类配置所有这些,而不是web.xmlapplication-context.xml等。

因此,Spring调度程序servlet应该处理所有REST资源路径,然后回退到静态内容的默认Tomcat / Jetty处理程序。我认为这正是 default-servlet-handler 的用法?我似乎无法让它发挥作用。

这些是我的相关配置类:

WebAppInitializer.java

public class WebAppInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {


    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class<?>[0] ;
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class<?>[] { WebConfig.class};
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/*" };
    }

    @Override
    protected Filter[] getServletFilters() {

        CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
        characterEncodingFilter.setEncoding("UTF-8");
        return new Filter[] { characterEncodingFilter};
    }

}

WebConfig.java

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = {"my.example.package"})
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }
}

使用此配置,我可以与REST api交互,但不能与静态内容交互。默认的servlet处理程序似乎没有任何效果。

1 个答案:

答案 0 :(得分:0)

要访问css js或html等静态资源,请将所有这些文件保存在模块的webapp文件夹中。假设您所有的静态资源都在src / main / webapp / static路径中,您可以在上下文中执行mvc资源映射xml

<mvc:resources mapping="/index-dev.html" location="/static/index-dev.html"/>
<mvc:resources mapping="/index.html" location="/static/index.html"/>
<mvc:resources mapping="/app.js" location="/static/app.js"/>
<mvc:resources mapping="/appinit.js" location="/static/appinit.js"/>
<mvc:resources mapping="/extjs/**" location="/static/extjs/"/>
<mvc:resources mapping="/app/**" location="/static/app/"/>
<mvc:resources mapping="/static/**" location="/static/static/"/>
<mvc:resources mapping="/static/**" location="/static/"/>

既然你想在没有xml的情况下做到这一点,你可以在你的WebConfig类中进行,如下例所示

@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    registry.addResourceHandler("/index.html").addResourceLocations("/static/index.html");

}