2

抱歉,如果这感觉重复,我收集了很多人问这个问题,但我一直无法找到有效的答案。

我有一个使用 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.xml,application-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 处理程序似乎没有任何效果。

4

1 回答 1

0

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

<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");

}

于 2014-06-25T14:53:01.550 回答