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 @   jixhua  阅读(3025)  评论(0编辑  收藏  举报
编辑推荐:
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
阅读排行:
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
· SQL Server 2025 AI相关能力初探
点击右上角即可分享
微信分享提示