我设置了资源路径
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");
}
答案 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的视图