Java para Web
231 pág.

Java para Web


DisciplinaOrientação A Objetos170 materiais1.087 seguidores
Pré-visualização45 páginas
<forward name=&quot;ok&quot; path=&quot;/exemplo.jsp&quot;/>
</action>
Capítulo 14 - Struts Framework - Exercícios: TesteSimplesAction - Página 123
Material do Treinamento Java para Desenvolvimento Web
</action-mappings>
</struts-config>
4) Reinicie o Tomcat.
5) Teste a URL http://localhost:8080/struts/teste.do
Reload automático do struts-config.xml
O Struts não faz o reload automático do arquivo struts-config.xml.
Um truque para fazer isso funcionar (que só é útil durante o desenvolvimento da sua aplicação) é
colocar esse arquivo no seu diretório src, portanto será jogado no diretório classes, o classpath.
Já no seu arquivo web.xml configure o struts com um parâmetro de inicialização de servlet para ler
o arquivo dentro do diretório classes (/WEB-INF/classes/struts-config.xml):
<init-param>
<param-name>config</param-name>
<param-value>/WEB-INF/classes/struts-config.xml</param-value>
</init-param>
Agora, toda vez que o arquivo for alterado, o Tomcat percebe uma mudança no classpath
do projeto e reinicia a sua aplicação web.
Cuidado pois essa funcionalidade de reinicialização de contextos pode nem sempre
funcionar como você espera. Um caso simples é iniciar threads separadas e deixá-las
rodando no background, o que acontece?
14.7 - Erros comuns
1) O erro mais famoso nos primeiros exemplos de uma Action do Struts é colocar o nome do forward de maneira
inválida, por exemplo, em minúsculo no struts-config.xml e em maiúsculo na sua classe. Lembre-se, o
Java é case-sensitive e assim será a maior parte de suas bibliotecas!
Como o Struts não encontra um redirecionamento com tal chave, o método findForward retorna null, resul-
tado: uma tela em branco.
2) Outro erro comum é esquecer de colocar a barra antes do nome do redirecionamento. Todo path de forward
deve começar com uma barra. Se você colocar somente exemplo.jsp o erro diz claramente que faltou uma
barra:
Capítulo 14 - Struts Framework - Erros comuns - Página 124
Material do Treinamento Java para Desenvolvimento Web
3) É comum errar o nome da classe de sua action, como por exemplo esquecer o .com e digitar
br.caelum.struts.action.TesteSimplesAction. Nesse caso o Struts não consegue instanciar sua action:
4) A classe Action possui dois métodos execute: um com HttpServletRequest% e %Response% e um com Ser-
vletRequest e Responseprimeiro método. Caso usemos o segundo, recebemos uma página em branco.
5) Por último, o erro dos esquecidos. Se você não criar o arquivo JSP ou colocar um nome inválido o erro é o
já conhecido 404:
Capítulo 14 - Struts Framework - Erros comuns - Página 125
Material do Treinamento Java para Desenvolvimento Web
14.8 - Pesquisando um banco de dados
Continuando com nossa aplicação criada no capítulo anterior, iremos montar agora um esquema de simu-
lação de acesso a um banco de dados para listar todos os contatos através do MVC e usando Struts, JSP e
JDBC.
Repare que já estamos usando três camadas e três bibliotecas diferentes!
14.9 - Criando a ação
Para criar a ação de listagem basta utilizarmos a idéia de criar um novo objeto do tipo DAO e chamar o
método de lista:
// pesquisa no banco de dados a lista completa
List<Contato> lista = new ContatoDAO().getLista();
Mas, espere um pouco, esse é o exemplo que vimos no começo da apostila? Até aqui, sem novidades. A
questão que fica é como enviar o conteúdo referenciado pela variável lista para a página JSP que será acessada
em breve.
Precisamos de um escopo de variável que sobreviva ao método execute e continue durante o forward da
requisição até o arquivo JSP. Repare que a frase anterior entrega a solução: o escopo da requisição.
Atrelaremos o valor referenciado pela variável lista para um nome qualquer ligada a requisição do cliente.
Esse valor só ficará lá até o término da requisição, tempo suficiente para mostrá-lo no arquivo jsp.
Podemos adicioná-la como atributo no request, para que nossa página JSP possa receber tal objeto. Supo-
nha que desejamos chamar nossa lista de \u201ccontatos&quot;:
request.setAttribute(&quot;contatos&quot;, lista);
E o redirecionamento é simples:
return mapping.findForward(&quot;lista&quot;);
Portanto, o código final de nossa ação é:
package br.com.caelum.struts.action;
// imports aqui
public class ListaContatosAction extends Action {
Capítulo 14 - Struts Framework - Pesquisando um banco de dados - Página 126
Material do Treinamento Java para Desenvolvimento Web
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// pesquisa no banco de dados a lista completa
List<Contato> lista = new ContatoDAO().getLista();
request.setAttribute(&quot;contatos&quot;, lista);
// ok.... para onde ir agora?
return mapping.findForward(&quot;lista&quot;);
}
}
14.10 - O arquivo WebContent/lista.jsp
Para criarmos o JSP de listagem, temos três opções. A primeira seria escrever o código através de scriplets,
que já vimos no capítulo de JSP: não é uma boa solução.
A segunda opção é utilizar a biblioteca de tags de lógica do Struts, a struts-logic, que funciona e é uma
alternativa.
A terceira, é utilizar JSTL. Qual a diferença entre a struts-logic e a JSTL core? Acontece que a biblioteca
do Struts veio antes da JSTL: a JSTL é a tentativa de padronizar essas taglibs que apareceram pelo mundo
inteiro. Sendo assim, todos, inclusive o grupo Apache, estão migrando para a JSTL. Por essa razão, seguiremos
no curso apenas com a JSTL, que é a biblioteca padrão.
Como fizemos antes, primeiro devemos declarar a variável, que está sendo lida do request. Logo depois
iteramos por todos os itens:
<!-- for -->
<c:forEach var=&quot;contato&quot; items=&quot;${contatos}&quot;>
${contato.id} - ${contato.nome} <br/>
</c:forEach>
Portanto, o arquivo final, com cabeçalho e tudo o que faltava, fica sendo:
<%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot; %>
<html>
<!-- for -->
<c:forEach var=&quot;contato&quot; items=&quot;${contatos}&quot;>
${contato.id} - ${contato.nome} <br/>
</c:forEach>
</html>
Nesse momento, você se pergunta: mas o JSP não declarou a variável contatos?! Exato, ele não declarou.
A expression language buscará o valor de tal chave no request (e em outros lugares, que veremos adiante no
curso) e utilizá-la para a iteração, ou seja ele não tem ligação direta com o DAO, ele sabe que vem uma variável
contatos, mas não sabe de onde.
Capítulo 14 - Struts Framework - O arquivo WebContent/lista.jsp - Página 127
Material do Treinamento Java para Desenvolvimento Web
14.11 - ListaContatos no struts-config.xml
Por fim, vamos alterar o struts-config.xml para configurar nossa ação:
<action path=&quot;/listaContatos&quot; type=&quot;br.com.caelum.struts.action.ListaContatosAction&quot;>
<forward name=&quot;lista&quot; path=&quot;/lista.jsp&quot;/>
</action>
Portanto, para testarmos nossa aplicação, devemos reiniciar o Tomcat e utilizar o link /listaContatos.do.
Repare que agora não faz mais sentido acessar o JSP de listagem diretamente pois a variável não existe!
14.12 - Exercício: ListaContatosAction
Vamos criar sua listagem de contatos:
1) Crie sua classe de lógica ListaContatosAction no mesmo pacote br.com.caelum.struts.action:
a) Lembre-se de estender a classe Action
b) Implemente o método execute:
@Override
public ActionForward execute(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response)
throws Exception {
// pesquisa no banco de dados a lista completa
List<Contato> lista = new ContatoDAO().getLista();
request.setAttribute(&quot;contatos&quot;, lista);
// ok.... para onde ir agora?
return mapping.findForward(&quot;lista&quot;);
}
2) Configure o struts-config.xml
<action path=&quot;/listaContatos&quot; type=&quot;br.com.caelum.struts.action.ListaContatosAction&quot;>
<forward name=&quot;lista&quot; path=&quot;/lista.jsp&quot;/>
</action>
3) Crie seu JSP de resultado WebContent/lista.jsp
<%@ taglib uri=&quot;http://java.sun.com/jsp/jstl/core&quot; prefix=&quot;c&quot;