"Сколько людей - столько и мнений" любила повторять моя школьная учительница по английскому языку. Мнения - информция. "Кто владеет информацией - владеет миром". Вот и напишем приложение, которое будет накапливать в себе мнения людей по определенным вопросам. :) Причем, чтобы мнения были независимы, пусть пользователи не могут узнать мнения других людей, пока не выскажут свое.
Таким образом бизнесс-процесс нашего приложения примерно следующий:
- Узнать сколько уже существует мнений (чтобы пользователь знал, что после его участия в опросе, он сможет прочитать сотни мнений других людей)
- Показать пользователю страничку, содержащую поле ввода его мнения, кнопку его отправки и счетчик существующих мнений
- Если пользователь всё сделал правильно - поблагодарить его и показать список существующих мнений
Конечно, нужно было бы предусмотреть хоть какие-либо случаи, когда что-то пойдет не так. Но это же простейшая реализация flow - так что остановимся на этом.
Приступим к реализации. Предпологаю, что фреймворк Grails у вас уже скачан и распакован, GRAILS_HOME и JAVA_HOME указывают в нужные каталоги и PATH подправлен.
Начало
В консоли вводим:
grails create-app simpleFlowВ результате выполнения этой строки мы получаем заготовку нашего будущего приложения. В Grails 2 поддержка Web Flow по умолчанию выключена. Чтобы это исправить подключим плагин webflow, введя комманду:
grails install-plugin webflowДоменный уровень
С какими сущностями работает наше приложение? Да собственно только с одной - cообщение. Вот и создадим доменный класс Message:
grails create-domain-class simpleflow.MessageДобавим к этому классу поле text. Пусть его длина будет больше 5, дабы если и писали матюки, то хоть изощренные, и меньше 100.
Получим следующее:
class Message implements Serializable {
String text
static constraints = {
text size: 5..100
}
}
КонтроллерыТут - самое интересное. Создадим контроллер, который будет обеспечивать работу нашего процесса. Назовем его SimpleController:
grails create-controller simpleflow.SimpleОписываем приведенный выше процесс. Начальным состоянием - состоянием, в котором будет процесс, когда пользователь обратиться к нему - будет entryPoint. Конечным состоянием - displayList. На самом деле описание процесса более чем тривиально, так что просто приведу код класса SimpleController, который получился у меня:
class SimpleController {
def index() {
redirect(action:'world')
}
def worldFlow = {
entryPoint {
action {
[count:Message.count()]
}
on("success").to "enterMessage"
}
enterMessage {
on("submit") {
def m = new Message(text:params.text)
if(!m.validate()) return error()
m.save()
}.to "getList"
}
getList {
action {
[messageList:Message.list()]
}
on("success").to "displayList"
}
displayList()
}
}
entryPoint и getList - это action-состояния. У них нет визуального отображения - они нужны только для того, чтобы сделать какие-либо действия. Для enterMessage и displayList создадим 2 gsp-страницы.Представления
1. Страница views/simple/world/enterMessage.gsp:
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<meta name="layout" content="main">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>What do you think about this world?</title>
</head>
<body>
<div class="content" role="main">
<h1>What do you think about this world?</h1>
<g:form action="world" method="post">
<fieldset class="form">
<input type="text" name='text'/>
<g:submitButton name="submit" value="Submit"/>
<br /><small>We have ${count} opinions!</small>
</fieldset>
</g:form>
</div>
</body>
</html>
2. Страница view/simple/world/displayList.gsp:
<%@ page contentType="text/html;charset=UTF-8" %>
<html>
<head>
<meta name="layout" content="main">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Our meanings</title>
</head>
<body>
<div class="content" role="main">
<h1>Thank you!</h1>
Here is what other peoples think about this world:
<table>
<thead>
<tr>
<g:sortableColumn property="text" title="Meanings" />
</tr>
</thead>
<tbody>
<g:each in="${messageList}" status="i" var="message">
<tr class="${(i % 2) == 0 ? 'even' : 'odd'}">
<td>
${fieldValue(bean: message, field: "text")}
</td>
</tr>
</g:each>
</tbody>
</table>
</div>
</body>
</html>
Всё! Делаем grails run-app, вводим в браузере http://localhost:8080/SimpleFlow/simple/world и играемся результатом. Конечно, это с очень большой натяжкой можно назвать законченым результатом, но главное мы уже сделали - подружили Grails и Spring Web Flow. :)
Комментариев нет:
Отправить комментарий
Примечание. Отправлять комментарии могут только участники этого блога.