Pull to refresh

‘Hello World’ tutorial — Ваше первое приложение на Play framework (Часть 2)

Java *
Translation
Original author: http://www.playframework.org
Это очень поверхностное руководство, которое только познакомит с базовым функционалом Play framework на примере создания приложения ‘Hello World’.

(Часть 1)

Создание формы


Начнём Наше приложение ‘Hello World’ с создания формы, где можно будет ввести имя.

Отредактируйте helloworld/app/views/Application/index.html следующим образом:

#{extends 'main.html' /}
#{set title:'Home' /}
 
<form action="@{Application.sayHello()}" method="GET">
    <input type="text" name="myName" /> 
    <input type="submit" value="Say hello!" />
</form>


Мы используем @ {...} обозначение для того, что бы Play автоматически сгенерировал URL на Application.sayHello. Теперь, обновите домашнюю страницу в браузере.



К сожалению, вы получите ошибку. Это потому, что вы ссылаетесь на несуществующее действие Application.sayHello. Давайте создадим его в helloworld/app/controllers/Application.java:

package controllers;
 
import play.mvc.*;
 
public class Application extends Controller {
 
    public static void index() {
        render();
    }
    
    public static void sayHello(String myName) {
        render(myName);
    }
 
}


Мы объявили myName параметр в методе sayHello, поэтому он будет автоматически заполняется значением параметра myName которое будет получено по HTTP. И мы вызываем функцию render() для отображения шаблона, которой передали myName, поэтому она будет доступна в шаблоне оформления.



Теперь, если вы попытаетесь ввести свое имя и отправить форму, вы получите другую ошибку:



Понять причину этой ошибки довольно просто. Play пытается вызвать шаблон по умолчанию для этого действия, но он не существует. Давайте создадим его helloworld/app/views/Application/sayHello.html:

#{extends 'main.html' /}
#{set title:'Home' /}
 
<h1>Hello ${myName ?: 'guest'}!</h1>
 
<a href="@{Application.index()}">Back to form</a>


Обновите теперь страницу.



Посмотрите, как мы использовали оператор Groovy ?:. Он переключается на значение по умолчанию, если переменная myName не заполнена. Так что если вы пытаетесь представить форму без ввода имени, он будет отображать ‘Hello guest’.

Настройка ЧПУ


Если Вы посмотрите на URL созданной страницы, Вы увидите нечто вроде:

http://localhost:9000/application/sayhello?myName=guillaume

Это происходит потому, что Play использует маршрут по умолчанию для всех действий контроллеров:

* /{controller}/{action} {controller}.{action}

Мы можем задать лучший URL, указав путь для пользовательских действий Application.sayHello. Измените helloworld/conf/routes добавив после первой строки следующее:

GET /hello Application.sayHello

Теперь вернемся к форме и введём своё имя повторно, что бы убедиться, что всё работает.

Настройка шаблона вывода


Так как шаблоны наследуют шаблон main.html, Вы можете легко изменить все шаблоны. Измените helloworld/app/views/main.html:

...
<body>
    The Hello world app.
    <hr/>
    
    #{doLayout /}
</body>
...


Строка «The Hello world app.» появилась на всех страницах.



Проверка входных данных


Добавим проверку в форму. Форма должна быть заполнена перед отправкой. Для этого можем использовать Play validation framework.
Измените sayHello в helloworld/app/controllers/Application.java контроллере следующим образом:

...
public static void sayHello(@Required String myName) {
    if(validation.hasErrors()) {
        flash.error("Oops, please enter your name!");
        index();
    }
    render(myName);
}
...


Не забудьте импортировать play.data.validation .*, чтобы использовать @Required аннотацию. Play будет автоматически проверять что бы поле myName было заполнено или будет добавлять объект содержащий ошибку. Тогда, если существует какая-либо ошибка, мы добавим сообщение и перенаправим в корень сайта.

Flash объект позволяет сохранять сообщения при перенаправлении на страницу.

Теперь вы просто должны показать сообщение об ошибке, если таковые имеются. Измените helloworld/app/views/Application/index.html:

#{extends 'main.html' /}
#{set title:'Home' /}
 
#{if flash.error}
    <p style="color:#c00">
        ${flash.error}
    </p>
#{/if}
 
<form action="@{Application.sayHello()}" method="GET">
    <input type="text" name="myName" /> 
    <input type="submit" value="Say hello!" />
</form>


Проверим как это работает:



Автоматизированное тестирование


Закончим руководство написанием теста для приложения. Так как нет логики в Java коде для проверки, нам необходимо проверить, веб-приложение. Поэтому, мы будем писать тест для Selenium.

Для начала запустим приложение в режиме тестирования. Остановите приложение и перезапустите его командой:

$ play test

Команда play test почти такая же, как play run, за исключением того, что дополнительно загружается модуль Test Runner, который позволяет запустить набор тестов непосредственно из браузера.

Откройте следующий адрес в браузере http://localhost:9000/@tests, чтобы увидеть тесты. Попробуйте выбрать все тесты по умолчанию и запускать их, все должны быть зеленого цвета… Но это стандартные тесты, которые в общем то ничего и не тестируют.



Тесты для Selenium обычно пишутся как HTML файл. Написание тестов для Selenium немного утомительно (форматирование используя элементы таблицы HTML). Хорошей новостью будет то, что Play поможет вам сгенерировать его с помощью Play template engine, который поддерживает упрощенный синтаксис для сценариев Selenium.

При создании приложения Play автоматически создал тесты, в том числе тесты для Selenium. Откройте helloworld/test/Application.test.html:
*{ You can use plain selenium command using the selenium tag }*
 
#{selenium}
    // Open the home page, and check that no error occurred
    open('/')
    assertNotTitle('Application error')
#{/selenium}


Этот тест должен отработать без каких-либо проблем. Он просто открывает главную страницу и убеждается, что страницы не содержат текст 'Application error'.

Напишем тест для нашего приложения. Измените содержание теста:

#{selenium}
    // Откроем корневую страницу и проверим, что ни каких ошибок не произошло
    open('/')
    assertNotTitle('Application error')
    
    // Проверим что это форма
    assertTextPresent('The Hello world app.')
    
    // Отправим форму
    clickAndWait('css=input[type=submit]')
    
    // Проверим что произошла ошибка
    assertTextPresent('Oops, please enter your name!')
    
    // Впишем имя и отправим форму
    type('css=input[type=text]', 'bob')
    clickAndWait('css=input[type=submit]')
    
    // Проверим результат
    assertTextPresent('Hello bob!')
    assertTextPresent('The Hello world app.')
    
    // Вернёмся к форме
    clickAndWait('link=Back to form')
    
    // Домашняя страница?
    assertTextNotPresent('Hello bob!')
#{/selenium}


Мы полностью протестировали приложения. Просто выберит еэтот тест в Test Runner и нажмите «Пуск». Все должно быть зелёным!



Хотите больше?


Это был очень простой урок. Если вы хотите узнать больше о Play framework, читайте «Tutorial — Play guide, a real world app step-by-step».
Tags:
Hubs:
Total votes 24: ↑20 and ↓4 +16
Views 14K
Comments Comments 26

Please pay attention