Introdução ao jogo em Java

Introdução ao jogo em Java

1. Visão geral

O objetivo deste tutorial de introdução é explorar o Play Framework e descobrir como podemos criar um aplicativo Web com ele.

O Play é uma estrutura de aplicativos da web de alta produtividade para linguagens de programação cujo código é compilado e executado na JVM, principalmente Java e Scala. Ele integra os componentes e APIs necessários para o desenvolvimento moderno de aplicativos da web.

2. Play Framework Setup

Vamos acessarofficial pagee do framework Play e baixar a versão mais recente da distribuição. No momento deste tutorial, o mais recente é a versão 2.7.

Faremos o download da pasta zip do tutorial Play Java Hello World e descompacte o arquivo em um local conveniente. Na raiz desta pasta, encontraremos um executávelsbt que podemos usar para executar o aplicativo. Como alternativa, podemos instalarsbt de seusofficial page.

Para usarsbt  da pasta baixada, vamos fazer o seguinte:

cd /path/to/folder/
./sbt run

Observe que estamos executando um script no diretório atual, daí o uso da sintaxe./.

Se instalarmossbt,, podemos usá-lo em seu lugar:

cd /path/to/folder/
sbt run

Depois de executar este comando, veremos uma declaração que diz “(Servidor iniciado, use Enter para parar e voltar ao console ...)”. Isso significa que nosso aplicativo está pronto, portanto, agora podemos ir parahttp://localhost:9000, onde veremos uma página de boas-vindas do Play:

image

3. Anatomia de Aplicativos Play

Nesta seção, vamos entender melhor como um aplicativo Play é estruturado e para que serve cada arquivo e diretório nessa estrutura.

Se você deseja se desafiar para um exemplo simples imediatamente, pule para a próxima seção.

Estes são os arquivos e pastas que encontramos em um aplicativo típico do 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. O diretórioapp

Este diretório contém código-fonte Java, modelos da Web e fontes dos recursos compilados - basicamente, todas as fontes e todos os recursos executáveis.

O diretórioapp contém alguns subdiretórios importantes, cada um dos quais empacota uma parte do padrão arquitetônico MVC:

  • models - esta é a camada de negócios do aplicativo, os arquivos neste pacote provavelmente modelarão nossas tabelas de banco de dados e nos permitirão acessar a camada de persistência

  • views - todos os modelos HTML que podem ser renderizados no navegador estão contidos nesta pasta

  • controllers - um subdiretório no qual temos nossos controladores. Controllers são arquivos de origem Java que contêm ações a serem executadas para cada chamada de API. Actions são métodos públicos que processam solicitações HTTP e retornam resultados iguais às respostas HTTP

  • assets– um subdiretório que contém recursos compilados, como CSS e javascript. As convenções de nomenclatura acima são flexíveis, podemos criar nossos pacotes, por exemplo um pacoteapp/utils. Também podemos personalizar o nome do pacoteapp/com/example/controllers

Ele também contém arquivos e diretórios opcionais, conforme necessário pelo aplicativo em particular.

3.2. O diretóriopublic

Os recursos armazenados no diretóriopublic são ativos estáticos servidos diretamente pelo servidor da web.

Esse diretório geralmente possui três subdiretórios para arquivos de imagens, CSS e JavaScript. É recomendado que organizemos os arquivos de ativos assim para consistência em todos os aplicativos do Play.

3.3. O diretórioconf

Oconf diretório contém arquivos de configuração do aplicativo. Oapplication.conf  é onde colocaremos a maioria das propriedades de configuração do aplicativo Play. Definiremos endpoints para o aplicativo emroutes.

Se o aplicativo precisar de arquivos de configuração extras, eles deverão ser colocados neste diretório.

3.4. O diretóriolib

O diretóriolib é opcional e contém dependências de biblioteca não gerenciadas. Se tivermos jars que não estão especificados no sistema de compilação, os colocaremos neste diretório. Eles serão adicionados automaticamente ao classpath do aplicativo.

3.5. O arquivobuild.sbt

Obuild.sbt file é o script de construção do aplicativo. É aqui que listamos as dependências necessárias para executar o aplicativo, como bibliotecas de teste e persistência.

3.6. O diretórioproject

Todos os arquivos que configuram o processo de construção com base no SBT estão no diretórioproject.

3.7. O diretóriotarget

Este diretório contém todos os arquivos gerados pelo sistema de compilação - por exemplo, todos os arquivos.class.

Tendo visto e explorado a estrutura de diretórios do exemplo do Play Framework Hello World que acabamos de baixar, agora podemos percorrer os fundamentos da estrutura usando um exemplo.

4. Exemplo Simples

Nesta seção, criaremos um exemplo muito básico de um aplicativo da web. Usaremos este aplicativo para nos familiarizar com os fundamentos da estrutura Play.

Em vez de baixar um projeto de exemplo e construir a partir dele,let’s see another way we can create a Play Framework application, using the sbt new command.

Vamos abrir um prompt de comando, navegar até nosso local de escolha e executar o seguinte comando:

sbt new playframework/play-java-seed.g8

Para este, precisamos ter instaladosbt already, conforme explicado emSection 2.

O comando acima solicitará um nome para o projeto primeiro. Em seguida, ele solicitará o domínio (ao contrário, como é a convenção de nomenclatura de pacotes em Java) que será usada para os pacotes. PressionamosEnter sem digitar um nome se quisermos manter os padrões que são fornecidos entre colchetes.

O aplicativo gerado com este comando tem a mesma estrutura que a gerada anteriormente. Portanto, podemos executar a aplicação como fizemos anteriormente:

cd /path/to/folder/
sbt run

O comando acima, após a conclusão da execução,will spawn a server on port number 9000 to expose our API, que podemos acessar através dehttp://localhost:9000. Deveríamos ver a mensagem "Bem-vindo ao Play" no navegador.

Our new API has two endpoints that we can now try out in turn from the browser. O primeiro - que acabamos de carregar - é o endpoint raiz, que carrega uma página de índice com a mensagem “Welcome to Play!” mensagem.

O segundo, emhttp://localhost:9000/assets,, serve para baixar arquivos do servidor adicionando um nome de arquivo ao caminho. Podemos testar este endpoint obtendo o arquivofavicon.png , que foi baixado com o aplicativo, emhttps://localhost:9000/assets/images/favicon.png.

5. Ações e controladores

Um método Java dentro de uma classe de controlador que processa parâmetros de solicitação e produz um resultado a ser enviado ao cliente é chamado de ação.

Um controlador é uma classe Java que estendeplay.mvc.Controller que agrupa logicamente as ações que podem estar relacionadas aos resultados que produzem para o cliente.

Vamos agora ir paraapp-parent-dir/app/controllerse prestar atenção aHomeController.java.

A ação de índice deHomeController retorna uma página da web com uma mensagem de boas-vindas simples:

public Result index() {
    return ok(views.html.index.render());
}

Esta página da web é o modeloindex padrão no pacote de visualizações:

@main("Welcome to Play") {
  

Welcome to Play!

}

Como mostrado acima, o spageindex chama o templatemain. O modelo principal lida com a renderização do cabeçalho da página e das tags do corpo. Leva dois argumentos: umString  para o título da página e umHtml objeto para inserir no corpo da página.

@(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

        
    

Vamos mudar um pouco o texto no arquivoindex:

@main("Welcome to example") {
  

Welcome to Play Framework Tutorial on example!

}

Recarregar o navegador nos dará um cabeçalho em negrito:

Welcome to Play Framework Tutorial on example!

Podemos acabar com o modelo completamente removendo a diretivarender  no métodoindex() deHomeController para que possamos retornar texto simples ou texto HTML diretamente:

public Result index() {
    return ok("REST API with Play by example");
}

Após editar o código, conforme mostrado acima, teremos apenas o texto no navegador. Isso será apenas texto sem formatação ou HTML:

REST API with Play by example

Poderíamos também produzir HTML envolvendo o texto nas tags<h1></h1> do cabeçalho e, em seguida, passando o texto HTML para o métodoHtml.apply. Sinta-se livre para brincar com ele.

Vamos adicionar um endpoint/example/html emroutes:

GET    /example/html    controllers.HomeController.applyHtml

Agora vamos criar o controlador que lida com as solicitações neste endpoint:

public Result applyHtml() {
    return ok(Html.apply("

This text will appear as a heading 1

")); }

Quando visitarmoshttp://localhost:9000/example/html, veremos o texto acima formatado em HTML.

Manipulamos nossa resposta personalizando o tipo de resposta. Veremos esse recurso com mais detalhes em uma seção posterior.

Também vimos duas outras características importantes do Play Framework.

Primeiro, recarregar o navegador reflete a versão mais recente do nosso código; isso é porque nossocode changes are compiled on the fly.

Em segundo lugar, o Play nos fornece métodos auxiliares para respostas HTTP padrão na classeplay.mvc.Results. Um exemplo é o métodook(), que retorna uma resposta OK HTTP 200 ao lado do corpo da resposta que passamos para ele como um parâmetro. Já usamos o método de exibição de texto no navegador.

Existem mais métodos auxiliares, comonotFound()ebadRequest() na classeResults.

6. Manipulando Resultados

Temos estadobenefiting from Play’s content negotiation feature sem nem perceber. O Play infere automaticamente o tipo de conteúdo da resposta do corpo da resposta. É por isso que conseguimos retornar o texto no métodook:

return ok("text to display");

E então o Play configuraria automaticamente o cabeçalhoContent-Type paratext/plain. Embora isso funcione na maioria dos casos, podemos assumir o controle e personalizar o cabeçalho do tipo de conteúdo.

Vamoscustomize the response for HomeController.customContentType action to text/html:

public Result customContentType() {
    return ok("This is some text content").as("text/html");
}

Esse padrão abrange todos os tipos de tipos de conteúdo. Dependendo do formato dos dados que passamos para o método auxiliarok, podemos substituirtext/html portext/plain ouapplication/json.

Podemos fazer algo semelhante para definir cabeçalhos:

public Result setHeaders() {
    return ok("This is some text content")
            .as("text/html")
            .withHeader("Header-Key", "Some value");
}

7. Conclusão

Neste artigo, exploramos os conceitos básicos do Play Framework. Também conseguimos criar um aplicativo da web Java básico usando o Play.

Como de costume, o código-fonte deste tutorial está disponívelover on GitHub.