Главная » Spring » Оформление заказа Spring

0

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

Как показано на рис. 9.4, центральное положение в подпоследо- вательности оформления заказа занимает состояние showOrder. Это первое состояние, которое видит пользователь после входа в после- довательность, и в это же состояние он попадает после добавления очередной пиццы. Оно отображает текущее состояние заказа и пред- лагает добавить в заказ еще одну пиццу.

Рис. 9.4. Подпоследовательность добавления пиццы в заказ

После того как пользователь щелкнет на кнопке, чтобы добавить пиццу в заказ, последовательность перейдет к состоянию createPizza. Это еще одно состояние-представление, дающее возможность вы- брать размер пиццы и добавки. С этого момента у пользователя по- является возможность выбирать – добавить еще одну пиццу или отменить заказ. В любом случае последовательность вернется в со- стояние showOrder.

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

Как эта диаграмма выражается в терминах определения последо- вательности Spring Web Flow, показано в листинге 9.8.

Листинг 9.8. Состояния-представления в подпоследовательности оформления заказа

<?xml  version="1.0"  encoding="UTF-8"?>

<flow      xmlns="http://www.springframework.org/schema/webflow" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/webflow http://www.springframework.org/schema/webflow/spring-webflow-2.0.xsd">

<input name="order" required="true" />

<view-state id="showOrder">

<transition on="createPizza" to="createPizza" />

<transition  on="checkout"  to="orderCreated"  />

<transition  on="cancel"  to="cancel"  />

</view-state>

<view-state id="createPizza" model="flowScope.pizza">

<on-entry>

<set name="flowScope.pizza"

value="new  com.springinaction.pizza.domain.Pizza()"  />

<evaluate  result="viewScope.toppingsList"  expression= "T(com.springinaction.pizza.domain.Topping).asList()"   />

</on-entry>

<transition  on="addPizza"  to="showOrder">

<evaluate  expression="order.addPizza(flowScope.pizza)"  />

</transition>

<transition on="cancel" to="showOrder" />

</view-state>

<end-state  id="cancel"  />

<end-state  id="orderCreated"  />

</flow>

Эта подпоследовательность оперирует объектом Order, созданным в главной последовательности. То есть необходим некоторый спо- соб передачи объекта Order из главной последовательности в под- последовательность. В листинге 9.1 для этой цели использовался элемент <input>. Здесь этот же элемент используется для приема объекта Order. Если провести аналогии этой подпоследовательности с методами в языке Java, элемент <input> в данном случае фактиче- ски определяет сигнатуру подпоследовательности. Эта последова- тельность принимает один обязательный параметр с именем order.

Далее следует определение состояния showOrder, основное состоя- ние-представление с тремя различными переходами: один ведет к соз- данию пиццы, один – к отправке заказа и один – к отмене заказа.

Состояние createPizza гораздо интереснее. Это представление яв- ляется формой, добавляющей новый объект Pizza в заказ. Элемент

<on-entry> добавляет в область видимости последовательности новый объект Pizza, который будет заполнен после отправки формы поль- зователем. Обратите внимание, что атрибут model этого состояния ссылается на тот же самый объект Pizza. Он будет связан с формой создания пиццы, представленной в листинге 9.9 ниже.

Листинг 9.9. Форма добавления пиццы в заказ, связанная с объектом в области видимости последовательности

<div   xmlns:form="http://www.springframework.org/tags/form" xmlns:jsp="http://java.sun.com/JSP/Page">

<jsp:output  omit-xml-declaration="yes"/>

<jsp:directive.page  contentType="text/html;charset=UTF-8"  />

<h2>Create  Pizza</h2>

<form:form commandName="pizza">

<input   type="hidden"   name="_flowExecutionKey" value="${flowExecutionKey}"/>

<b>Size: </b><br/>

<form:radiobutton  path="size"

label="Small (12-inch)" value="SMALL"/><br/>

<form:radiobutton  path="size"

label="Medium (14-inch)" value="MEDIUM"/><br/>

<form:radiobutton  path="size"

label="Large (16-inch)" value="LARGE"/><br/>

<form:radiobutton  path="size"

label="Ginormous (20-inch)" value="GINORMOUS"/>

<br/>

<br/>

<b>Toppings:  </b><br/>

<form:checkboxes  path="toppings"  items="${toppingsList}" delimiter="&lt;br/&gt;"/><br/><br/>

<input   type="submit"   class="button" name="_eventId_addPizza" value="Continue"/>

<input   type="submit"   class="button" name="_eventId_cancel" value="Cancel"/>

</form:form>

</div>

Когда форма будет отправлена щелчком на кнопке Continue (Продолжить), размер пиццы и выбранные добавки будут сохране- ны в объекте Pizza, и последовательность выполнит переход addPizza. Элемент <evaluate>, связанный с этим переходом, указывает, что объ- ект Pizza должен быть передан в вызов метода addPizza() объекта order перед переходом к состоянию showOrder.

В этой последовательности имеются два пути, ведущих к завер- шению. В представлении showOrder пользователь может щелкнуть на кнопке Cancel (Отмена) или Checkout (Оформить). В любом случае последовательность перейдет в одно из двух конечных состояний. Атрибут id конечного состояния определяет событие, которое будет возбуждено, и в конечном счете следующий этап в главной после- довательности. Главная последовательность выполнит переход либо к состоянию cancel, либо к состоянию orderCreated.

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

Источник:   Уоллс К., Spring в действии. – М.: ДМК Пресс, 2013. – 752 с.: ил.

По теме:

  • Комментарии