Spring MVC映射资源和索引

时间:2014-09-13 09:11:53

标签: spring spring-mvc

我设置了资源路径

    registry.addResourceHandler("/assets/**").addResourceLocations("/WEB-INF/assets/");

并将DispatcherServlet映射到/

现在我正在尝试添加索引页面,我认为应该将其映射到/.

但是,当我添加索引页面映射/时,所有内容都会映射到那里,包括我的资产目录,但不包括其他已定义的响应映射。理想情况下,我只想将请求映射到完全上下文根。

我使用了视图控制器,但这意味着在返回视图之前我无法执行任何控制器逻辑。

@Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.myco")
public class SpringConfig extends WebMvcConfigurerAdapter {


    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/").setViewName("index");
    }

2 个答案:

答案 0 :(得分:0)

让我们在这里细分您的配置,因为我相信您有多个问题。

首先,这一行

registry.addResourceHandler("/assets/**").addResourceLocations("/WEB-INF/assets/");

/assets的任何子路径和WEB-INF目录中的assets目录之间配置映射。因此,当您说“所有内容都被映射到那里,包括我的资产目录”时,这就是预期的行为。

如果您可以在此目录中找到您的视图,那么这可能不是您想要的,因为您通常不希望公开显示原始视图。如果您需要公开公开任何资产(css,js,images,...),您应该创建某种层次结构,并且只公开浏览应用程序的客户端直接需要的内容。 例如,在您的资产目录中,您可以拥有一个public目录,您可以修复映射,如:

registry.addResourceHandler("/assets/**").addResourceLocations("/WEB-INF/assets/public/");


其次,我们来看看addViewControllers WebMvcConfigurer addViewControllers的文档:

  

添加视图控制器以在URL路径和之间创建直接映射   查看名称,而不需要中间的控制器。

所以是的,正如你所说,在返回视图之前,你将无法执行任何控制器逻辑。

我相信您的配置中缺少的是ViewResolver,以便您的控制器能够按名称解析视图,而无需使用{{1}}配置直接映射(防止任何业务逻辑到在中间执行。)

答案 1 :(得分:0)

在SpringConfig中添加它

@Bean
public ViewResolver viewResolver() {
    InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
    viewResolver.setPrefix("/WEB-INF/views/");
    viewResolver.setSuffix(".jsp");
    return viewResolver;
}

在弹簧进行组件扫描的包中添加一个控制器。例如

@Controller
public class MainController {

    @RequestMapping(value = "/")
    public String index(Model model){

        // implements business logic    

        return "index";
    }   
}

在/ WEB-INF / views中添加名为index.jsp的视图