My favorites | Português | Sign in

Uso das JSPs

Embora possamos enviar o HTML para a nossa interface de usuário diretamente do código de servlet Java, seria difícil manter esse procedimento à medida que o HTML fica mais complicado. É melhor usar um sistema de modelo, com a interface de usuário desenvolvida e implementada em arquivos separados com variáveis e lógica para inserir dados fornecidos pelo aplicativo. Existem muitos sistemas de modelo disponíveis para Java. Todos eles funcionam com o Google App Engine.

Neste tutorial, usaremos as JSPs (JavaServer Pages) para implementar a interface de usuário no livro de visitas. As JSPs são parte do padrão servlet. O Google App Engine compila automaticamente os arquivos JSP no WAR do aplicativo e mapeia todos eles para os caminhos do URL.

Hello, JSP!

O aplicativo do nosso livro de visitas grava strings em um fluxo de saída, mas também poderia gravá-las como uma JSP. Vamos começar transportando a versão mais recente do exemplo para uma JSP.

No diretório war/, crie um arquivo chamado guestbook.jsp e coloque nele o conteúdo abaixo:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="com.google.appengine.api.users.User" %>
<%@ page import="com.google.appengine.api.users.UserService" %>
<%@ page import="com.google.appengine.api.users.UserServiceFactory" %>

<html>
  <body>

<%
    UserService userService = UserServiceFactory.getUserService();
    User user = userService.getCurrentUser();
    if (user != null) {
%>
<p>Hello, <%= user.getNickname() %>! (You can
<a href="<%= userService.createLogoutURL(request.getRequestURI()) %>">sign out</a>.)</p>
<%
    } else {
%>
<p>Hello!
<a href="<%= userService.createLoginURL(request.getRequestURI()) %>">Sign in</a>
to include your name with greetings you post.</p>
<%
    }
%>

  </body>
</html>

Por padrão, qualquer arquivo no war/ ou um subdiretório (que não seja WEB-INF/) cujo nome termina em .jsp é mapeado automaticamente para um caminho de URL. O caminho de URL é o caminho para o arquivo .jsp, incluindo o nome do arquivo. Essa JSP será mapeada automaticamente para o URL /guestbook.jsp.

Queremos que essa seja a página inicial do aplicativo do livro de visitas, exibida quando alguém acessa o URL /. Uma maneira fácil de fazer isso é declarar no web.xml que guestbook.jsp é o servlet de "boas-vindas" para esse caminho.

Edite war/WEB-INF/web.xml e substitua o elemento <welcome-file> atual no <welcome-file-list>. Certifique-se de remover index.html da lista, pois os arquivos estáticos têm prioridade sobre a JSP e os servlets.

    <welcome-file-list>
        <welcome-file>guestbook.jsp</welcome-file>
    </welcome-file-list>

Dica: Se estiver usando o Eclipse, o editor pode abrir esse arquivo no modo "Design". Para editá-lo como XML, selecione a guia "Source" (Código) na parte inferior da estrutura.

Interrompa e inicie o servidor de desenvolvimento. Visite o seguinte URL:

O aplicativo exibe o conteúdo de guestbook.jsp, incluindo o apelido do usuário se ele tiver feito login.

Ao carregar uma JSP pela primeira vez, o servidor de desenvolvimento converte a JSP em código fonte Java e o compila em Java bytecode. O código fonte Java e a classe compilada são salvos em um diretório temporário. O servidor de desenvolvimento gera novamente e compila as JSPs automaticamente se os arquivos JSP originais forem alterados.

Ao enviar o aplicativo para o Google App Engine, o SDK compila todas as JSPs em bytecode e envia apenas o bytecode. Quando executado no Google App Engine, o aplicativo usa as classes JSP compiladas.

O formulário do livro de visitas

O aplicativo do nosso livro de visitas precisará de um formulário da web para que o usuário possa postar uma saudação nova e de uma maneira de processar esse formulário. O HTML do formulário irá para a JSP. O destino do formulário será um URL novo, /sign, a ser manipulado por uma nova classe de servlet, SignGuestbookServlet. SignGuestbookServlet processará o formulário e redirecionará o navegador do usuário de volta ao /guestbook.jsp. No momento, o novo servlet gravará no registro apenas a mensagem postada.

Edite guestbook.jsp e acrescente as linhas a seguir acima da tag </body> de fechamento:

  ...

  <form action="/sign" method="post">
    <div><textarea name="content" rows="3" cols="60"></textarea></div>
    <div><input type="submit" value="Post Greeting" /></div>
  </form>

  </body>
</html>

Crie uma classe nova chamada SignGuestbookServlet no pacote guestbook (quem não está usando o Eclipse deve criar o arquivo SignGuestbookServlet.java no diretório src/guestbook/). Forneça os seguintes conteúdos ao arquivo de origem:

package guestbook;

import java.io.IOException;
import java.util.logging.Logger;
import javax.servlet.http.*;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;

public class SignGuestbookServlet extends HttpServlet {
    private static final Logger log = Logger.getLogger(SignGuestbookServlet.class.getName());

    public void doPost(HttpServletRequest req, HttpServletResponse resp)
                throws IOException {
        UserService userService = UserServiceFactory.getUserService();
        User user = userService.getCurrentUser();

        String content = req.getParameter("content");
        if (content == null) {
            content = "(No greeting)";
        }
        if (user != null) {
            log.info("Greeting posted by user " + user.getNickname() + ": " + content);
        } else {
            log.info("Greeting posted anonymously: " + content);
        }
        resp.sendRedirect("/intl/pt-BR/guestbook.jsp");
    }
}

Edite war/WEB-INF/web.xml e adicione as linhas a seguir para declarar o servlet SignGuestbookServlet e mapeá-lo para o URL /sign:

<web-app xmlns="http://java.sun.com/xml/ns/javaee" version="2.5">
    ...

    <servlet>
        <servlet-name>sign</servlet-name>
        <servlet-class>guestbook.SignGuestbookServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>sign</servlet-name>
        <url-pattern>/sign</url-pattern>
    </servlet-mapping>

    ...
</web-app>

O novo servlet usa a classe java.util.logging.Logger para gravar mensagens no registro. Para controlar o comportamento dessa classe, use um arquivo logging.properties e uma propriedade do sistema definida no arquivo appengine-web.xml do aplicativo. Se estiver usando o Eclipse, o seu aplicativo foi criado com uma versão padrão desse arquivo no src/ do aplicativo e a propriedade de sistema adequada.

Se não estiver usando o Eclipse, configure o arquivo de configuração do registrador manualmente. Copie o arquivo de exemplo do SDK appengine-java-sdk/config/user/logging.properties para o diretório war/WEB-INF/ do seu aplicativo. Em seguida, edite o arquivo war/WEB-INF/appengine-web.xml do aplicativo como indicado:

<appengine-web-app xmlns="http://appengine.google.com/ns/1.0">
    ...

    <system-properties>
        <property name="java.util.logging.config.file" value="WEB-INF/logging.properties"/>
    </system-properties>

</appengine-web-app>

O servlet registra as mensagens usando o nível de registro INFO (usando log.info()). O nível de registro padrão é WARNING, que omite as mensagens INFO da saída. Para alterar o nível de registro de todas as classes no pacote guestbook, edite o arquivo logging.properties e adicione uma entrada para guestbook.level, conforme indicado abaixo:

.level = WARNING
guestbook.level = INFO

...

Dica: Quando o seu aplicativo registra as mensagens usando a API java.util.logging.Logger enquanto está sendo executado no Google App Engine, o Google App Engine grava as mensagens e as disponibiliza para navegação no Console de administração e para download com a ferramenta AppCfg. O Console de administração permite navegar pelas mensagens por nível de registro.

Recompile, reinicie e teste http://localhost:8080/. O formulário é exibido. Digite algum texto e envie o formulário. O navegador envia o formulário para o aplicativo e redireciona a página de volta para o formulário vazio. O servidor registra os dados da saudação no console.

Próximo passo...

Já temos uma interface de usuário para solicitar que o usuário digite uma saudação. Precisamos agora de uma maneira de lembrar as saudações postadas pelo usuário e mostrá-las para os outros visitantes. Para isso, usaremos o armazenamento de dados do Google App Engine.

Vá para Uso do armazenamento de dados com JDO.