Como usar formulários com Java para o ambiente padrão do App Engine

Nesta parte do tutorial do Bookshelf para Java, saiba como acessar dados de formulário do Servlets.

Esta página faz parte de um tutorial com várias páginas. Para começar do início e ver as instruções de configuração, acesse App Bookshelf para Java.

Como executar o aplicativo na máquina local

Para executar o aplicativo localmente:

  1. No diretório getting-started-java/bookshelf-standard/2-structured-data, insira este comando para iniciar um servidor da Web local:

    mvn -Plocal clean appengine:devserver
  2. No seu navegador, acesse http://localhost:8080.

Como implantar o app no ambiente padrão do App Engine

Para implantar no ambiente padrão do App Engine:

  1. Faça um teste completo do aplicativo Bookshelf localmente, inclusive com a criação de pelo menos um livro e um clique em Meus livros. Com isso, você cria um índice obrigatório de Cloud Datastore que é carregado com o Bookshelf. Observe que o índice local será excluído se você criar o aplicativo usando clean. Assim, faça isso na versão do aplicativo que você vai implantar.
  2. No diretório getting-started-java/bookshelf-standard/2-structured-data, insira este comando para implantar o app:
    mvn appengine:update -Dappengine.appId=[YOUR-PROJECT-ID] -Dappengine.version=[YOUR-VERSION]
    Substitua [YOUR-PROJECT-ID] pelo seu código do projeto e [YOUR-VERSION] pela sua versão, por exemplo, 1, 2 ou outro valor de string que você queira usar.
  3. No navegador da Web, digite este endereço.
    https://[YOUR-PROJECT-ID].appspot.com
    Substitua [YOUR-PROJECT-ID] pelo código do projeto.

Depois de atualizar o app, você poderá implantar novamente a versão atualizada inserindo o mesmo comando usado para implantar o app na primeira vez, especificando o mesmo código de projeto e versão, substituindo assim o app implantando atualmente. Se você especificar uma string de versão diferente na linha de comando de atualização, a nova implantação criará uma nova versão do seu app e a definirá como a versão atual em veiculação.

Reduza custos excluindo as versões do app que não estão veiculadas.

Para excluir uma versão do aplicativo:

  1. No Console do GCP, acesse a página "Versões do App Engine".

    Acessar a página Versões

  2. Clique na caixa de seleção ao lado da versão do aplicativo não padrão que você quer excluir.
  3. Clique no botão Excluir na parte superior da página para excluir a versão do aplicativo.

Para informações detalhadas sobre a remoção de recursos faturáveis, consulte a seção Como fazer a limpeza na etapa final deste tutorial.

Como processar envios de usuário com formulários

Com o formulário de adição/edição, os usuários conseguem adicionar e editar envios de livro no aplicativo.

Imagem do formulário de adição/edição

Quando /create é solicitado pelo navegador do usuário, CreateBookServlet é carregado no Container Engine do Servlet e o método doGet é chamado. A solicitação é encaminhada para o servlet /base.jsp, que inclui o servlet /form.jsp. Depois que o usuário envia o formulário, o método doPost do CreateBookServlet é chamado.

No CreateBookServlet.java, o método doGet processa a solicitação de um formulário e configura os atributos a serem usados pelo arquivo JSP:

@Override
public void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
    IOException {
  req.setAttribute("action", "Add");          // Part of the Header in form.jsp
  req.setAttribute("destination", "create");  // The urlPattern to invoke (this Servlet)
  req.setAttribute("page", "form");           // Tells base.jsp to include form.jsp
  req.getRequestDispatcher("/base.jsp").forward(req, resp);
}

O arquivo base.jsp serve como a base para as páginas HTML do app. Ele começa com a inclusão da Biblioteca padrão de tags JSP. As tags principais do JSTL são identificadas por tags começando com <c: e fornecem suporte para variáveis, controle de fluxo, gerenciamento de URL, entre outros. As funções do JSTL são identificadas por tags que começam com <fn: e fornecem coleções e bibliotecas de manipulação de strings. Veja aqui um resumo das tags de JSTL usadas pelo aplicativo Bookshelf:

Tag JSTL Descrição
<c:if ... A expressão test é avaliada e, se verdadeira, o conteúdo é incluído.
<c:choose> Com essa tag condicional, o contexto para c:when e c:otherwise é estabelecido.
<c:when ... O conteúdo é incluído, se test é verdadeiro.
<c:otherwise> Se c:when não for verdadeiro, este conteúdo será incluído.
<c:import url="" /> O conteúdo do url é incluído na página.
<c:out value="" /> A expressão do value é avaliada, e uma versão codificada é exibida.
${fn:escapeXml()} Promove o escape de caracteres especiais para as páginas da Web.


<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
<html lang="en">
  <head>
    <title>Bookshelf - Java on Google Cloud Platform</title>
    <meta charset="utf-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="//maxcdn.bootstrapcdn.com/bootstrap/3.3.2/css/bootstrap.min.css">
  </head>
  <body>
    <div class="navbar navbar-default">
      <div class="container">
        <div class="navbar-header">
          <div class="navbar-brand">Bookshelf</div>
        </div>
        <ul class="nav navbar-nav">
          <li><a href="/">Books</a></li>
          <c:if test="${isAuthConfigured}"><li><a href="/books/mine">My Books</a></li></c:if>
        </ul>
        <p class="navbar-text navbar-right">
          <c:choose>
          <c:when test="${not empty token}">
          <!-- using pageContext requires jsp-api artifact in pom.xml -->
          <a href="/logout">
            <c:if test="${not empty userImageUrl}">
              <img class="img-circle" src="${fn:escapeXml(userImageUrl)}" width="24">
            </c:if>
            ${fn:escapeXml(userEmail)}
          </a>
          </c:when>
          <c:when test="${isAuthConfigured}">
          <a href="/login">Login</a>
          </c:when>
          </c:choose>
        </p>
      </div>
    </div>
    <c:import url="/${page}.jsp" />
  </body>
</html>

O formulário HTML é criado usando páginas do JavaServer. Esse é um mecanismo de modelos do Java, mas é executado como Servlets. Com este código JSP, é especificado que o formulário inclui campos de entrada de texto para "Título", "Autor", "Data de publicação", "Descrição", "Imagem de capa" e botão "Salvar":

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<div class="container">
  <h3>
    <c:out value="${action}" /> book
  </h3>

  <form method="POST" action="${destination}">

    <div class="form-group">
      <label for="title">Title</label>
      <input type="text" name="title" id="title" value="${fn:escapeXml(book.title)}" class="form-control" />
    </div>

    <div class="form-group">
      <label for="author">Author</label>
      <input type="text" name="author" id="author" value="${fn:escapeXml(book.author)}" class="form-control" />
    </div>

    <div class="form-group">
      <label for="publishedDate">Date Published</label>
      <input type="text" name="publishedDate" id="publishedDate" value="${fn:escapeXml(book.publishedDate)}" class="form-control" />
    </div>

    <div class="form-group">
      <label for="description">Description</label>
      <textarea name="description" id="description" class="form-control">${fn:escapeXml(book.description)}</textarea>
    </div>

    <div class="form-group ${isCloudStorageConfigured ? '' : 'hidden'}">
      <label for="image">Cover Image</label>
      <input type="file" name="file" id="file" class="form-control" />
    </div>

    <div class="form-group hidden">
      <label for="imageUrl">Cover Image URL</label>
      <input type="hidden" name="id" value="${book.id}" />
      <input type="text" name="imageUrl" id="imageUrl" value="${fn:escapeXml(book.imageUrl)}" class="form-control" />
    </div>

    <button type="submit" class="btn btn-success">Save</button>
  </form>
</div>

Envio do formulário

O método doPost cria um objeto Book com a leitura de parâmetros do formulário pelas chamadas req.getParameter(). Ele fornece o objeto Book para um novo objeto BookDao que adiciona a nova entidade Book ao armazenamento de dados. Depois que o livro é salvo no armazenamento de dados, a página é redirecionada para /read. Assim, o usuário pode ver o que foi salvo. O acesso à sessão e a criação do livro serão abordados posteriormente:

@Override
public void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException,
    IOException {
  Book book = new Book.Builder()
      .author(req.getParameter("author"))   // form parameter
      .description(req.getParameter("description"))
      .publishedDate(req.getParameter("publishedDate"))
      .title(req.getParameter("title"))
      .imageUrl(null)
      .build();

  BookDao dao = (BookDao) this.getServletContext().getAttribute("dao");
  try {
    Long id = dao.createBook(book);
    resp.sendRedirect("/read?id=" + id.toString());   // read what we just wrote
  } catch (Exception e) {
    throw new ServletException("Error creating book", e);
  }
}
Esta página foi útil? Conte sua opinião sobre:

Enviar comentários sobre…