У меня было несколько человек, которые недавно спрашивали меня о том, как Spring Roo работает с Web Flow. Да, есть команда установки, но что вы делаете оттуда? Я написал часть Roo в действии, чтобы решить эту проблему, но поскольку потребуется несколько месяцев, чтобы донести его до MEAP, я подумал, что быстрая запись в блоге была бы полезна.
Предварительные
Хорошо, давайте удостоверимся, что мы все на одной странице. В примерах, которые я здесь описываю, используется 1.1.0.M3, хотя те же концепции применимы и к версии 1.0.2. Самым большим отличием являются теги JSPX, которые команда Roo установила с тех пор. Я также использую постоянство, так что давайте настроим механизм сохранения, если вы взламываете меня.
Установка веб-потока
Это легко. Просто введите «web-поток» в командной оболочке, и он настроит его для вас. Движок добавит зависимости в файл maven pom.xml, настроит параметры веб-потока в файле webflow-config.xml в каталоге WEB-INF / spring. Он также удалит хороший пример веб-потока в каталог WEB-INF / views / sampleflow. Если вы запустите свое приложение, вы также увидите, что в меню есть пункт меню «Enter Sampleflow WebFlow».
Что это значит для меня?
Хорошо, теперь вы становитесь дерзкими, заголовок HTML h3 — я думаю, что мои читатели более терпеливы, чем вы. * Гм * Хорошо, поэтому, если вы уже являетесь экспертом по веб-потокам, вы готовы к работе, перейдите к «Я уже эксперт по веб-потокам!» Для остальных из вас сначала прочтите этот краткий учебник.
Web Flow — это шаблон конечного автомата, реализованный в виде очень умного контроллера в Spring MVC. Вы определяете «определение веб-потока» в файле XML, которое определяется серией состояний и переходов. Если вы можете изобразить блок-схему того, как веб-приложение должно перемещаться по системе, вы можете преобразовать эту блок-схему непосредственно в определение веб-потока.
Возьмите пример потока, установленного Roo при его настройке, sampleflow. Файл веб-потока, не очень хорошо названный, называется ‘config-flow.xml’:
<!--?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">
<!-- Is your flow persistent? -->
<!-- <persistence-context /> -->
<!-- A sample view state -->
<view-state id="view-state-1">
<transition on="success" to="view-state-2"/>
<transition on="cancel" to="end-state"/>
</view-state>
<view-state id="view-state-2">
<transition on="cancel" to="end-state"/>
</view-state>
<!-- A sample end state -->
<end-state id="end-state" view="end-state"/>
</flow>
Просто посмотрите на этот файл на минуту. Вам действительно не нужно понимать обширный и сложный API для его интерпретации. Представление определяется тремя состояниями — view-state-1, view-state-2 и end-state. В view-state-1 определены два перехода — один с именем события «success» и один с именем события «cancel» — каждый из этих переходов приводит вас в одно из других состояний. Состояние представления — это состояние, которое отображает представление (файл JSPX) и ожидает вашего следующего представления, чтобы выяснить, какое имя события вы хотите оценить. Итак, если вы разрабатываете страницу для отображения для view-state-1, метко названную view-state-1.jspx, она должна дать вам два действия, каждое из которых должно вызвать событие, разрешенное этим состоянием.
Знакомство с View, Знакомство с View …
Хватит съеживаться. Мое чувство юмора искажено этим утром. Но, вы спросили, вот оно — состояние представления — это один из тех файлов представления Roo JSPX, который активно использует библиотеки тегов. Сканируйте файл view-state-1.jspx ниже, и вы увидите две кнопки со специальными именами, все они публикуются в форме без URL:
<div xmlns:spring="http://www.springframework.org/tags"
xmlns:fn="http://java.sun.com/jsp/jstl/functions"
xmlns:util="urn:jsptagdir:/WEB-INF/tags/util"
xmlns:jsp="http://java.sun.com/JSP/Page"
version="2.0">
<jsp:output omit-xml-declaration="yes" />
<spring:message var="title" code="webflow_state1_title" />
<util:panel id="title" title="${title}">
<h1>${fn:escapeXml(title)}</h1>
<p>
<spring:message code="webflow_state1_message" />
</p>
<form method="POST">
<div class="submit">
<spring:message var="cancel" code="button_cancel" />
<spring:message var="proceed" code="button_proceed" />
<input type="submit" id="cancel"
name="_eventId_cancel" value="${fn:escapeXml(cancel)}" />
<input type="submit" id="success"
name="_eventId_success" value="${fn:escapeXml(proceed)}" />
</div>
</form>
</util:panel>
</div>
Вы видели две кнопки отправки внизу страницы в строках 17 и 19? У каждого было имя, соответствующее имени события перехода в документе XML-потока. Также обратите внимание, что форма не имеет адреса — в HTML, когда вы пропускаете адрес, она просто отправляет обратно самому себе, тем самым возвращаясь к веб-потоку и оценивая представленные значения. Поскольку вы можете нажать только две кнопки — _eventId_cancel и _eventId_success, у вас есть два результата, которые хорошо соответствуют двум переходам.
Подробнее о Web Flow
Web Flow задокументирован с помощью руководства пользователя SpringSource, и есть несколько книг по этому вопросу, включая Spring In Action Крейга Уоллса , в которой MEAP охватывает Spring 3. SpringSource также проводит обучение по всем веб-технологиям на основе Spring в Весенний Богатый веб-курс . Раскрытие информации — мой работодатель, Chariot Solutions , является партнером по обучению SpringSource, и мы добавим этот курс к началу следующего года. Существует также пользовательский форум . Я упустил кучу информации, потому что большую часть своего времени я пишу для самой книги, и что у меня почти нет времени или места, чтобы отдать ей должное. Однако имейте в виду следующие ключевые вещи:
- Существует несколько типов состояний, включая действие (логика выполнения), решение (если / тогда) и подпоток
- Веб-поток отслеживает, над каким потоком вы работаете, используя идентификатор выполнения, который вы увидите в конце URL-адреса. Существует переменная, к которой вы можете получить доступ в JSP, $ {flowExecutionKey}, которую вам нужно использовать как _flowExecutionKey, если вы пишете свои собственные URL-адреса в гиперссылках (важно, только если вы не отправляете обратно в ту же форму).
- Вы хотите использовать Web Flow, когда у вас многоэтапный процесс, и Spring MVC, если у вас его нет. У потоков есть несколько способов хранения промежуточных данных, таких как «область действия потоков», и вы не хотите тратить драгоценную память на хранение вещей там, если вам это не нужно. Как и во всех веб-приложениях, сначала подумайте о состоянии без состояния, а затем вернитесь в нужное состояние.
Итак, вот и все. В книге Roo мы расскажем больше о том, как правильно работать с библиотеками тегов для создания правильных ссылок, а также о примере (который в настоящее время в любом случае) включает в себя простой поток корзины покупок и граф объектов на основе JPA для сохранения потока. На этой неделе мы выпускаем обновленный MEAP, который включает главу Spring MVC, поэтому, если вы хотите узнать о контроллере Roo и технологиях просмотра и о том, как функционируют теги, вы можете найти эту информацию там.
Я уже эксперт по веб-потоку!
Тогда вы можете начать! Просто удалите новые потоки в WEB-INF / views и убедитесь, что вы включили файл views.xml, чтобы Tiles мог найти ваши файлы. Кстати, Tiles недавно начал использовать подстановочные знаки, так что вы можете сделать что-то вроде этого в потоке, заменив путь в put-attribute на ваш собственный в значении ниже:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE tiles-definitions PUBLIC "-//Apache Software Foundation//DTD Tiles Configuration 2.1//EN" "http://tiles.apache.org/dtds/tiles-config_2_1.dtd">
<tiles-definitions>
<definition extends="default" name="*">
<put-attribute name="body" value="/WEB-INF/views/cart/{1}.jspx"/>
</definition>
</tiles-definitions>
Сделайте это, и вы сможете добавлять новые файлы в поток по своему усмотрению, не трогая определение ваших плиток.
Наслаждайтесь, ребята, и извините, если это работает немного бессвязно. Это всего лишь свалка мозгов …