O Google Code é oferecido em: English - Español - 日本語 - 한국어 - Português - Pусский - 中文(简体) - 中文(繁體)
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.
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 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.
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.