SpringMVC与SpringBoot返回静态页面遇到的问题
1、SpringMVC静态页面响应
1 package com.sv.controller; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.PathVariable; 5 import org.springframework.web.bind.annotation.RequestMapping; 6 /** 7 * 页面展示 8 * @author jixh 9 * 10 */ 11 @Controller 12 public class PageController { 13 14 /** 15 * 展示首页 16 * @return 17 */ 18 @RequestMapping(value="/") 19 public String indexShow() { 20 return "index"; 21 } 22 23 /** 24 * 展示其他页面,每一个页面请求都要写一个对应的页面返回处理,这样太过麻烦,进行简化 25 * 方法:正如所见,将请求的URL和处理函数返回的URL写成一样的,这样一来就可以使用 26 * Restfaull的URL模板映射,直接将请求的URL作为返回的URL, 如此就可公用了 27 * 如果参数名称和表达式名称不一致时,加参数(@PathVariable(value="page") String page3) 28 * 29 */ 30 @RequestMapping(value="/{page}") 31 public String pageShow(@PathVariable String page) { 32 return page; 33 } 34 }
2、SpringBoot的视图控制器实现静态页面响应
如上面SpringMVC响应静态页面的方法,在SpringBoot提供了专门的视图控制器,只需要实现WebMvcConfigurer接口,重写其addViewControllers方法就可以进行配置,原理只是简单的重定向,但是在使用过程中遇到报404的问题,多次尝试,发现有个小坑,记录一下。
原因如下:
SpringBoot有很多的默认。就resources目录而言,在不配置静态资源目录的情况下,默认static目录中存公开的静态资源,而templates目录中存放模板文件。这里就有个问题,如果一个test.html文件中不涉及数据填充,只当作静态页面时,感觉放在两个目录中都可以,只是是否公开的区别而已?然而却不是这样,,,
在不引入Freemarker或Thymeleaf的jar包时,如果按照上面的方法,将test.html文件放在templates下时是不起作用的,表示找不到该文件(404),此时templates模板文件目录不起作用。必须放在static下才能被controller方法返回。使用模板引擎后,放在任意目录中都可以。
目录结构如下:
视图控制器配置类如下:
1 package com.huawei.myconfig; 2 3 import org.springframework.context.annotation.Configuration; 4 import org.springframework.web.servlet.config.annotation.ViewControllerRegistry; 5 import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; 6 @Configuration//标志当前类在启动的时候会被加载 7 public class MyConfiguration implements WebMvcConfigurer { 8 //视图控制器配置 9 @Override 10 public void addViewControllers(ViewControllerRegistry registry) { 11 //urlPath:浏览器输入的地址 viewName:该地址跳转到的页面,不加templates文件夹和.html 12 //registry.addViewController("/left").setViewName("left");错误的写法 13 registry.addViewController("/login").setViewName("left.html"); 14 } 15 16 }
还有一件事:这种视图返回方法的urlPath和viewName不能相同,否则会报500异常(
There was an unexpected error (type=Internal Server Error, status=500).
Circular view path [left]: would dispatch back to the current handler URL [/left] again. Check your ViewResolver setup! (Hint: This may be the result of an unspecified view, due to default view name generation.)
),
使用模板引擎时可以省略后缀名.html等,但返回静态资源时则不能省略,就像请求.css,.js文件一样。
controller类如下
1 package com.huawei.test; 2 3 import org.springframework.stereotype.Controller; 4 import org.springframework.web.bind.annotation.RequestMapping; 5 import org.springframework.web.bind.annotation.ResponseBody; 6 7 @Controller 8 public class Test { 9 @RequestMapping("/") 10 @ResponseBody 11 public String hello(){ 12 return "hello Spring boot"; 13 } 14 15 @RequestMapping("/test") 16 @ResponseBody 17 public String test(){ 18 return "举杯邀明月,对影成三人"; 19 } 20 21 @RequestMapping("/page") 22 public String left(){ 23 return "left.html"; 24 } 25 }
如要转载,请注明出处。