Зміст
Щоб продемонструвати ще один "хитрий" трюк, трохи ускладнимо завдання, додавши обмеження на імена: якщо користувач вводить ім'я, яке містить менше 3-х символів, то йому відображається сторінка з текстом "Ім'я повинно бути довше двох символів". Для цього змінимо userflow.xml, додавши в дію createUser транзакцію tooShortUsername:
<action-state id="createUser">
<evaluate result="user" expression=
"hellojohnFlowActions.createUser(requestParameters.name)" />
<transition to="tooShortUsername" on-exception=
"com.seostella.swfhellojohn.flow.TooShortUsernameException" />
<transition to="userReady" />
</action-state>
і ще один стан-відображення tooShortUsername:
<view-state id="tooShortUsername">
<transition to="welcome" />
</view-state>
Так як стан tooShortUsername є відображенням, то створимо файл tooShortUsername.jspx:
<html xmlns:jsp="http://java.sun.com/JSP/Page"
xmlns:form="http://www.springframework.org/tags/form">
<jsp:output omit-xml-declaration="yes"/>
<jsp:directive.page contentType="text/html;charset=UTF-8" />
<head>
<title>Hello John - Spring Web Flow 2.x Tutorial | seostella.com</title>
</head>
<body>
<h2>Error!</h2>
<p>Too short username. Username should be at least 3 characters.</p>
<form:form>
<input type="submit" name="_eventId_welcome"
value="Try Again!" />
</form:form>
</body>
</html>
Повний лістинг файлу user-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">
<var name="user" class="com.seostella.swfhellojohn.domain.User"/>
<view-state id="welcome">
<transition on="nameEntered" to="createUser"/>
</view-state>
<action-state id="createUser">
<evaluate result="user" expression=
"hellojohnFlowActions.createUser(requestParameters.name)" />
<transition to="tooShortUsername" on-exception=
"com.seostella.swfhellojohn.flow.TooShortUsernameException" />
<transition to="userReady" />
</action-state>
<view-state id="tooShortUsername">
<transition to="welcome" />
</view-state>
<end-state id="userReady">
<output name="user" />
</end-state>
</flow>
Транзакція tooShortUsername означає наступне - якщо при виконанні операції hellojohnFlowActions.createUser(requestParameters.name) сталося виключення типу com.seostella.swfhellojohn.flow.TooShortUsernameException, то відбувається перехід на стан tooShortUsername. На даний момент в методі createUser виключення TooShortUsernameException відбуватися не може. Оголосимо клас TooShortUsernameException:
package com.seostella.swfhellojohn.flow;
@SuppressWarnings("serial")
public class TooShortUsernameException extends Exception {
public TooShortUsernameException() {}
public TooShortUsernameException(String message) {
super(message);
}
}
Нам також необхідно модифікувати метод createUser класу HellojohnFlowActions. Тепер він буде виглядати так:
public User createUser(String name) throws TooShortUsernameException{
if (name != null && name.length() > 2) {
User user = new User(name);
return user;
} else {
throw new TooShortUsernameException();
}
}
Все, програма написана. Зараз якщо користувач введе менше 3-х символів в текстовому полі, то він побачить сторінку tooShortUsername.jspx:
Рис 5. Сторінка tooShortUsername.jspx
Код модифікованої веб-програми доступний за наступною адресою - Завантажити код Spring Web Flow HelloJohn Mod
На завершення наведемо схему переходів між станами для полегшення розуміння принципів (зображення клікабельне):
< | Spring Web Flow. Hi John! Частина 2. Написання програми |