首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在不破坏资源映射的情况下隐式映射文件夹视图?

如何在不破坏资源映射的情况下隐式映射文件夹视图?
EN

Stack Overflow用户
提问于 2013-05-16 04:01:35
回答 1查看 622关注 0票数 2

我试图为一个可以处理以下情况的spring应用程序设置一个非常简单的基本配置:

  • 将资源根请求映射到/index,例如/映射到/index/resource/映射到/resource/index
  • /static/**映射到/static/ (这是一个资源视图- css、js、图像)
  • 使用控制器映射处理某些特定的请求路径
  • 将所有其他请求映射到基于url的视图(如/resource/page映射到/WEB-INF/views/resource/page.jsp )

在我当前的配置中,我拥有的是:

代码语言:javascript
运行
复制
<mvc:annotation-driven/>
<mvc:default-servlet-handler/>
<mvc:resources mapping="/static/**" location="/static/"/>
<mvc:view-controller path="/" view-name="index"/>

它适用于静态资源和根请求(/),但不适用于基于资源的根请求(/resource/)。当尝试处理所有其他请求(**/)时,我会中断对静态资源的处理。

代码语言:javascript
运行
复制
<mvc:view-controller path="**/*" />

有没有办法同时做所有这些事情?它不需要仅仅是xml解决方案,我可以使用代码配置或混合解决方案。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-05-17 02:12:17

通过实现我自己的ControllerConfig,我设法找到了一个解决方案。

view-servlet.xml

代码语言:javascript
运行
复制
<mvc:resources mapping="/static/**" location="/static/"/>
<context:component-scan base-package="com.example.web.view"/>

com.example.web.view.ViewConfig

代码语言:javascript
运行
复制
@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

代码语言:javascript
运行
复制
@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实现:

代码语言:javascript
运行
复制
<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"/>

更新:DefaultAnnotationHandlerMappingAnnotationMethodHandlerAdapter更改为RequestMappingHandlerMappingRequestMappingHandlerAdapter,以反映Spring3.1.x及更高版本中所做的更改。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16578795

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档