Spring Web Flow. Тесты. Часть 4. Flow Авторизации

января
18
2012
Метки: spring spring web flow

Содержание

Рассматриваемый в этой части flow отвечает за авторизацию пользователя перед прохождением тестирования. Процедура авторизации упрощена настолько, насколько это возможно и не может быть применена в реальных проектах. Итак, по традиции приведем листинг user-flow.xml:

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.swftests.domain.User"/>

    <view-state id="welcome">
        <transition on="nameEntered" to="getUser"/>
    </view-state>
  
    <action-state id="getUser">
        <evaluate result="user" expression=
            "testsFlowActions.getUser(requestParameters.name)" />
        <transition to="tooShortUsername" on-exception=
            "com.seostella.swftests.flow.exception.user.TooShortUsernameException" />
        <transition to="addUser" on-exception=
            "com.seostella.swftests.flow.exception.user.UserNotFoundException" />
        <transition to="userReady" />
    </action-state>  
    
    <view-state id="tooShortUsername">
        <transition to="welcome" />
    </view-state>
  
    <view-state id="addUser">
        <transition on="newUsernameEntered" to="createUser"/>
    </view-state>
    
    <action-state id="createUser">
        <evaluate result="user" expression=
            "testsFlowActions.createUser(requestParameters.name)" />
        <transition to="tooShortUsername" on-exception=
            "com.seostella.swftests.flow.exception.user.TooShortUsernameException" />
        <transition to="userReady" />
    </action-state>
    
    <end-state id="userReady">
        <output name="user" />
    </end-state>
</flow>


    <var name="user" class="com.seostella.swftests.domain.User"/>

- объявляется объект user класса com.seostella.swftests.domain.User во время старта user-flow.


    <view-state id="welcome">
        <transition on="nameEntered" to="getUser"/>
    </view-state>

- состояние-представление. Листинг файла welcome.jspx, который отвечает за представление этого состояния, представлен ниже:

welcome.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>Tests - Spring Web Flow 2.x Tutorial | seostella.com</title>
  </head>

  <body>
    <h1>Добро пожаловать! Пожалуйста представьтесь</h1>

    <form:form>
      <input type="hidden" name="_flowExecutionKey" 
             value="${flowExecutionKey}"/> 
             
      <label for="name">Имя:</label>
      <input type="text" name="name"/><br/>
      <span style="color: red; font-size: small;">* более 2-х символов</span><br /><br />
      
      <input type="submit" name="_eventId_nameEntered" 
             value="Отправить" />  
    </form:form>
  </body>
</html>

Пользователю предоставляется возможность ввести имя и нажать на кнопку. Вид страницы представлен на Рис.4:

Рис 4. Страница ввода имени
Рис 4. Страница ввода имени

При нажатии на кнопку "Отправить" происходит событие nameEntered, которое передается текущему состоянию welcome. А состояние welcome, в свою очередь, передает управление состоянию getUser согласно следующему правилу:


<transition on="nameEntered" to="getUser"/>

Состояние getUser является состоянием-действием, поэтому оно должно передать управление на другое состояние без отображения страницы пользователю:


    <action-state id="getUser">
        <evaluate result="user" expression=
            "testsFlowActions.getUser(requestParameters.name)" />
        <transition to="tooShortUsername" on-exception=
            "com.seostella.swftests.flow.exception.user.TooShortUsernameException" />
        <transition to="addUser" on-exception=
            "com.seostella.swftests.flow.exception.user.UserNotFoundException" />
        <transition to="userReady" />
    </action-state>  

Этим состоянием проверяется длина введенного имени и если оно меньше трех символов, то пользователю отображается страница с соответствующей информацией. Если длина имени больше трех символов и такое имя существует в системе, т.е., оно совпадает с одним из следующих имен: Sheldon, Leonard, Penny, Howard, Raj, Amy, Bernadette, Stuart, Priya или Leslie, то происходит переход на событие userReady, что означает окончание выполнения user-flow. Если же именя в системе отсутствует, то пользователю предоставляется возможность ввести свое имя и зарегистрироваться.


<evaluate result="user" expression=
  "testsFlowActions.getUser(requestParameters.name)" />

- выполняется метод getUser класса TestsFlowActions, которому передается параметр requestParameters.name, что является именем пользователя, введенным на предыдущем состоянии. Метод getUser представлен ниже:


    public User getUser(String name) throws TooShortUsernameException,
            UserNotFoundException{
        return userService.getUser(name);
    }

- он (метод) вызывает метод getUser класса UserService:


    public User getUser(String name) throws TooShortUsernameException,
            UserNotFoundException{
        if (name != null && name.length() > 2) {
            for ( User user : userList ){
                if( user.getName().equals(name) ){
                    return user;
                }
            }
        } else {
            throw new TooShortUsernameException();
        }
        throw new UserNotFoundException();
    }

- если имя пользователя длиннее двух символов и такой пользователь существует в списке userList, то возвращается объект user с этим именем. Если длина имени меньше трех символов, то генерируется исключение TooShortUsernameException (слишком короткое имя). Если длина имени больше двух символов. но это имя отсутствует в списке userList, то генерируется исключение UserNotFoundException (пользователь не найден).


<transition to="tooShortUsername" on-exception=
  "com.seostella.swftests.flow.exception.user.TooShortUsernameException" />

- если в методе getUser класса TestsFlowActions произошло исключение TooShortUsernameException (слишком короткое имя), то выполняется переход к состоянию tooShortUsername.


<transition to="addUser" on-exception=
  "com.seostella.swftests.flow.exception.user.UserNotFoundException" />
 

- если в методе getUser класса TestsFlowActions произошло исключение UserNotFoundException (пользователь не найден), то выполняется переход к состоянию addUser.


<transition to="userReady" />

- при успешном выполнении метода getUser выполняется переход на состояние userReady, на котором заканчивается выполнение user-flow.

Следующим состоянием в user-flow является состояние-представление tooShortUsername. Оно отображается, когда пользователь вводит имя, содержащее менее трех символов. Листинг показан ниже:


    <view-state id="tooShortUsername">
        <transition to="welcome" />
    </view-state>

Представлением для этого состояния является файл tooShortUsername.jspx:

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>Tests - Spring Web Flow 2.x Tutorial | seostella.com</title>
  </head>

  <body>
    <h1>Ошибка!</h1>
    
    <p>Выбранное имя слишком короткое. Имя должно содержать минимум 3 символа.</p>

    <a href="${flowExecutionUrl}&_eventId=welcome" title="Попробовать снова!">Попробовать снова!</a>
  </body>
</html>

Пользователь в браузере увидит следующую страницу:

Рис 5. Страница tooShortUsername.jspx
Рис 5. Страница tooShortUsername.jspx

Следующим состоянием в user-flow является состояние-представление addUser. Оно отображается, когда пользователь вводит имя, которого нет в списке предопределенных пользователей (Sheldon, Leonard, Penny, Howard, Raj, Amy, Bernadette, Stuart, Priya и Leslie). Листинг показан ниже:


    <view-state id="addUser">
        <transition on="newUsernameEntered" to="createUser"/>
    </view-state>

Представлением для этого состояния является файл addUser.jspx:

addUser.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>Tests - Spring Web Flow 2.x Tutorial | seostella.com</title>
  </head>

  <body>
    <h1>Пожалуйста зарегистрируйтесь</h1>

    <form:form>
      <input type="hidden" name="_flowExecutionKey" 
             value="${flowExecutionKey}"/> 
             
      <label for="name">Имя:</label>
      <input type="text" name="name"/><br/>
      <span style="color: red; font-size: small;">* более 2-х символов</span><br /><br />
      
      <input type="submit" name="_eventId_newUsernameEntered"
             value="Зарегистрироваться" />  
    </form:form>
  </body>
</html>

Пользователь в браузере увидит следующую страницу:

Рис 6. Страница addUser.jspx
Рис 6. Страница addUser.jspx

Состояние createUser является вторым состоянием-действием данного flow:


    <action-state id="createUser">
        <evaluate result="user" expression=
            "testsFlowActions.createUser(requestParameters.name)" />
        <transition to="tooShortUsername" on-exception=
            "com.seostella.swftests.flow.exception.user.TooShortUsernameException" />
        <transition to="userReady" />
    </action-state>

В этом состоянии происходят действия, подобные действиям состояния getUser поэтому подробно рассматриваться не будут. Подобно предыдущему состоянию, вызывается метод createUser класса TestsFlowActions. Если при выполнении этого метода произошло исключение TooShortUsernameException, то управление передается состоянию tooShortUsername. Если же метод выполнился успешно, то управление передается состоянию userReady, которое является конечным состоянием user-flow.

При выполнении состояния userReady происходит возврат в родительский flow, т.е., в tests-flow.

< Spring Web Flow. Тесты. Часть 3. Обзор flow Spring Web Flow. Тесты. Часть 5. Flow Тестирования >

Напишите первое сообщение!

Вы должны войти под своим аккаунтом чтобы оставлять комментарии