Java 如何使用Springboot从一个html页面重定向到另一个html页面

Java 如何使用Springboot从一个html页面重定向到另一个html页面,java,html,spring-boot,Java,Html,Spring Boot,我正在使用Springboot和Thymeleaf制作一个TictaToe应用程序。但是我面临着将我的index.html重定向到message.html 这是我的index.html代码 } 有谁能给我一段代码,告诉我如何将它重定向到新的HTML页面,message.HTML。我没有从index.html传递任何特定数据。在href属性上运行时出现以下错误 白标错误页面此应用程序没有/Error的显式映射,因此您将其视为一种回退。首先,我建议您使用ErrorController界面,以便更好地

我正在使用Springboot和Thymeleaf制作一个TictaToe应用程序。但是我面临着将我的
index.html
重定向到
message.html

这是我的index.html代码 }

有谁能给我一段代码,告诉我如何将它重定向到新的HTML页面,
message.HTML
。我没有从
index.html
传递任何特定数据。在
href
属性上运行时出现以下错误


白标错误页面此应用程序没有/Error的显式映射,因此您将其视为一种回退。首先,我建议您使用ErrorController界面,以便更好地跟踪错误所在的位置

至于您的错误,我假设您的其他控制器端点工作正常(如果不是这样,请检查@ComponentScan相关问题),并且您的templates文件夹中有一个message.html模板(如果您没有message.html,那么肯定会出现404错误)。但假设你拥有所有这些:

  • 直接从您的浏览器中查看它是如何失败的。所以从这里我们知道这不是由重定向引起的问题

  • 如果重定向没有问题,则表示问题在于无法解决此URL。所以在某个时候Spring不知道在哪里可以找到你的页面(因为没有人告诉他:()

  • 现在,您将“messaga.html”文件移动到“src/main/resources/static/”文件夹,然后…Tadaaa!神奇地工作了

  • 为什么它现在可以工作?基本上是因为Spring在默认情况下查找静态内容()

    如果您想将其保持为静态页面,则转到/message端点重定向到/message.html没有意义,您可以直接设置href attr like/message.html

    如果希望message.html页面不是静态的,请将其设置为模板,并使用ModelAndView或其他工具返回。

    以防你还想重定向更多内容。

    首先,我建议您使用ErrorController界面,以便更好地跟踪错误所在的位置

    至于您的错误,我假设您的其他控制器端点工作正常(如果不是这样,请检查@ComponentScan相关问题),并且您的templates文件夹中有一个message.html模板(如果您没有message.html,那么肯定会出现404错误)。但假设您有所有这些:

  • 直接从你的浏览器查看它是如何失败的。因此,从这里我们知道这不是由你的重定向引起的问题

  • 如果重定向没有问题,那就意味着这个URL无法解决。因此,Spring有时不知道在哪里可以找到你的页面(因为没有人告诉他:()

  • 现在,您将“messaga.html”文件移动到“src/main/resources/static/”文件夹,然后…Tadaaa!神奇地工作了

  • 为什么它现在可以工作?基本上是因为Spring在默认情况下查找静态内容()

    如果您想将其保持为静态页面,则转到/message端点重定向到/message.html没有意义,您可以直接设置href attr like/message.html

    如果希望message.html页面不是静态的,请将其设置为模板,并使用ModelAndView或其他工具返回。

    以防你还想重定向更多内容。

    <!DOCTYPE HTML>
    
    <html xmlns="http://www.w3.org/1999/xhtml"
        xmlns:th="http://www.thymeleaf.org"
        xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3"
        xmlns:layout="http://www.ultraq.net.nz/thymeleaf/layout">
    <head>
    
    <title>Tic Tac Toe</title>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    
    <script
        src="https://ajax.googleapis.com/ajax/libs/jquery/1.11.3/jquery.min.js"></script>
    <script
        src="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>
    <script src="js/app-main.js"></script>
    
    <link rel="stylesheet"
        href="https://maxcdn.bootstrapcdn.com/bootstrap/3.3.5/css/bootstrap.min.css" />
    <link rel="stylesheet" href="css/app-layout.css" />
    
    <link rel="icon" type="image/png" href="images/tic-tac-toe.png" />
    
    </head>
    <body>
    
        <nav class="navbar navbar-default">
            <div class="container-fluid">
                <div class="navbar-header">
                    <span class="navbar-brand"> <img alt="Brand"
                        src="images/tic-tac-toe.png" /> Tic Tac Toe
                    </span>
                </div>
            </div>
        </nav>
    
        <div class="game-area panel panel-default">
            <div class="panel-body">
    
                <h4 class="game-status">
                    <span th:if="${game.getPlayerState().isInProgress()}"
                        class="label label-default"> Your turn. Think very carefully
                        and click a square when ready.</span> <span
                        th:if="${game.getPlayerState().isWin()}"
                        class="label label-success"> YOU WIN! Your superior
                        intellect prevailed and assured a sound victory. Click here to <a
                        href="/message">view your reward</a>
                    </span> <span th:if="${game.getPlayerState().isLoss()}"
                        class="label label-danger"> You've lost. Better luck next
                        time!</span> <span th:if="${game.getPlayerState().isDraw()}"
                        class="label label-info"> Mheh! A smelly draw. Beats losing
                        though, right?</span>
                </h4>
    
                <table class="board">
                    <tr th:each="row : ${game.getBoard().getTiles()}" class="board-row">
                        <td th:each="tile : ${row}">
                            <div th:id="${tile.getId()}" class="board-row-tile"
                                th:classappend="${!tile.isEmpty()} ? ${tile} + '-value' : (${!game.isGameOver()} ? 'available')"
                                th:text="${tile}">&nbsp;</div>
                        </td>
                    </tr>
                </table>
    
                <form id="form_mark_tile" th:action="@{/}" method="POST"
                    class="form-inline">
                    <div class="checkbox">
                        <label><input name="player_go_first" type="checkbox"
                            th:checked="${game.isPlayerGoFirst()}" /> Play First</label>
                    </div>
    
                    <div class="btn-new-game-wrap">
                        <a id="btn-new-game" class="btn btn-success btn-lg"
                            href="javascript:void(0);" role="button">New Game</a>
                    </div>
    
                    <input id="is_game_over" type="hidden"
                        th:value="${game.isGameOver()}" /> <input id="tile_id"
                        name="tile_id" type="hidden" value="" /> <input id="new_game"
                        name="new_game" type="hidden" value="" />
                </form>
    
            </div>
        </div>
    
    </body>
    </html>
    
    @Controller
    @SessionAttributes("game")
    public class TicTacToeController {
    
    @RequestMapping(value = "/", method = RequestMethod.GET)
    public String index(@ModelAttribute("game") Game game) {
        return "index";
    }
    
    @RequestMapping(value = "/", method = RequestMethod.POST)
    public String markTile(@ModelAttribute("game") Game game, @RequestParam("tile_id") String tileId,
            @RequestParam(value = "new_game", required = false, defaultValue = "false") boolean newGame,
            @RequestParam(value = "player_go_first", required = false, defaultValue = "false") boolean playerGoFirst) {
    
        if (newGame) {
            game.reset();
            game.setPlayerGoFirst(playerGoFirst);
            if (!playerGoFirst) {
                // give computer a small advantage by always placing X in the center as its
                // first move
                game.markTile("1-1");
            }
        } else {
            game.markTile(tileId); // Player Turn
    
            game.markTileRandom(); // Computer Turn
        }
    
        return "index";
    }
    
    @GetMapping(value = "/message")
    public String message() {
        return "redirect:/message.html";
    }
    
    @ModelAttribute("game")
    public Game populateGame() {
        return new Game();
    }