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 }

如要转载,请注明出处。

posted @ 2018-12-16 00:39  jixhua  阅读(3010)  评论(0编辑  收藏  举报