Выбрать главу

<div>

   <input name="ingredients" type="checkbox" value="FLTO" />

   <span>Flour Tortilla</span><br/>

</div>

В конечном счете, предыдущий фрагмент Thymeleaf является лишь частью более крупной HTML-формы, через которую ваши творцы тако представят свои вкусные творения.  Полный шаблон Thymeleaf, включая все типы ингредиентов и форму, показан в следующем списке.

Листинг 2.3 Полный вид страницы дизайна тако

<!DOCTYPE html>

<html xmlns="http://www.w3.org/1999/xhtml"

 xmlns:th="http://www.thymeleaf.org">

 <head>

   <title>Taco Cloud</title>

   <link rel="stylesheet" th:href="@{/styles.css}" />

 </head>

 <body>

   <h1>Design your taco!</h1>

   <img th:src="@{/images/TacoCloud.png}"/>

   <form method="POST" th:object="${design}">

     <div class="grid">

       <div class="ingredient-group" id="wraps">

         <h3>Designate your wrap:</h3>

         <div th:each="ingredient : ${wrap}">

           <input name="ingredients" type="checkbox" th:value="${ingredient.id}"/>

           <span th:text="${ingredient.name}">INGREDIENT</span><br/>

         </div>

       </div>

       <div class="ingredient-group" id="proteins">

         <h3>Pick your protein:</h3>

         <div th:each="ingredient : ${protein}">

         <input name="ingredients" type="checkbox" th:value="${ingredient.id}"/>

         <span th:text="${ingredient.name}">INGREDIENT</span><br/>

       </div>

     </div>

     <div class="ingredient-group" id="cheeses">

       <h3>Choose your cheese:</h3>

       <div th:each="ingredient : ${cheese}">

             <input name="ingredients" type="checkbox" th:value="${ingredient.id}"/>

       <span th:text="${ingredient.name}">INGREDIENT</span><br/>

       </div>

   </div>

   <div class="ingredient-group" id="veggies">

     <h3>Determine your veggies:</h3>

     <div th:each="ingredient : ${veggies}">

      <input name="ingredients" type="checkbox" th:value="${ingredient.id}"/>

      <span th:text="${ingredient.name}">INGREDIENT</span><br/>

    </div>

   </div>

   <div class="ingredient-group" id="sauces">

     <h3>Select your sauce:</h3>

     <div th:each="ingredient : ${sauce}">

       <input name="ingredients" type="checkbox" th:value="${ingredient.id}"/>

       <span th:text="${ingredient.name}">INGREDIENT</span><br/>

     </div>

   </div>

 </div>

 <div>

   <h3>Name your taco creation:</h3>

   <input type="text" th:field="*{name}"/>

   <br/>

   <button>Submit your taco</button>

 </div>

</form>

</body>

</html>

Как вы можете видеть, вы повторяете фрагмент <div> для каждого из типов ингредиентов. И вы включаете кнопку отправки и поле, где пользователь может назвать свое тако-творение.

Также стоит отметить, что полный шаблон включает в себя изображение логотипа Taco Cloud и ссылку на таблицу стилей(Содержание таблицы стилей не имеет отношения к нашему обсуждению; она содержит только стиль, чтобы представить ингредиенты в двух столбцах вместо одного длинного списка ингредиентов) в обоих случаях оператор @{} используется для создания относительного к контексту пути к статическим артефактам, на которые они ссылаются. Как вы узнали из главы 1, статическое содержимое в приложении Spring Boot подается из каталога /static в корне пути к классам.

Теперь, когда ваш контроллер и визуальная часть полностью готовы, вы можете запустить приложение, чтобы увидеть плоды вашего труда. Существует множество способов запуска приложения Spring Boot. В главе 1 я показал вам, как запустить приложение, сначала создав его в исполняемый файл JAR, а затем запустив JAR с java-jar. Я также показал, как запустить приложение непосредственно из сборки с помощью mvn spring-boot:run.

Независимо от того, как вы запустите приложение Taco Cloud, как только оно запустится, укажите браузеру http://localhost:8080/design. Вы должны увидеть страницу, которая выглядит примерно как на рисунке 2.2.

Рисунок 2.2 Страница тако-создания

Это выглядит замечательно! Творцам тако, посетившим ваш сайт, предоставляется форма, содержащая палитру ингредиентов тако, из которых они могут создать свой шедевр. Но что происходит, когда они нажимают кнопку Submit Your Taco?

Ваш DesignTacoController еще не готов принять созданный тако. Если форма дизайна отправлена, пользователю будет представлена ошибка. (В частности, это будет ошибка HTTP 405: метод запроса "POST" не поддерживается.) Давайте исправим это, написав еще один код контроллера, который обрабатывает отправку формы.

2.2 Обработка отправки формы

Если еще раз взглянуть на тег <form> в представлении, можно увидеть, что его атрибут method имеет значение POST. Кроме того, <form> не объявляет атрибут action. Это означает, что когда форма будет отправлена, браузер соберет все данные в форме и отправит ее на сервер в запросе HTTP POST к тому же пути, для которого запрос GET отобразил форму—путь /design.