当我在春季启动中添加验证时,百里叶未加载内容

发布于 2025-01-19 05:27:44 字数 16688 浏览 0 评论 0原文

简介:

我的应用程序在一般意义上是有效的。一切如我所愿。但是当我设置验证(并且它确实有效)时,它不会加载我所有的隐藏内容。我把它全部移到了自己的页面,但它仍然不起作用。所以我在这里用我原来的设置来问。我知道这很乱,但一旦我弄清楚了,我就会清理它。

我找不到与我的问题相关的任何内容,这让我想,我这样做的方式可能不是最好的方法。所以非常欢迎指点。

问题:

向我的表单添加验证会破坏我的 Thymeleaf 模板。无法隐藏和取消隐藏元素。看起来卡住了。但在终端上,程序确实运行良好。

我的控制器

(它很大......我仍然需要学习如何将其分成更小的块。)

@Controller
@SessionAttributes({"guess", "word", "result", "level", "attempt", "message", "credits", "name", "gameScore"})
public class GameController {

    private static final String WORD_TO_GUESS_CONSTANT = "WORD_TO_GUESS";
    private static final String GUESSED_WORD_CONSTANT = "GUESSED_WORD";
    private static final String RESULT_CONSTANT = "RESULT_WORD";
    private static final String ATTEMPTS_CONSTANT = "ATTEMPTS";
    private static final String TOTAL_ATTEMPTS_CONSTANT = "TOTAL_ATTEMPTS";
    private static final String MESSAGE_CONSTANT = "MESSAGE";
    private static final String CREDITS_CONSTANT = "CREDITS";
    private static final String SELECTED_LEVEL_CONSTANT = "SELECTED_LEVEL";
    private static final String NAME_CONSTANT = "NAME";
    private static final String GAME_SCORE_CONSTANT = "GAME_SCORE";
    private static final String SCORE_MULTIPLIER_CONSTANT = "SCORE_MULTIPLIER";

    @Autowired
    private RandomWordService randomWord;
    @Autowired
    private WordCheckService checkGuess;
    @Autowired
    private IsWordCorrectService isWordCorrectService;
    @Autowired
    private ScoreSavingService scoreSavingService;

    @ModelAttribute("gameDto")
    public GameDTO guessDTOForm() {
        return new GameDTO();
    }

    @ModelAttribute("score")
    public Score score() {
        return new Score();
    }

//   GAME METHODS

    @GetMapping(value = "/index")
    public String home(Model model,
                       final HttpServletRequest request,
                       final HttpSession session,
                       GameDTO gameDTO,
                       Score score) {
        
        model.addAttribute("name", session.getAttribute(NAME_CONSTANT));
        model.addAttribute("levelSelected", session.getAttribute(SELECTED_LEVEL_CONSTANT));
        model.addAttribute("attempt", session.getAttribute(ATTEMPTS_CONSTANT));
        model.addAttribute("credits", session.getAttribute(CREDITS_CONSTANT));
        model.addAttribute("attemptStart", session.getAttribute(TOTAL_ATTEMPTS_CONSTANT));
        model.addAttribute("guess", session.getAttribute(GUESSED_WORD_CONSTANT));
        model.addAttribute("result", session.getAttribute(RESULT_CONSTANT));
        model.addAttribute("message", session.getAttribute(MESSAGE_CONSTANT));
        model.addAttribute("gameScore", session.getAttribute(GAME_SCORE_CONSTANT));

        model.addAttribute("lvlName", Level.values());

        return "index";
    }

    @PostMapping(value = "/loadgame")
    public String loadWord(
            final HttpSession session, final HttpServletRequest request,
            @ModelAttribute("score") Score score,
            @Valid GameDTO gameDTO, BindingResult bindingResult,
            Model model
    ) throws IOException {

        if (bindingResult.hasErrors()) {
            model.addAttribute("lvlName", Level.values());

            model.addAttribute("name", session.getAttribute(NAME_CONSTANT));
            model.addAttribute("levelSelected", session.getAttribute(SELECTED_LEVEL_CONSTANT));
            model.addAttribute("attempt", session.getAttribute(ATTEMPTS_CONSTANT));
            model.addAttribute("credits", session.getAttribute(CREDITS_CONSTANT));
            model.addAttribute("attemptStart", session.getAttribute(TOTAL_ATTEMPTS_CONSTANT));

            model.addAttribute("guess", session.getAttribute(GUESSED_WORD_CONSTANT));
            model.addAttribute("result", session.getAttribute(RESULT_CONSTANT));

            model.addAttribute("message", session.getAttribute(MESSAGE_CONSTANT));
            model.addAttribute("gameScore", session.getAttribute(GAME_SCORE_CONSTANT));

            return "index";
        }

        //  NEW GAME

        String word = (String) request.getSession().getAttribute(WORD_TO_GUESS_CONSTANT);

        if (word == null) {
            request.getSession().setAttribute(NAME_CONSTANT, gameDTO.getPlayerName());
            request.getSession().setAttribute(ATTEMPTS_CONSTANT, gameDTO.getLvlName().getAttempts());
            request.getSession().setAttribute(WORD_TO_GUESS_CONSTANT, randomWord.selectRandomWord());
            request.getSession().setAttribute(CREDITS_CONSTANT, gameDTO.getCredit());
            request.getSession().setAttribute(SELECTED_LEVEL_CONSTANT, gameDTO.getLvlName().getLvlName());
            request.getSession().setAttribute(TOTAL_ATTEMPTS_CONSTANT, gameDTO.getLvlName().getAttempts());
            request.getSession().setAttribute(GAME_SCORE_CONSTANT, gameDTO.getScore());
            request.getSession().setAttribute(SCORE_MULTIPLIER_CONSTANT, gameDTO.getLvlName().getMultiplier());
            gameDTO.setWord((String) session.getAttribute(WORD_TO_GUESS_CONSTANT));
        }
        model.addAttribute("message", "");


        return "redirect:/index";
    }


    @PostMapping(value = "/guess")
    public String guessWord(
            final HttpSession session,
            final HttpServletRequest request,
            @ModelAttribute("score") Score score,
            @Valid GameDTO gameDTO, BindingResult bindingResult) throws IOException {

        if (bindingResult.hasErrors()) {
            return "index";
        }

        // variables
        int attempts = (int) session.getAttribute(ATTEMPTS_CONSTANT);
        int credits = (int) session.getAttribute(CREDITS_CONSTANT);
        int startAttempts = (int) session.getAttribute(TOTAL_ATTEMPTS_CONSTANT);
        String name = (String) session.getAttribute(NAME_CONSTANT);
        // check word
        String wordToGuess = (String) session.getAttribute(WORD_TO_GUESS_CONSTANT);
        String guess = gameDTO.getGuess();
        String result = checkGuess.resultWord(wordToGuess, guess);
        String lvl = (String) session.getAttribute(SELECTED_LEVEL_CONSTANT);
        // adjust score according to result
        boolean wordIsCorrect = isWordCorrectService.isTheWordCorrect(result, wordToGuess);
        int gameScore = (int) session.getAttribute(GAME_SCORE_CONSTANT);
        int scoreMultiplier = (int) request.getSession().getAttribute(SCORE_MULTIPLIER_CONSTANT);
        int wrongWord = gameDTO.getWrongWord();
        int initialScore = gameDTO.getStartScore();
        int finalScorePerWord = initialScore * scoreMultiplier;

        //   GAME LOGIC

        if (!wordIsCorrect) {
            String message = "";

            message = "Wrong! Try again!";
            request.getSession().setAttribute(MESSAGE_CONSTANT, message);
            request.getSession().setAttribute(ATTEMPTS_CONSTANT, --attempts);
            request.getSession().setAttribute(GAME_SCORE_CONSTANT, gameScore - wrongWord);
            log(GameController.class, "Updated score: " + session.getAttribute(GAME_SCORE_CONSTANT));

            if (attempts == 0) {
                request.getSession().setAttribute(CREDITS_CONSTANT, --credits);
                message = "Sorry, the word was: [ " + session.getAttribute(WORD_TO_GUESS_CONSTANT) + " ]";
                request.getSession().setAttribute(MESSAGE_CONSTANT, message);
                request.getSession().setAttribute(ATTEMPTS_CONSTANT, startAttempts);
                request.getSession().setAttribute(WORD_TO_GUESS_CONSTANT, randomWord.selectRandomWord());
            }

            if (credits == 0) {
                message = "Game over!";
                request.getSession().setAttribute(MESSAGE_CONSTANT, message);
                request.getSession().setAttribute(GAME_SCORE_CONSTANT, gameScore);

                //   SAVE SCORE
                score.setGameScore(gameScore);
                score.setName(name);
                score.setSelectedLevelName(lvl);
                scoreSavingService.saveScore(score);

                log(GameController.class, "Final score: " + session.getAttribute(GAME_SCORE_CONSTANT));
            }

        } else {
            String message = "Correct! Guess another word!";
            wordToGuess = randomWord.selectRandomWord();
            gameDTO.setWord(wordToGuess);
            request.getSession().setAttribute(MESSAGE_CONSTANT, message);
            request.getSession().setAttribute(WORD_TO_GUESS_CONSTANT, wordToGuess);
            request.getSession().setAttribute(ATTEMPTS_CONSTANT, startAttempts);
            request.getSession().setAttribute(GAME_SCORE_CONSTANT, gameScore + finalScorePerWord);
            log(GameController.class, "Current score 2: " + session.getAttribute(GAME_SCORE_CONSTANT));

        }
        request.getSession().setAttribute(GUESSED_WORD_CONSTANT, guess);
        request.getSession().setAttribute(RESULT_CONSTANT, result);

        log(GameController.class, "Attempts are now: " + session.getAttribute(ATTEMPTS_CONSTANT));

        return "redirect:/index";
    }

    //  BUTTONS

    @PostMapping(value = "/save")
    public String giveUpAndSaveScore(final HttpSession session,
                                     final HttpServletRequest request,
                                     @ModelAttribute("score") Score score) {
        score.setGameScore((Integer) session.getAttribute(GAME_SCORE_CONSTANT));
        score.setName((String) session.getAttribute(NAME_CONSTANT));
        score.setSelectedLevelName((String) session.getAttribute(SELECTED_LEVEL_CONSTANT));
        scoreSavingService.saveScore(score);
        request.getSession().invalidate();
        return "index";
    }

    @GetMapping(value = "/scores")
    public String seeScores(final HttpServletRequest request, Model model) {
        List<Score> scoreList = scoreSavingService.getScore(5, 1);
        model.addAttribute("score", scoreList);
        return "scores";
    }

    //  CLOSE SESSION

    @PostMapping(value = "/destroy")
    public String restartGame(final HttpServletRequest request) {


        log(GameController.class, " Session closing. Removing the data.");
        request.getSession().invalidate();
        return "redirect:/index";
    }


    //  EXCEPTION HANDLERS

    @ExceptionHandler(value = ArrayIndexOutOfBoundsException.class)
    public String handleArrayIndexOutOfBoundsException(final Model model) {

        String text = "ERROR: Could not check empty <<guess>>.";
        model.addAttribute("text", text);
        return "ExceptionPage";
    }


    @ExceptionHandler(value = NullPointerException.class)
    public String handleNullPointerException(final Model model) {

        String text = "ERROR: Cannot compare words because <<word to guess>> is null";
        model.addAttribute("text", text);
        return "ExceptionPage";
    }


}
 

index.html 的 Thymeleaf 模板

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
<html lang="en" xmlns:th="www.thymeleaf.org">

<head>
    <meta charset="UTF-8">
    <title>5Letters</title>
    <link th:href="@{/bootstrap.min.css}" rel="stylesheet" />
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Quicksand&display=swap" rel="stylesheet">

</head>

<body>
    <div class="container-sm">
        <div class="col-xs-12" align="center">
            <!--    HEADER  -->
            <img src="https://marisabel.nl/wp-content/uploads/2020/11/avatar-e1606738130828-150x150.png"
                style="margin-top:2vh;">
            <h1 style="margin-top:1vh; color:hotpink;"><b>5Letter Word Game</b></h1>
            <h5>AKA: Lingo.</h5>
            <hr>
        </div>

        <form method="get" th:action="@{/scores}">
            <input type="submit" value="scores" class="btn btn-primary" />
        </form>


        <!--        Set Up Game Form    -->

        <div class="col-xs-12" align="center" th:hidden="${credits} != null">
                <form th:action="@{/loadgame}" th:object="${gameDTO}" method="post">
                    <p>
                        <select class="form-group" th:field="*{lvlName}" id="dropDownList">
                            <option th:each="lvl : ${lvlName}" th:text="${lvl.lvlName}" th:value="${lvl.lvlName}">
                            </option>
                        </select>
                    </p>
                    <p><input type="text" class="form-group mx-sm-3 mb-2" id="name" th:field="*{playerName}"
                            th:placeholder="name" th:value="anonymous" /></p>
                    <p class="alert alert-danger" th:if="${#fields.hasErrors('playerName')}" th:errors="*{playerName}">
                    </p>
                    <p><input type="submit" value="start" class="btn btn-primary" /></p>
                </form>
                <p></p>
        </div>


        <!-- This whole session will load after name and level are chosen. Credits will be set to 3, triggering them to unhide -->

        <div class="row">
            <div class="col-xs-12 col-md-6" align="center" th:hidden="${credits} == null">
                <!--  game information : always show after game setup  -->
                    <h3 th:text="'Hello ' + ${name} + '!'"></h3>
                    <h3 th:text="'Level: '+ ${levelSelected}"></h3>
                    <h2 th:text="'Credits : '+ ${credits} + ' | Score: '+ ${gameScore}"></h2>
                    <h2 th:text="${attempt} + ' / ' + ${attemptStart}"></h2>
            </div>

            <div class="col-md-6" align="center">
                <p>
                    <!--   Result messages and word after guessing   -->
                <h4 th:text="${message}"></h4>
                <h2 id="result" th:text="${result}" th:hidden="${credits} == 0"></h2>
                <!--        GUESS FORM -->
                <form th:action="@{/guess}" th:object="${gameDTO}" method="post" th:hidden="${credits} == null">
                    <input id="guessField" type="text" th:field="*{guess}" placeholder="5letters" />
                    <p></p>
                    <p class="alert alert-danger" th:if="${#fields.hasErrors('guess')}" th:errors="*{guess}"></p>
                    <input type="submit" value="guess" th:disabled="${credits} == 0" class="btn btn-primary" />
                </form>
                </p>
            </div>
        </div>



        <div class="row" style="margin-top:10vh;">
            <div class="row justify-content-center" th:hidden="${credits} == null">
                <div class="col col-lg-2 align-items-center">
                    <!-- Destroy session data and go to index -->
                    <form method="post" th:action="@{/destroy}">
                        <input type="submit" value="play again" class="btn btn-danger" />
                    </form>
                    <p></p>
                </div>
                <div class="col-md-auto align-items-center" width="50%">
                    <!-- Display last typed word -->
                    <h4 th:text="'Your guess was:'" th:hidden="${attempt} == ${attemptStart}"></h4>
                    <h2 id="guess" th:text="${guess}" th:hidden="${attempt} == ${attemptStart}"></h2>
                    <p></p>
                </div>
                <div class="col col-lg-2 align-items-center">
                    <!-- Stops the game if you are bored. Usually needed with EASY mode. -->
                    <form method="post" th:action="@{/save}">
                        <input type="submit" value="i'm tired" class="btn btn-danger" />
                        <p></p>
                    </form>
                </div>
            </div>


        </div>


</body>

</html>

我将隐藏的内容移至其自己的页面。它加载页面,但内容仍然隐藏。即使休息了一会儿,我仍然找不到问题所在。特别是当它在没有验证的情况下 100% 工作时。

Intro:

My app works in the general sense. All as I want. But when I set up validation (and it does work), it won't load all my hidden content. I moved it all to its own page, and it still did not work. So I am asking here with my original set up. I understand it is messy, but I will clean it up once I figure this out.

I can't find anything related to my problem, which makes me think, the way that I am doing it might not be the best approach. So pointers are more than welcome.

Problem:

Adding Validation to my forms breaks my Thymeleaf template. Unable to hide and unhide elements. It looks stuck. But on the terminal, the program does run fine.

My controller

(it's big... I still need to learn how to break it in smaller chunks.)

@Controller
@SessionAttributes({"guess", "word", "result", "level", "attempt", "message", "credits", "name", "gameScore"})
public class GameController {

    private static final String WORD_TO_GUESS_CONSTANT = "WORD_TO_GUESS";
    private static final String GUESSED_WORD_CONSTANT = "GUESSED_WORD";
    private static final String RESULT_CONSTANT = "RESULT_WORD";
    private static final String ATTEMPTS_CONSTANT = "ATTEMPTS";
    private static final String TOTAL_ATTEMPTS_CONSTANT = "TOTAL_ATTEMPTS";
    private static final String MESSAGE_CONSTANT = "MESSAGE";
    private static final String CREDITS_CONSTANT = "CREDITS";
    private static final String SELECTED_LEVEL_CONSTANT = "SELECTED_LEVEL";
    private static final String NAME_CONSTANT = "NAME";
    private static final String GAME_SCORE_CONSTANT = "GAME_SCORE";
    private static final String SCORE_MULTIPLIER_CONSTANT = "SCORE_MULTIPLIER";

    @Autowired
    private RandomWordService randomWord;
    @Autowired
    private WordCheckService checkGuess;
    @Autowired
    private IsWordCorrectService isWordCorrectService;
    @Autowired
    private ScoreSavingService scoreSavingService;

    @ModelAttribute("gameDto")
    public GameDTO guessDTOForm() {
        return new GameDTO();
    }

    @ModelAttribute("score")
    public Score score() {
        return new Score();
    }

//   GAME METHODS

    @GetMapping(value = "/index")
    public String home(Model model,
                       final HttpServletRequest request,
                       final HttpSession session,
                       GameDTO gameDTO,
                       Score score) {
        
        model.addAttribute("name", session.getAttribute(NAME_CONSTANT));
        model.addAttribute("levelSelected", session.getAttribute(SELECTED_LEVEL_CONSTANT));
        model.addAttribute("attempt", session.getAttribute(ATTEMPTS_CONSTANT));
        model.addAttribute("credits", session.getAttribute(CREDITS_CONSTANT));
        model.addAttribute("attemptStart", session.getAttribute(TOTAL_ATTEMPTS_CONSTANT));
        model.addAttribute("guess", session.getAttribute(GUESSED_WORD_CONSTANT));
        model.addAttribute("result", session.getAttribute(RESULT_CONSTANT));
        model.addAttribute("message", session.getAttribute(MESSAGE_CONSTANT));
        model.addAttribute("gameScore", session.getAttribute(GAME_SCORE_CONSTANT));

        model.addAttribute("lvlName", Level.values());

        return "index";
    }

    @PostMapping(value = "/loadgame")
    public String loadWord(
            final HttpSession session, final HttpServletRequest request,
            @ModelAttribute("score") Score score,
            @Valid GameDTO gameDTO, BindingResult bindingResult,
            Model model
    ) throws IOException {

        if (bindingResult.hasErrors()) {
            model.addAttribute("lvlName", Level.values());

            model.addAttribute("name", session.getAttribute(NAME_CONSTANT));
            model.addAttribute("levelSelected", session.getAttribute(SELECTED_LEVEL_CONSTANT));
            model.addAttribute("attempt", session.getAttribute(ATTEMPTS_CONSTANT));
            model.addAttribute("credits", session.getAttribute(CREDITS_CONSTANT));
            model.addAttribute("attemptStart", session.getAttribute(TOTAL_ATTEMPTS_CONSTANT));

            model.addAttribute("guess", session.getAttribute(GUESSED_WORD_CONSTANT));
            model.addAttribute("result", session.getAttribute(RESULT_CONSTANT));

            model.addAttribute("message", session.getAttribute(MESSAGE_CONSTANT));
            model.addAttribute("gameScore", session.getAttribute(GAME_SCORE_CONSTANT));

            return "index";
        }

        //  NEW GAME

        String word = (String) request.getSession().getAttribute(WORD_TO_GUESS_CONSTANT);

        if (word == null) {
            request.getSession().setAttribute(NAME_CONSTANT, gameDTO.getPlayerName());
            request.getSession().setAttribute(ATTEMPTS_CONSTANT, gameDTO.getLvlName().getAttempts());
            request.getSession().setAttribute(WORD_TO_GUESS_CONSTANT, randomWord.selectRandomWord());
            request.getSession().setAttribute(CREDITS_CONSTANT, gameDTO.getCredit());
            request.getSession().setAttribute(SELECTED_LEVEL_CONSTANT, gameDTO.getLvlName().getLvlName());
            request.getSession().setAttribute(TOTAL_ATTEMPTS_CONSTANT, gameDTO.getLvlName().getAttempts());
            request.getSession().setAttribute(GAME_SCORE_CONSTANT, gameDTO.getScore());
            request.getSession().setAttribute(SCORE_MULTIPLIER_CONSTANT, gameDTO.getLvlName().getMultiplier());
            gameDTO.setWord((String) session.getAttribute(WORD_TO_GUESS_CONSTANT));
        }
        model.addAttribute("message", "");


        return "redirect:/index";
    }


    @PostMapping(value = "/guess")
    public String guessWord(
            final HttpSession session,
            final HttpServletRequest request,
            @ModelAttribute("score") Score score,
            @Valid GameDTO gameDTO, BindingResult bindingResult) throws IOException {

        if (bindingResult.hasErrors()) {
            return "index";
        }

        // variables
        int attempts = (int) session.getAttribute(ATTEMPTS_CONSTANT);
        int credits = (int) session.getAttribute(CREDITS_CONSTANT);
        int startAttempts = (int) session.getAttribute(TOTAL_ATTEMPTS_CONSTANT);
        String name = (String) session.getAttribute(NAME_CONSTANT);
        // check word
        String wordToGuess = (String) session.getAttribute(WORD_TO_GUESS_CONSTANT);
        String guess = gameDTO.getGuess();
        String result = checkGuess.resultWord(wordToGuess, guess);
        String lvl = (String) session.getAttribute(SELECTED_LEVEL_CONSTANT);
        // adjust score according to result
        boolean wordIsCorrect = isWordCorrectService.isTheWordCorrect(result, wordToGuess);
        int gameScore = (int) session.getAttribute(GAME_SCORE_CONSTANT);
        int scoreMultiplier = (int) request.getSession().getAttribute(SCORE_MULTIPLIER_CONSTANT);
        int wrongWord = gameDTO.getWrongWord();
        int initialScore = gameDTO.getStartScore();
        int finalScorePerWord = initialScore * scoreMultiplier;

        //   GAME LOGIC

        if (!wordIsCorrect) {
            String message = "";

            message = "Wrong! Try again!";
            request.getSession().setAttribute(MESSAGE_CONSTANT, message);
            request.getSession().setAttribute(ATTEMPTS_CONSTANT, --attempts);
            request.getSession().setAttribute(GAME_SCORE_CONSTANT, gameScore - wrongWord);
            log(GameController.class, "Updated score: " + session.getAttribute(GAME_SCORE_CONSTANT));

            if (attempts == 0) {
                request.getSession().setAttribute(CREDITS_CONSTANT, --credits);
                message = "Sorry, the word was: [ " + session.getAttribute(WORD_TO_GUESS_CONSTANT) + " ]";
                request.getSession().setAttribute(MESSAGE_CONSTANT, message);
                request.getSession().setAttribute(ATTEMPTS_CONSTANT, startAttempts);
                request.getSession().setAttribute(WORD_TO_GUESS_CONSTANT, randomWord.selectRandomWord());
            }

            if (credits == 0) {
                message = "Game over!";
                request.getSession().setAttribute(MESSAGE_CONSTANT, message);
                request.getSession().setAttribute(GAME_SCORE_CONSTANT, gameScore);

                //   SAVE SCORE
                score.setGameScore(gameScore);
                score.setName(name);
                score.setSelectedLevelName(lvl);
                scoreSavingService.saveScore(score);

                log(GameController.class, "Final score: " + session.getAttribute(GAME_SCORE_CONSTANT));
            }

        } else {
            String message = "Correct! Guess another word!";
            wordToGuess = randomWord.selectRandomWord();
            gameDTO.setWord(wordToGuess);
            request.getSession().setAttribute(MESSAGE_CONSTANT, message);
            request.getSession().setAttribute(WORD_TO_GUESS_CONSTANT, wordToGuess);
            request.getSession().setAttribute(ATTEMPTS_CONSTANT, startAttempts);
            request.getSession().setAttribute(GAME_SCORE_CONSTANT, gameScore + finalScorePerWord);
            log(GameController.class, "Current score 2: " + session.getAttribute(GAME_SCORE_CONSTANT));

        }
        request.getSession().setAttribute(GUESSED_WORD_CONSTANT, guess);
        request.getSession().setAttribute(RESULT_CONSTANT, result);

        log(GameController.class, "Attempts are now: " + session.getAttribute(ATTEMPTS_CONSTANT));

        return "redirect:/index";
    }

    //  BUTTONS

    @PostMapping(value = "/save")
    public String giveUpAndSaveScore(final HttpSession session,
                                     final HttpServletRequest request,
                                     @ModelAttribute("score") Score score) {
        score.setGameScore((Integer) session.getAttribute(GAME_SCORE_CONSTANT));
        score.setName((String) session.getAttribute(NAME_CONSTANT));
        score.setSelectedLevelName((String) session.getAttribute(SELECTED_LEVEL_CONSTANT));
        scoreSavingService.saveScore(score);
        request.getSession().invalidate();
        return "index";
    }

    @GetMapping(value = "/scores")
    public String seeScores(final HttpServletRequest request, Model model) {
        List<Score> scoreList = scoreSavingService.getScore(5, 1);
        model.addAttribute("score", scoreList);
        return "scores";
    }

    //  CLOSE SESSION

    @PostMapping(value = "/destroy")
    public String restartGame(final HttpServletRequest request) {


        log(GameController.class, " Session closing. Removing the data.");
        request.getSession().invalidate();
        return "redirect:/index";
    }


    //  EXCEPTION HANDLERS

    @ExceptionHandler(value = ArrayIndexOutOfBoundsException.class)
    public String handleArrayIndexOutOfBoundsException(final Model model) {

        String text = "ERROR: Could not check empty <<guess>>.";
        model.addAttribute("text", text);
        return "ExceptionPage";
    }


    @ExceptionHandler(value = NullPointerException.class)
    public String handleNullPointerException(final Model model) {

        String text = "ERROR: Cannot compare words because <<word to guess>> is null";
        model.addAttribute("text", text);
        return "ExceptionPage";
    }


}
 

Thymeleaf template for index.html

<!DOCTYPE html SYSTEM "http://www.thymeleaf.org/dtd/xhtml1-strict-thymeleaf-4.dtd">
<html lang="en" xmlns:th="www.thymeleaf.org">

<head>
    <meta charset="UTF-8">
    <title>5Letters</title>
    <link th:href="@{/bootstrap.min.css}" rel="stylesheet" />
    <link rel="preconnect" href="https://fonts.googleapis.com">
    <link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
    <link href="https://fonts.googleapis.com/css2?family=Quicksand&display=swap" rel="stylesheet">

</head>

<body>
    <div class="container-sm">
        <div class="col-xs-12" align="center">
            <!--    HEADER  -->
            <img src="https://marisabel.nl/wp-content/uploads/2020/11/avatar-e1606738130828-150x150.png"
                style="margin-top:2vh;">
            <h1 style="margin-top:1vh; color:hotpink;"><b>5Letter Word Game</b></h1>
            <h5>AKA: Lingo.</h5>
            <hr>
        </div>

        <form method="get" th:action="@{/scores}">
            <input type="submit" value="scores" class="btn btn-primary" />
        </form>


        <!--        Set Up Game Form    -->

        <div class="col-xs-12" align="center" th:hidden="${credits} != null">
                <form th:action="@{/loadgame}" th:object="${gameDTO}" method="post">
                    <p>
                        <select class="form-group" th:field="*{lvlName}" id="dropDownList">
                            <option th:each="lvl : ${lvlName}" th:text="${lvl.lvlName}" th:value="${lvl.lvlName}">
                            </option>
                        </select>
                    </p>
                    <p><input type="text" class="form-group mx-sm-3 mb-2" id="name" th:field="*{playerName}"
                            th:placeholder="name" th:value="anonymous" /></p>
                    <p class="alert alert-danger" th:if="${#fields.hasErrors('playerName')}" th:errors="*{playerName}">
                    </p>
                    <p><input type="submit" value="start" class="btn btn-primary" /></p>
                </form>
                <p></p>
        </div>


        <!-- This whole session will load after name and level are chosen. Credits will be set to 3, triggering them to unhide -->

        <div class="row">
            <div class="col-xs-12 col-md-6" align="center" th:hidden="${credits} == null">
                <!--  game information : always show after game setup  -->
                    <h3 th:text="'Hello ' + ${name} + '!'"></h3>
                    <h3 th:text="'Level: '+ ${levelSelected}"></h3>
                    <h2 th:text="'Credits : '+ ${credits} + ' | Score: '+ ${gameScore}"></h2>
                    <h2 th:text="${attempt} + ' / ' + ${attemptStart}"></h2>
            </div>

            <div class="col-md-6" align="center">
                <p>
                    <!--   Result messages and word after guessing   -->
                <h4 th:text="${message}"></h4>
                <h2 id="result" th:text="${result}" th:hidden="${credits} == 0"></h2>
                <!--        GUESS FORM -->
                <form th:action="@{/guess}" th:object="${gameDTO}" method="post" th:hidden="${credits} == null">
                    <input id="guessField" type="text" th:field="*{guess}" placeholder="5letters" />
                    <p></p>
                    <p class="alert alert-danger" th:if="${#fields.hasErrors('guess')}" th:errors="*{guess}"></p>
                    <input type="submit" value="guess" th:disabled="${credits} == 0" class="btn btn-primary" />
                </form>
                </p>
            </div>
        </div>



        <div class="row" style="margin-top:10vh;">
            <div class="row justify-content-center" th:hidden="${credits} == null">
                <div class="col col-lg-2 align-items-center">
                    <!-- Destroy session data and go to index -->
                    <form method="post" th:action="@{/destroy}">
                        <input type="submit" value="play again" class="btn btn-danger" />
                    </form>
                    <p></p>
                </div>
                <div class="col-md-auto align-items-center" width="50%">
                    <!-- Display last typed word -->
                    <h4 th:text="'Your guess was:'" th:hidden="${attempt} == ${attemptStart}"></h4>
                    <h2 id="guess" th:text="${guess}" th:hidden="${attempt} == ${attemptStart}"></h2>
                    <p></p>
                </div>
                <div class="col col-lg-2 align-items-center">
                    <!-- Stops the game if you are bored. Usually needed with EASY mode. -->
                    <form method="post" th:action="@{/save}">
                        <input type="submit" value="i'm tired" class="btn btn-danger" />
                        <p></p>
                    </form>
                </div>
            </div>


        </div>


</body>

</html>

I moved the content I was hiding to its own page. It loads the page, but the content remains hidden. Even after taking a break I am still unable to find what is wrong. Specially when it works 100% without validation.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文