关于SpringBoot:SpringBoot如何返回页面

SpringBoot中使用Controller和页面的结合能够很好地实现用户的功能及页面数据的传递。但是在返回页面的时候竟然会出现404或者500的错误,我总结了一下如何实现页面的返回以及这里面所包含的坑。

SpringBoot中对Thymeleaf的集成已经基本完善,但在特殊情况下,并不需要或者不能使用Thymeleaf,所以分成两种情况对页面的返回进行阐述。

首先说一下这两种情况下都会发生的错误,也是新手们经常会出现的错误。

直接上代码:

<pre>@RestController public class TestController {
    @RequestMapping("/") public String index() { return "index";
    }
}</pre>

这个代码的初衷是返回index.html页面,但是执行的结果是在页面中输出index。

原因分析:@RestController注解相当于@ResponseBody和@Controller合在一起的作用。在使用@RestController注解Controller时,Controller中的方法无法返回jsp页面,或者html,配置的视图解析器 InternalResourceViewResolver不起作用,返回的内容就是Return 里的内容。

包括在Mapping注解使用的同时使用@ResponseBody时也会出现同样的问题。

解决办法:①去除@ResponseBody或将含有Rest的注解换成对应的原始注解;

②不通过String返回,通过ModelAndView对象返回,上述例子可将return语句换成下面的句子:

<pre> return new ModelAndView("index");</pre>

在使用ModelAndView对象返回的时候,不需要考虑有没有@ResponseBody类似的注解。

还有一个需要注意的点:@RequestMapping中的路径一定不要和返回的页面名称完全相同,这样会报500的错误!!!!

如下面这样是不行的:

<pre>@Controller public class TestController {
    @RequestMapping("/index") public String idx() { return "index";
    }
}</pre>

--------------------------------------------------------分隔线-----------------------------------------------

1、在不使用模板引擎的情况下:

在不使用模板引擎的情况下,访问页面的方法有两种:

1)将所需要访问的页面放在resources/static/文件夹下,这样就可以直接访问这个页面。如:

在未配置任何东西的情况下可以直接访问:

而同样在resources,但是在templates文件夹下的login.html却无法访问:

2)使用redirect实现页面的跳转

示例代码(在页面路径和上面一致的情况下):

<pre>@Controller public class TestController {
    @RequestMapping("/map1") public String index() { return "redirect:index.html";
    }
    @RequestMapping("/map2") public String map2() { return "redirect:login.html";
    }
}</pre>

执行结果:

这说明这种方法也需要将html文件放在static目录下才能实现页面的跳转。

当然还是有终极解决方案来解决这个存放路径问题的,那就是使用springmvc的配置:

<pre>spring:
  mvc:
    view:
      suffix: .html static-path-pattern: /** resources:
    static-locations: classpath:/templates/,classpath:/static/</pre>

这样配置后,map1和map2都可以访问到页面了。

2、使用Thymeleaf模板引擎:

先将所需要的依赖添加至pom.xml

<pre><!-- https://mvnrepository.com/artifact/org.springframework.boot/spring-boot-starter-thymeleaf -->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
    <version>2.1.6.RELEASE</version>
</dependency></pre>

同样的页面路径下将controller代码修改成下面的代码:

<pre>@Controller public class TestController {
    @RequestMapping("/map1") public String index() { return "index";
    } /** 下面的代码可以实现和上面代码一样的功能 */
    /*public ModelAndView index() {
        return new ModelAndView("index");
    }*/ @RequestMapping("map2") public String map2() { return "login";
    }
}</pre>

执行结果:

这又说明一个问题,所需要的页面必须放在templates文件夹下。当然也可以修改,更改配置文件:

<pre>spring:
  thymeleaf:
    prefix: classpath:/static/ suffix: .html
    cache: false #关闭缓存</pre>

更改prefix对应的值可以改变Thymeleaf所访问的目录。但好像只能有一个目录。

综上:模板引擎的使用与否都可以实现页面的访问。区别在于页面所存放的位置以及访问或返回的时候后缀名加不加的问题。

  • 2
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用 Nginx 的反向代理功能来实现这个需求。具体配置如下: ``` server { listen 80; server_name www.test.com; location /projectA { proxy_pass http://127.0.0.1:8080/projectA; # springboot 项目的地址 proxy_set_header Host $host; # 设置请求头中的 Host 字段,用于支持虚拟主机 proxy_set_header X-Real-IP $remote_addr; # 将客户端真实 IP 地址传递给后端服务器 proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; # 将客户端 IP 地址传递给后端服务器 } location /projectB { proxy_pass http://127.0.0.1:8081/projectB; # springboot 项目的地址 proxy_set_header Host $host; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; } location /projectA/ { alias /path/to/vue/projectA/dist/; # vue 项目的地址 try_files $uri $uri/ /index.html; } location /projectB/ { alias /path/to/vue/projectB/dist/; # vue 项目的地址 try_files $uri $uri/ /index.html; } } ``` 这里假设两个 Spring Boot 项目的地址分别为 `http://127.0.0.1:8080/projectA` 和 `http://127.0.0.1:8081/projectB`,两个 Vue 项目的地址为 `/path/to/vue/projectA/dist/` 和 `/path/to/vue/projectB/dist/`。 其中,`location /projectA/` 和 `location /projectB/` 的作用是将 URL 中以 `/projectA` 或 `/projectB` 开头的请求映射到对应的 Vue 项目中。`try_files $uri $uri/ /index.html;` 是为了支持 Vue 的路由模式,将所有的 URL 都重定向到 Vue 的 `index.html` 页面中。 注意,在配置 Nginx 反向代理时,需要根据实际情况修改端口号、路径等参数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值