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

Представление формы заказа предоставляется шаблоном Thymeleaf с именем orderForm.html, который показан далее.

Листинг 2.7 Вид формы заказа тако

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

   <form method="POST" th:action="@{/orders}" th:object="${order}">

      <h1>Order your taco creations!</h1>

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

     <a th:href="@{/design}" id="another">Design another taco</a><br/>

     <div th:if="${#fields.hasErrors()}">

        <span class="validationError">

           Please correct the problems below and resubmit.

         </span>

      </div>

      <h3>Deliver my taco masterpieces to...</h3>

      <label for="name">Name: </label>

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

      <br/>

      <label for="street">Street address: </label>

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

      <br/>

      <label for="city">City: </label>

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

      <br/>

      <label for="state">State: </label>

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

      <br/>

      <label for="zip">Zip code: </label>

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

      <br/>

      <h3>Here's how I'll pay...</h3>

      <label for="ccNumber">Credit Card #: </label>

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

      <br/>

      <label for="ccExpiration">Expiration: </label>

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

      <br/>

      <label for="ccCVV">CVV: </label>

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

      <br/>

      <input type="submit" value="Submit order"/>

   </form>

</body>

</html>

По большей части, orderForm.html отображение - это типичный HTML/Thymeleaf контент, с очень небольшим количеством заметок. Но обратите внимание, что тег <form> здесь отличается от тега <form>, используемого в листинге 2.3, тем, что он также определяет действие формы. Без указанного действия форма отправит запрос HTTP POST обратно на тот же URL-адрес, что и форма. Но здесь вы указываете, что форма должна заPOSTедь в /orders (используя оператор Thymeleaf @{...} для относительного контекста).

Поэтому в класс OrderController необходимо добавить еще один метод, обрабатывающий POST-запросы для /orders. У вас не будет способа сохранять заказы до следующей главы, поэтому поставим заглушку здесь-что-то вроде той, что вы видите в следующем листинге:

Листинг 2.8 обработка отправки заказа тако

@PostMapping

public String processOrder(Order order) {

   log.info("Order submitted: " + order);

   return "redirect:/";

}

При вызове метода processOrder() для обработки отправленного заказа ему присваивается объект Order, свойства которого привязаны к полям отправленной формы. Order, как и Taco, является довольно простым классом,который несет информацию о заказе.

Листинг 2.9 доменный объект для заказов тако

package tacos;

import javax.validation.constraints.Digits;

import javax.validation.constraints.Pattern;

import org.hibernate.validator.constraints.CreditCardNumber;

import org.hibernate.validator.constraints.NotBlank;

import lombok.Data;

@Data

public class Order {

   private String name;

   private String street;

   private String city;

   private String state;

   private String zip;

   private String ccNumber;

   private String ccExpiration;

   private String ccCVV;

}

Теперь, когда вы разработали OrderController и представление формы заказа, вы готовы испытать его. Откройте браузер, с адресом http://localhost:8080/design, выберите некоторые ингредиенты для вашего тако,и нажмите кнопку Submit Your Taco. Вы должны увидеть форму, подобную показанной на рис. 2.3.

Заполните некоторые поля формы и нажмите кнопку Submit Order. И следите за логами приложений, чтобы увидеть информацию о вашем заказе. Когда я нажал, запись лога выглядела примерно так (переформатирована, чтобы соответствовать ширине этой страницы):

Order submitted: Order(name=Craig Walls,street1=1234 7th Street, city=Somewhere, state=Who knows?, zip=zipzap, ccNumber=Who can guess?, ccExpiration=Some day, ccCVV=See-vee-vee)

Если вы внимательно посмотрите на запись лога из моего тестового заказа, вы увидите, что хотя метод processOrder() выполнил свою работу и обработал отправку формы, он позволил пройти немного не корректной информации. Большинство полей в форме содержат данные, которые не могут быть правильными. Давайте добавим некоторую проверку, чтобы убедиться, что предоставленные данные по крайней мере похожи на требуемую информацию.