我的项目结构如下
| src
|-主要
| --- webapp
| ----静态
| ----- CSS
| ----- HTML
| ----- js
我试图通过我的控制器返回HTML资源,对于直接位于根目录下的链接没有问题,但是对于其他链接,我遇到了问题。
这是我的控制器
@Controller
public class HtmlServer {
@RequestMapping({"/", "/index", "/index.html", "/index.jsp", "/home","/home.html","/home.jsp"})
public ModelAndView index() {
return new ModelAndView("html/index.html");
}
@RequestMapping(method = RequestMethod.GET, value = "/support/{id}/{accessToken}")
public ModelAndView start(@PathVariable Long id, @PathVariable String accessToken) {
return new ModelAndView("html/index.html");
}
}
这是我的WebMvcConfigurerAdapter扩展类
@Component
@ConfigurationProperties
@Configuration
@EnableWebMvc
public class ApplicationConfig extends WebMvcConfigurerAdapter {
@Bean
public InternalResourceViewResolver internalResourceViewResolver(){
InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver();
internalResourceViewResolver.setPrefix("static/");
return internalResourceViewResolver;
}
@Override
public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
configurer.enable();
}
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
registry.addResourceHandler("/js/**").addResourceLocations("static/js/")
.setCachePeriod(0);
registry.addResourceHandler("/css/**").addResourceLocations("static/css/")
.setCachePeriod(0);
registry.addResourceHandler("/support/**").addResourceLocations("/static/")
.setCachePeriod(0);
}
}
当我打开/或/index.html时,控制器将返回给定值,并以正确的资源作为回报。
但是,当我尝试使用/ support / 1 / xsdda时,我被映射到/support/1/static/html/index.html有人可以解释内部原理并从逻辑上指出我的错误。
谢谢!
最佳答案
在webapp中创建文件夹WEB-INF并将HTML文件夹放入其中
将解析器的前缀设置为/ WEB-INF / HTML /
将解析器的后缀设置为.html
通过返回“索引”来调用它
Servlet 2.4规范对WEB-INF进行了说明(第70页):
应用程序层次结构中存在一个特殊目录,名为
WEB-INF
。此目录包含与
不在应用程序文档根目录中的应用程序。的
WEB-INF
节点不属于的公共文档树的一部分
应用。 WEB-INF
目录中不能包含任何文件
通过容器直接发送给客户。但是,内容
使用WEB-INF
的servlet代码可以看到getResource
目录
和getResourceAsStream
方法调用ServletContext
,并且可能
使用RequestDispatcher
调用被公开。