我正在尝试为spring web应用程序设置一个非常简单的基本配置,可以处理以下情况:
- 将资源根请求映射到
/index
,例如/
映射到/index
,/resource/
映射到/resource/index
- 映射
/static/**
到/static/
(这是一个资源视图- css,js,images) - 用控制器映射处理一些特定的请求路径
- 将所有其他请求映射到基于url的视图,例如
/resource/page
映射到/WEB-INF/views/resource/page.jsp
我现在的配置是:
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
<mvc:resources mapping="/static/**" location="/static/"/>
<mvc:view-controller path="/" view-name="index"/>
适用于静态资源和根请求(/
),但不适用于基于资源的根请求(/resource/
)。当尝试处理所有其他请求(**/
)时,我打破了对静态资源的处理。
<mvc:view-controller path="**/*" />
有没有一种方法可以同时做所有这些事情?它不需要是一个xml唯一的解决方案,我很好与代码配置或混合解决方案。
我已经设法通过实现我自己的Controller
和Config
找到了解决方案。
view-servlet.xml
<mvc:resources mapping="/static/**" location="/static/"/>
<context:component-scan base-package="com.example.web.view"/>
com.example.web.view.ViewConfig
@Configuration
public class ViewConfig {
@Bean
public ViewResolver viewResolver() {
InternalResourceViewResolver vr = new InternalResourceViewResolver();
vr.setPrefix("/WEB-INF/views/");
vr.setSuffix(".jsp");
return vr;
}
@Bean RequestMappingHandlerMapping requestMappingHandlerMapping(){
return new RequestMappingHandlerMapping();
}
@Bean RequestMappingHandlerAdapter requestMappingHandlerAdapter(){
RequestMappingHandlerAdapter adapter = new RequestMappingHandlerAdapter();
adapter.setOrder(2); //process after mvc:resources
return adapter;
}
}
com.example.web.view.ViewController
@Controller
public class ViewController {
@RequestMapping(value = "**/")
public String all(HttpServletRequest request) {
String path = request.getRequestURI().replace(request.getContextPath(),"");
return path.endsWith("/") ? path +"index" : path;
}
}
魔法是在ViewConfig
中设置适配器上的顺序值。Spring创建了一个默认的映射处理程序,所有通过组件扫描找到的RequestMapping
都被添加到该处理程序中。我的初始设置失败的原因是这个处理程序的顺序要在mvc:resources
注册的处理程序之前匹配。创建自己的适配器并将其顺序设置为在mvc:resources
允许两者工作后进行处理。
关于这方面的信息可以在spring文档19.9.1为注释支持设置分派器中找到。
当然ViewConfig也可以完全在xml中实现:
<mvc:resources mapping="/static/**" location="/static/"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping"/>
<bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
<property name="order" value="2"/>
</bean>
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/"/>
<property name="suffix" value=".jsp"/>
</bean>
<context:component-scan base-package="com.example.web.view"/>
Update:从DefaultAnnotationHandlerMapping
和AnnotationMethodHandlerAdapter
更改为RequestMappingHandlerMapping
和RequestMappingHandlerAdapter
,以反映Spring 3.1中的更改。