Введение играть в Java
1. обзор
Цель этого вводного руководства - изучить Play Framework и выяснить, как мы можем создать с его помощью веб-приложение.
Play - это высокопроизводительная среда веб-приложений для языков программирования, код которых компилируется и выполняется на JVM, в основном на Java и Scala. Он объединяет компоненты и API, необходимые для разработки современных веб-приложений.
2. Настройка Play Framework
Давайте перейдем кofficial page платформы Play и загрузим последнюю версию дистрибутива. На момент написания данного руководства последняя версия была 2.7.
Мы загрузим zip-архив с учебником Play Java Hello World и разархивируем файл в удобное место. В корне этой папки мы найдем исполняемый файлsbt, который мы можем использовать для запуска приложения. Как вариант, мы можем установитьsbt из ихofficial page.
Чтобы использоватьsbt из загруженной папки, сделайте следующее:
cd /path/to/folder/
./sbt run
Обратите внимание, что мы запускаем сценарий в текущем каталоге, поэтому мы используем синтаксис./.
Если мы установимsbt,, мы можем использовать его вместо:
cd /path/to/folder/
sbt run
После выполнения этой команды мы увидим утверждение, которое гласит: «(Сервер запущен, используйте Enter, чтобы остановиться и вернуться в консоль…)». Это означает, что наше приложение готово, поэтому теперь мы можем перейти кhttp://localhost:9000, где нам будет представлена страница приветствия Play:
3. Анатомия игровых приложений
В этом разделе мы лучше поймем, как устроено приложение Play и для чего используется каждый файл и каталог в этой структуре.
Если вы хотите сразу же попробовать простой пример, перейдите к следующему разделу.
Это файлы и папки, которые мы находим в типичном приложении Play Framework:
├── app → Application sources
│ ├── assets → Compiled Asset sources
│ │ ├── javascripts → Typically Coffee Script sources
│ │ └── stylesheets → Typically LESS CSS sources
│ ├── controllers → Application controllers
│ ├── models → Application business layer
│ └── views → Templates
├── build.sbt → Application build script
├── conf → Configurations files and other non-compiled resources (on classpath)
│ ├── application.conf → Main configuration file
│ └── routes → Routes definition
├── dist → Arbitrary files to be included in your projects distribution
├── lib → Unmanaged libraries dependencies
├── logs → Logs folder
│ └── application.log → Default log file
├── project → sbt configuration files
│ ├── build.properties → Marker for sbt project
│ └── plugins.sbt → sbt plugins including the declaration for Play itself
├── public → Public assets
│ ├── images → Image files
│ ├── javascripts → Javascript files
│ └── stylesheets → CSS files
├── target → Generated files
│ ├── resolution-cache → Information about dependencies
│ ├── scala-2.11
│ │ ├── api → Generated API docs
│ │ ├── classes → Compiled class files
│ │ ├── routes → Sources generated from routes
│ │ └── twirl → Sources generated from templates
│ ├── universal → Application packaging
│ └── web → Compiled web assets
└── test → source folder for unit or functional tests
3.1. Каталогapp
Этот каталог содержит исходный код Java, веб-шаблоны и источники скомпилированных ресурсов - в основном, все источники и все исполняемые ресурсы.
Каталогapp содержит несколько важных подкаталогов, каждый из которых содержит одну часть архитектурного шаблона MVC:
-
models - это бизнес-уровень приложения, файлы в этом пакете, вероятно, будут моделировать наши таблицы базы данных и позволят нам получить доступ к уровню сохраняемости
-
views - все шаблоны HTML, которые могут отображаться в браузере, содержатся в этой папке
-
controllers - подкаталог, в котором находятся наши контроллеры. Controllers - это исходные файлы Java, содержащие действия, выполняемые при каждом вызове API. Actions - это общедоступные методы, которые обрабатывают HTTP-запросы и возвращают те же результаты, что и HTTP-ответы.
-
assets– подкаталог, содержащий скомпилированные ресурсы, такие как CSS и javascript. Вышеуказанные соглашения об именах являются гибкими, мы можем создавать наши пакеты, например, пакетapp/utils. Мы также можем настроить имя пакетаapp/com/example/controllers
Он также содержит дополнительные файлы и каталоги, необходимые для конкретного приложения.
3.2. Каталогpublic
Ресурсы, хранящиеся в каталогеpublic, представляют собой статические ресурсы, которые обслуживаются непосредственно веб-сервером.
В этом каталоге обычно есть три подкаталога для изображений, файлов CSS и JavaScript. Рекомендуется организовать файлы ресурсов таким образом, чтобы обеспечить единообразие во всех приложениях Play.
3.3. Каталогconf
Каталогconf содержит файлы конфигурации приложения. application.conf - это место, куда мы поместим большинство свойств конфигурации для приложения Play. Мы определим конечные точки для приложения вroutes.
Если приложению нужны какие-либо дополнительные файлы конфигурации, они должны быть помещены в этот каталог.
3.4. Каталогlib
Каталогlib является необязательным и содержит зависимости неуправляемых библиотек. Если у нас есть jar-файлы, которые не указаны в системе сборки, мы помещаем их в этот каталог. Они будут автоматически добавлены в путь к классам приложения.
3.5. Файлbuild.sbt
Файлbuild.sbt file - это сценарий сборки приложения. Здесь мы перечисляем зависимости, необходимые для запуска приложения, такие как библиотеки тестирования и постоянства.
3.6. Каталогproject
Все файлы, которые настраивают процесс сборки на основе SBT, находятся в каталогеproject.
3.7. Каталогtarget
Этот каталог содержит все файлы, созданные системой сборки, например, все файлы.class.
Посмотрев и изучив структуру каталогов для только что загруженного примера Play Framework Hello World, мы можем теперь ознакомиться с основами инфраструктуры на примере.
4. Простой пример
В этом разделе мы создадим очень простой пример веб-приложения. Мы воспользуемся этим приложением, чтобы познакомиться с основами платформы Play.
Вместо того, чтобы загружать пример проекта и создавать из негоlet’s see another way we can create a Play Framework application, using the sbt new command.
Давайте откроем командную строку, перейдем в выбранное место и выполним следующую команду:
sbt new playframework/play-java-seed.g8
Для этого нам потребуется установитьsbt already, как описано вSection 2.
Приведенная выше команда запросит у нас имя для проекта. Затем он запросит домен (в обратном порядке, как и соглашение о присвоении имен в Java), который будет использоваться для пакетов. Мы нажимаемEnter, не вводя имя, если хотим сохранить значения по умолчанию, указанные в квадратных скобках.
Приложение, созданное с помощью этой команды, имеет ту же структуру, что и созданное ранее. Поэтому мы можем приступить к запуску приложения, как мы это делали ранее:
cd /path/to/folder/
sbt run
Вышеупомянутая команда после завершения выполненияwill spawn a server on port number 9000 to expose our API, к которой мы можем получить доступ черезhttp://localhost:9000. Мы должны увидеть сообщение «Добро пожаловать в игру» в браузере.
Our new API has two endpoints that we can now try out in turn from the browser. Первая - которую мы только что загрузили - это корневая конечная точка, которая загружает страницу индекса с надписью «Добро пожаловать в игру!» сообщение.
Второй,http://localhost:9000/assets,, предназначен для загрузки файлов с сервера путем добавления имени файла к пути. Мы можем протестировать эту конечную точку, получив s-файлfavicon.png , который был загружен с приложением, вhttps://localhost:9000/assets/images/favicon.png.
5. Действия и контроллеры
Метод Java внутри класса контроллера, который обрабатывает параметры запроса и выдает результат для отправки клиенту, называется действием.
Контроллер - это класс Java, расширяющийplay.mvc.Controller, который логически группирует вместе действия, которые могут быть связаны с результатами, которые они производят для клиента.
Теперь перейдем кapp-parent-dir/app/controllers и обратим внимание наHomeController.java.
Действие indexHomeController возвращает веб-страницу с простым приветственным сообщением:
public Result index() {
return ok(views.html.index.render());
}
Эта веб-страница является шаблономindex по умолчанию в пакете представлений:
@main("Welcome to Play") {
Welcome to Play!
}
Как показано выше, экранindex вызывает шаблонmain. Затем основной шаблон обрабатывает отображение заголовка страницы и тегов тела. Он принимает два аргумента:String для заголовка страницы и объектHtml для вставки в тело страницы.
@(title: String)(content: Html)
@* Here's where we render the page title `String`. *@
@title
@* And here's where we render the `Html` object containing
* the page content. *@
@content
Немного изменим текст в файлеindex:
@main("Welcome to example") {
Welcome to Play Framework Tutorial on example!
}
Перезагрузка браузера даст нам смелый заголовок:
Welcome to Play Framework Tutorial on example!
Мы можем полностью избавиться от шаблона, удалив директивуrender в методеindex() HomeController, чтобы мы могли напрямую возвращать простой текст или текст HTML:
public Result index() {
return ok("REST API with Play by example");
}
После редактирования кода, как показано выше, в браузере останется только текст. Это будет простой текст без HTML или стилей:
REST API with Play by example
Мы могли бы с таким же успехом вывести HTML, заключив текст в теги заголовка<h1></h1>, а затем передав текст HTML в методHtml.apply. Не стесняйтесь играть с этим.
Добавим конечную точку/example/html вroutes:
GET /example/html controllers.HomeController.applyHtml
Теперь давайте создадим контроллер, который обрабатывает запросы на этой конечной точке:
public Result applyHtml() {
return ok(Html.apply("This text will appear as a heading 1
"));
}
Когда мы посетимhttp://localhost:9000/example/html, мы увидим указанный выше текст в формате HTML.
Мы изменили наш ответ, настроив тип ответа. Мы рассмотрим эту функцию более подробно в следующем разделе.
Мы также видели две другие важные функции Play Framework.
Во-первых, перезагрузка браузера отражает самую последнюю версию нашего кода; это потому, что нашcode changes are compiled on the fly.
Во-вторых, Play предоставляет нам вспомогательные методы для стандартных HTTP-ответов в классеplay.mvc.Results. Примером является методok(), который возвращает ответ OK HTTP 200 вместе с телом ответа, которое мы передаем ему в качестве параметра. Мы уже использовали метод отображения текста в браузере.
В классеResults есть больше вспомогательных методов, таких какnotFound() иbadRequest().
6. Манипулирование результатами
Мы былиbenefiting from Play’s content negotiation feature, даже не осознавая этого. Play автоматически определяет тип содержимого ответа из тела ответа. Вот почему мы смогли вернуть текст в методеok:
return ok("text to display");
И тогда Play автоматически установит заголовокContent-Type наtext/plain. Хотя в большинстве случаев это работает, мы можем взять на себя управление и настроить заголовок типа контента.
Пустьcustomize the response for HomeController.customContentType action to text/html:
public Result customContentType() {
return ok("This is some text content").as("text/html");
}
Этот шаблон распространяется на все виды типов контента. В зависимости от формата данных, которые мы передаем вспомогательному методуok, мы можем заменитьtext/html наtext/plain илиapplication/json.
Мы можем сделать что-то похожее на набор заголовков:
public Result setHeaders() {
return ok("This is some text content")
.as("text/html")
.withHeader("Header-Key", "Some value");
}
7. Заключение
В этой статье мы изучили основы Play Framework. Мы также смогли создать базовое веб-приложение Java с помощью Play.
Как обычно, доступен исходный код этого руководстваover on GitHub.