2 de dez. de 2007

Curso Struts - Aula 01

LivroAction.java
package br.com.livrariaweb.controle;

import java.util.List;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import br.com.livrariaweb.entidades.Livro;
import br.com.livrariaweb.servico.LivroServico;

public class LivroAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,
  HttpServletRequest request, HttpServletResponse response)
  throws Exception {

 LivroServico servico = new LivroServico();
 List l = servico.listar();
 request.setAttribute("livros", l);
 return mapping.findForward("listar");
}
}
LivroAction.java
package br.com.livrariaweb.controle;

import org.apache.struts.action.ActionForm;

public class LivroForm extends ActionForm{

private static final long serialVersionUID = 1L;

private Integer id;

private String titulo;

private String autor;

private Integer nroEdicao;

private Double valor;

       // gets e sets
}
LivroSalvarAction.java
package br.com.livrariaweb.controle;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.beanutils.BeanUtils;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;

import br.com.livrariaweb.entidades.Livro;
import br.com.livrariaweb.servico.LivroServico;

public class LivroSalvarAction extends Action {

public ActionForward execute(ActionMapping mapping, ActionForm form,
  HttpServletRequest request, HttpServletResponse response)
  throws Exception {
 Livro l = new Livro();
 BeanUtils.copyProperties(l, (LivroForm) form);
 LivroServico s = new LivroServico();
 s.salvar(l);
 return mapping.findForward("listar");
}
}
LivroAction.java
package br.com.livrariaweb.entidades;

import java.io.Serializable;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;

@Entity
public class Livro implements Serializable {

private static final long serialVersionUID = 1L;

@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;

private String titulo;

private String autor;

private Integer nroEdicao;

private Double valor;

       // gets e sets
}
LivroServico.java
package br.com.livrariaweb.servico;

import java.util.List;

import org.hibernate.Session;

import br.com.livrariaweb.entidades.Livro;
import br.com.livrariaweb.util.HibernateUtil;

public class LivroServico {

public Livro salvar(Livro livro) {
 Session s = HibernateUtil.getSessionFactory().openSession();
 s.beginTransaction();
 s.save(livro);
 s.getTransaction().commit();
 s.close();
 return livro;
}

@SuppressWarnings("unchecked")
public List listar() {
 Session s = HibernateUtil.getSessionFactory().openSession();
 s.beginTransaction();
 List l = s.createCriteria(Livro.class).list();
 s.getTransaction().commit();
 s.close();
 return l;
}
}
HibernateUtil.java
package br.com.livrariaweb.util;

import org.hibernate.SessionFactory;
import org.hibernate.cfg.AnnotationConfiguration;

public class HibernateUtil {

private static final SessionFactory sessionFactory;

static {
 try {
  // Criando a SessionFactory apartir no hibernate.cfg.xml
  sessionFactory = new AnnotationConfiguration().configure()
    .buildSessionFactory();
 } catch (Throwable ex) {
  System.err.println("Não foi possivel criar a SessionFactory." + ex);
  throw new ExceptionInInitializerError(ex);
 }
}

public static SessionFactory getSessionFactory() {
 return sessionFactory;
}

}
criar.jsp
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
<%@ taglib uri="http://struts.apache.org/tags-nested" prefix="nested"%>

<html:html>
<body>
<html:form action="/LivroSalvar.do" focus="titulo">
<h1>Criar Livro</h1>

<p><b>Título</b><br>
<html:text property="titulo"></html:text></p>
<p><b>Autor</b><br>
<html:text property="autor"></html:text></p>
<p><b>Número da Edição</b><br>
<html:text property="nroEdicao"></html:text></p>
<p><b>Valor</b><br>
<html:text property="valor"></html:text></p>
<html:submit>Salvar</html:submit>
</html:form>
</body>
</html:html>
listar.jsp
<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean"%>
<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html"%>
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic"%>
<%@ taglib uri="http://struts.apache.org/tags-nested" prefix="nested"%>

<html:html>
<body>
<h1>Livros</h1>
<table border="1" cellpadding="1">
<tr>
 <th>Titulo</th>
 <th>Autor</th>
 <th>Valor</th>
</tr>
<logic:iterate id="l" name="livros">
 <tr>
  <td><bean:write name="l" property="titulo" /></td>
  <td><bean:write name="l" property="autor" /></td>
  <td><bean:write name="l" property="valor" /></td>
 </tr>
</logic:iterate>
</table>
<p><html:link href="jsp/livro/criar.jsp" >Criar Livro</html:link></p>
</body>
</html:html>
inicio.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
 <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
 <title>Aplicacao Struts</title>
</head>
<body>
 Aplicacao Struts no Ar!
 <br>
 <a href="<%=request.getContextPath()%>/Livros.do">Livros</a>
</body>
</html>
index.jsp
<%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>
<logic:redirect forward="inicio"/>
struts-config.xml
<?xml version="1.0" encoding="ISO-8859-1" ?>

<!DOCTYPE struts-config PUBLIC
         "-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
         "http://struts.apache.org/dtds/struts-config_1_3.dtd">

<struts-config>

<!-- Definicao dos Formulario de Beans -->
<form-beans>
 <form-bean name="livroForm"
  type="br.com.livrariaweb.controle.LivroForm" />
</form-beans>

<!-- Definicao de Excecoes Globais -->
<global-exceptions></global-exceptions>

<!-- Definicao de Redirecionamento Global -->
<global-forwards>
 <forward name="inicio" path="/Inicio.do" />
</global-forwards>

<!-- Mapeamento de Acoes -->
<action-mappings>
 <action path="/Inicio" forward="/jsp/inicio.jsp" />

 <action path="/Livros"
  type="br.com.livrariaweb.controle.LivroAction">
  <forward name="listar" path="/jsp/livro/listar.jsp" />
 </action>

 <action path="/LivroSalvar"
  type="br.com.livrariaweb.controle.LivroSalvarAction" name="livroForm"
  scope="request" input="/jsp/livro/criar.jsp">
  <forward name="listar" path="/Livros.do" redirect="true"/>
 </action>
</action-mappings>

<!-- Arquivo de Definicao de Mensagens -->
<message-resources parameter="MessageResources" />

</struts-config>
web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app PUBLIC
"-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<display-name>Aplicacao Struts</display-name>

<!-- Configuracoes do Strtuts -->
<servlet>
 <servlet-name>action</servlet-name>
 <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
 <init-param>
  <param-name>config</param-name>
  <param-value>/WEB-INF/struts-config.xml</param-value>
 </init-param>
 <load-on-startup>2</load-on-startup>
</servlet>

<servlet-mapping>
 <servlet-name>action</servlet-name>
 <url-pattern>*.do</url-pattern>
</servlet-mapping>

<!-- Pagina Inicial -->
<welcome-file-list>
 <welcome-file>index.jsp</welcome-file>
</welcome-file-list>
</web-app>

Resposta ao comentário do Renan:
Renan, esse é um assunto que iremos tratar na próxima aula. Até agora as nossas classes de ação elas herdam de "Action" mas temos uma outra classe também do struts que é chamada de "DispatchAction". Essa nova classe permite implementarmos diversos métodos dentro de uma única classe de ação. A assinatura do método vai ser a mesma para o método "execute".
Por exemplo:
public final class UsuarioAction extends DispatchAction {
public ActionForward novo (ActionMapping mapping, ActionForm form, 
            HttpServletRequest request, HttpServletResponse response) 
            throws Exception { 
        // sua acao... 
    } 
 
public ActionForward salva (ActionMapping mapping, ActionForm form, 
            HttpServletRequest request, HttpServletResponse response) 
           throws Exception { 
        // // sua acao... 
    } 
 
    public ActionForward edita (ActionMapping mapping, ActionForm form, 
            HttpServletRequest request, HttpServletResponse response) 
            throws Exception { 
        // // sua acao... 
    } 
 
} 

Só tem um detalhe o mapeamento da sua action vai precisar de mais um parametro, o "parameter":
<action path="/Usuario"
type="br.com.loteriaweb.controle.UsuarioAction"
name="usuarioForm"
scope="request"
input="/jsp/usuario/cria.jsp"
parameter="submit"/>

ele corresponde ao método que você vai acessar. Ou seja. no seu formulario vc precisa ter um campo hidden com nome de submit que informa a ação que será executada. Vc pode utilizar um javascript para controlar essa decisão. Não fico muito feliz quando tenho que utilizar javascript então na aula eu mostro uma dica boa.

4 comentários:

Anônimo disse...

Tiago,

Estou querendo implementar na livraria web um cadastro de usuarios e surgiu uma dúvida com relacao as actions...
Para cada action(listar ou criar) vou ter que implementar uma classe?
- LivroListarAction
- LivroCriarAction
- UsuarioListarAction
- UsuarioCriarAction

Tiago Ramos disse...

Renan, estou respondendo seu dúvida no fim do post.

Anônimo disse...

Tiago,

Já fiz incluir e listar usuario...
agora surgiu uma duvida em como implementar alterar e excluir...

Estou fazendo da seguinte forma:
listando os usuarios ja com os links de alterar e excluir. Nesse caso eu teria que passar o id do usuario correspondente via url?
logic:iterate id="l" name="usuarios"
tr
td bean:write name="l" property="id"/>td
td bean:write name="l" property="matricula"/>/td
td bean:write name="l" property="nome"/>/td
td bean:write name="l" property="cpf"/>/td
td bean:write name="l" property="usuario"/>/td
td a href="Alterar.do?id=?????">Alterar Usuário/a||a href="Excluir.do?id=????">Excluir Usuário/a/td
/tr
logic:iterate

Tiago Ramos disse...

Essa não é a melhor prática da vida mas seria isso sim.

Google