Как перенаправить с одной страницы html на другую html с помощью Springboot - PullRequest
0 голосов
/ 25 мая 2020

Я создаю приложение TicTacToe, используя Springboot и Thymeleaf. Но у меня возникают проблемы с перенаправлением моего index.html на message.html

Вот мой индекс. html код

<!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>

Вот мой TicTacToeController

@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();
}

}

Может ли кто-нибудь помочь мне с помощью кода о том, как перенаправить его на новую страницу HTML, message.html. Я не передаю какие-либо данные c из index.html. При работе с атрибутом href я получаю следующую ошибку.

> Страница ошибки Whitelabel В этом приложении нет явного сопоставления для / error, поэтому вы рассматриваете это как запасной вариант.

1 Ответ

2 голосов
/ 25 мая 2020

Во-первых, я предлагаю вам использовать интерфейс ErrorController, чтобы вы могли лучше отслеживать, где находятся ваши ошибки.

https://www.baeldung.com/spring-boot-custom-error-page

Что касается вашей ошибки, Я предполагаю, что другие конечные точки вашего контроллера работают нормально (если это не так, проверьте проблемы, связанные с @ComponentScan), а также что у вас есть шаблон message. html в папке шаблонов (на случай, если у вас нет вашего сообщения. html тогда обязательно получится ошибка 404). Но если у вас есть все это:

  1. Go http://localhost: 8080 / message. html прямо из вашего браузера и посмотрите, как это не удается. Итак, отсюда мы знаем, что это не проблема, вызванная вашим перенаправлением

  2. Если это не проблема перенаправления, это означает, что проблема в том, что этот URL-адрес не может быть разрешен. Так что в какой-то момент Spring не знает, где найти вашу страницу (потому что никто ему не сказал :()

  3. Итак, теперь вы перемещаете свой файл «messaga. html» в « src / main / resources / static / "и ... Tadaaa! волшебным образом работает.

Почему это работает сейчас? В основном из-за того, где Spring по умолчанию ищет содержимое stati c (https://docs.spring.io/spring-boot/docs/1.1.5.RELEASE/reference/htmlsingle/#boot -features-spring- mvc -stati c -content ).

Если вы хотите сохранить его как страницу c stati, у него нет смысла в конечную точку go / message для перенаправления на /message.html, вы можете напрямую установить свой href attr, например /message.html

Если вы хотите, чтобы ваше сообщение. html page было не stati c, сделайте его шаблоном и верните его с помощью ModelAndView или как-то еще. https://www.baeldung.com/spring-mvc-model-model-map-model-view

Если вы все еще хотите перенаправить больше материалов. https://www.baeldung.com/spring-redirect-and-forward

...