1. 程式人生 > 其它 >關於SpringBoot下關於訪問templates跟static目錄問題

關於SpringBoot下關於訪問templates跟static目錄問題

一、前言

  springboot整合了springmvc的攔截功能。攔截了所有的請求。預設放行的資源是:resources/static/ 目錄下所有靜態資源。(不走controller控制器就能直接訪問到資源)。

html頁面如果放在resources/templates目錄下,則需要走controller控制器,controller放行,允許該資源訪問,該資源才能被訪問到。否則就會報404錯誤(它不可以直接被訪問)。

有時候我們只需要簡單在templates下兩個頁面進行跳轉,再寫controller免得有些多餘,那怎麼解決呢?


我們建立一個SpringBoot專案的時候預設會是這樣的目錄結構:

但是我在今天測試的時候(templates/index.html),發現並不能訪問到它的同級目錄:

我就不復原案發現場了,直接來說問題以及解決辦法:

二、問題:

1、index.html頁面中無法跳轉/訪問同級目錄下/templates/xxx.html檔案

2、index.html頁面中無法訪問到static目錄下的xxx.xx靜態檔案

3、index.html頁面中無法通過a標籤訪問到controller

三、解決

1、通過寫配置類

@Configuration
public class MyConfig implements WebMvcConfigurer {

     @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        //這裡是指在url上面打的內容
        registry.addResourceHandler("/**")
                //下面的是指可以對應resources檔案下那些內容
                .addResourceLocations("classpath:/")
                .addResourceLocations("classpath:/templates/")
                .addResourceLocations("classpath:/static");
    }
}

2、通過新增配置檔案屬性(推薦)

在application.properties中新增屬性:

# 靜態檔案請求匹配方式
spring.mvc.static-path-pattern=/**
# 修改預設的靜態定址資源目錄
spring.resources.static-locations=classpath:/templates/,classpath:/META-INF/resources/,classpath:/resources/,classpath:/static/,classpath:/public/

四、測試:

pom.xml:

<dependencies>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true
</optional> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> </dependencies>
View Code

controller程式碼:

package com.zhixi.controller;

/**
 * @author zhangzhixi
 * @version 1.0
 * @date 2021-7-11 14:35
 */

import org.springframework.stereotype.Component;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;

@Component
@Controller
public class MyController {

    @RequestMapping(value = "/some", method = RequestMethod.POST)
    @ResponseBody
    public String test1(@RequestParam("name") String name, @RequestParam("age") String age) {
        return "姓名是:" + name + " 年齡是:" + age;
    }

    @RequestMapping("/zzx")
    @ResponseBody
    public String test2(){
        return "你好,這是controller測試頁面";
    }
}
View Code

index.html程式碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>

<a href="/zzx">跳轉到controller</a><br>
<a href="Test.html">跳轉到templates下的Test.html頁面</a><br>
<a href="css/test.css">跳轉到static目錄下的css檔案</a>
<br>

<br>
<form action="/some" method="post">
    姓名:
    <label>
        <input type="text" name="name"/>
    </label> <br>
    年齡:
    <label>
        <input type="text" name="age"/>
    </label> <br>
    <input type="submit" value="提交"/>
</form>
</body>
</html>

成功訪問: