Содержание
Чтобы продемонстрировать еще один "хитрый" трюк, немного усложним задачу, добавив ограничение на имена: если пользователь вводит имя, которое содержит меньше 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. Создание приложения |