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 Тестування >

Напишіть перше повідомлення!

Ви повинні увійти під своїм аккаунтом щоб залишати коментарі