(ainda não pus a legenda das imagens )
Requisitos :
- Netbeans 7.2
- spring-3.2.0.M2 -- link direto
- estar com o banco mysql springlessons, e a tabela contato criada.
- Struts 2
- Lib XStream , para manipular arquivos XML .
- Ter lido :
Posts Anteriores :
JSNBTut - Lesson 01 - introdução ao Spring
JSNBTut - Lesson 02 - introdução ao gerenciamento de dependências no SpringJSNBTut - Lesson 03 - acessando banco de dados Mysql com beans e injeção de dependências
JSNBTut - Lesson 04 - outro jeito rápido de utilizar o Spring e Mysql sem utilizar Arquivos XML.
JSNBTut - Lesson 05 - comparação entre as implementações e introdução ao Swing. Jtable + DefaultTableModel e implementação de uma TableModel, ...
JSNBTut - Lesson 06 - implementando um CRUD ao exemplo , que é o projeto que continua da lição 5.
- Finalizando o CRUD completo em Java utilizando Swing e Spring
- Implementamos um validador com org.springframework.validation.Validator
- Implementamos um Tema
- Vimos como importar /exportar arquivos XML usando XStream
- Aprendemos a usar Anotações
- Implementamos um SplashScreen
- Aprendemos a distribuir nossa aplicação e customizar o build do projeto no build.xml
JSNBTut - Lesson 08
- Organização de projetos WEB
- Implementar o Struts 1.3.10
- Criamos uma interface contatoDAO
- implementamos a interface com a classe ContatoDaoImpl
- criamos uma interface de Serviço ContatoService
- implementamos a interface com a classe ContatoServiceImpl
- Criamos as classes p/ atender os actions que são mapeados no arquivo struts-config.xml, que extendem a classe org.apache.struts.action.Action
- Definimos as actions e mappings no arquivo struts-config.xml
- criamos uma view através de um arquivo index.jsp
- Criamos uma vier p/ mostrar os erros
- Integramos o Spring 3 com o Struts 2
- Definimos nossos beans no arquivo action-servlet.xml
- Vimos nos logs a ordem em que as classes são instanciadas e como localizar erros
- Compartilhamos a conexão através de uma classe ConexaoMysql
Este é o 9º da série , o objetivo deste post é implementar o programa que terminamos na lição 07 na web utilizando o framework Struts 2 , e depois integraremos com o Spring 3 e o Hibernate 3, passando o controle da app p/ o Spring.
Os arquivos dos 2 projetos finalizados nesse Post estão ao final das explicações ou no final deste Post:
Nesta lição , eu procurei capturar quase todos os passos em telas, pois nada como a referência de cada framework ou componente p/ explicar sua utilização, o que mostro aqui é um jeito de implementar.
Adiantando, algumas coisas que faremos ?
- Aprenderemos a conectar no Mysql pelo NB e armazenar um driver
- Aprenderemos a utilizar e configurar o Hibernate pelo NB
- Aprenderemos a fazer a engenharia reversa das tabelas do banco para as configurações do Hibernate gerando os arquivos de para os mappings: Hibernate Mapping
na versão V1:
- Introduziremos o Full Hibernate Plugin's Session Factory
- Introduziremos o conceito de BO (Business Objects)
- Utilizar os recursos de Injeção de dependências do Spring:
- Deixaremos a app apenas (pode ser que sobre alguma) com as libs necessárias no final do Projeto.
Nesta lição adicionei o campo email:
Lembrando a estrutura da nossa tabela do mysql
![]() |
Figura 01 - Tabela Contato |
CREATE TABLE IF NOT EXISTS `springlessons`.`contato` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `nome` VARCHAR(45) NULL DEFAULT NULL , `telefone` VARCHAR(45) NULL DEFAULT NULL , `email` VARCHAR(45) NULL DEFAULT NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci
Let's Go.
1) Obtendo as Libs
Não consegui utilizar as libs adicionadas ao projeto pelo NB. Portanto vamos adicionar algumas manualmente , e depois organizar.
LIBS:
Struts 2:
-antlr-2.7.6.jar
-commons-collections-3.1.jar
-commons-fileupload-1.2.1.jar
-commons-io-1.3.2.jar
-commons-lang-2.3.jar
-commons-logging-1.1.jar
-freemarker-2.3.13.jar
-javassist-3.9.0.GA.jar
-ognl-2.6.11.jar
-struts2-convention-plugin-2.1.6.jar
-struts2-core-2.1.6.jar
-struts2-fullhibernatecore-plugin-1.4-GA.jar
-xwork-2.1.2.jar
Hibernate 3
-ejb3-persistence.jar
-hibernate-annotations.jar
-hibernate-commons-annotations.jar
-hibernate-validator.jar
-hibernate3.jar
-jta-1.1.jar
Dom4j
-dom4j-1.6.1.jar
apache-log4j-1.2.17
-log4j-1.2.15.jar
slf4j-1.7.1
-slf4j-api-1.5.8.jar
-slf4j-log4j12-1.5.8.jar
jUnit
-junit-3.8.1.jar
2) Iniciando o Projeto
![]() |
Figura 02 - Nova WebApp |
![]() | |
|
![]() |
Figura 04- Sem Frameworks |
![]() |
Figura 05 - Lista das libs utilizadas |
2)-Adicionando a conexão do mysql ao NB
![]() |
Figura 06 - Conectando o NB ao Mysql |
![]() |
Figura 07 - Conectando o NB ao Mysql |
![]() |
Figura 08 - Conectando o NB ao Mysql - novo driver |
![]() |
Figura 09 - Conectando o NB ao Mysql - Teste de conexão |
![]() |
Figura 10 - Driver disponíveis |
3)-Criando o arquivo de configuração do Hibernate pelo NB
Isso criará o arquivo hibernate.cfg.xml![]() |
Figura 11 - Gerando o arquivo hibernate.cfg.xml |
![]() |
Figura 12 - Gerando o arquivo hibernate.cfg.xml pelo Wizard |
![]() |
Figura 13-confirme o nome do arquivo hibernate.cfg.xml |
![]() |
Figura 14-Escolha a conexão |
![]() |
Figura 15- Arquivo gerado hibernate.cfg.xml |
![]() |
Figura 16 - configurando a engenharia reversa das tabelas |
![]() | |
|
![]() | |
|
![]() |
Figura 19-Arquivo gerado hibernate.revenge.xml |
4)-Fazendo a Engenharia reversa das tabelas do schema e Adicionando o mapeamento aos campos
Isso criará o arquivo hibernate.reveng.xml e os nossos Modelos Contato.java e Usuario.java![]() | |
|
![]() |
Figura 21 - fazendo a engenharia reversa das tabelas, escolha os arquivos XML criados |
![]() |
Figura 22 -Arquivos gerados |
![]() |
Figura 23 -Arquivo final do hibernate |
hibernate.cfg.xml :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"> <hibernate-configuration> <session-factory> <property name="hibernate.dialect">org.hibernate.dialect.MySQLDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://ns1:3306/springlessons?zeroDateTimeBehavior=convertToNull</property> <property name="hibernate.connection.username">springlessons</property> <property name="hibernate.connection.password">DHADdSXcDF29WGXy</property> <mapping resource="com/springlesson09/model/Usuario.hbm.xml"/> <mapping resource="com/springlesson09/model/Contato.hbm.xml"/> </session-factory> </hibernate-configuration>
hibernate.revenge.xml :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-reverse-engineering PUBLIC "-//Hibernate/Hibernate Reverse Engineering DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-reverse-engineering-3.0.dtd"> <hibernate-reverse-engineering> <schema-selection match-catalog="springlessons"/> <table-filter match-name="contato"/> <table-filter match-name="usuario"/> </hibernate-reverse-engineering>
Contato.hbm.xml :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated Oct 1, 2012 11:10:50 PM by Hibernate Tools 3.2.1.GA --> <hibernate-mapping> <class catalog="springlessons" name="com.springlesson09.model.Contato" table="contato"> <id name="id" type="java.lang.Integer"> <column name="id"/> <generator class="identity"/> </id> <property name="nome" type="string"> <column length="45" name="nome"/> </property> <property name="telefone" type="string"> <column length="45" name="telefone"/> </property> <property name="email" type="string"> <column length="45" name="email"/> </property> </class> </hibernate-mapping>
Usuario.hbm.xml :
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated Oct 1, 2012 11:10:50 PM by Hibernate Tools 3.2.1.GA --> <hibernate-mapping> <class catalog="springlessons" name="com.springlesson09.model.Usuario" table="usuario"> <id name="id" type="java.lang.Integer"> <column name="id"/> <generator class="identity"/> </id> <property name="nome" type="string"> <column length="45" name="nome" not-null="true"/> </property> <property name="email" type="string"> <column length="45" name="email" not-null="true"> <comment>licao 09 - WEB</comment> </column> </property> <property name="senha" type="string"> <column length="45" name="senha" not-null="true"/> </property> </class> </hibernate-mapping>
Usuario.java :
package com.springlesson09.model; // Generated Oct 1, 2012 11:10:44 PM by Hibernate Tools 3.2.1.GA /** * Usuario generated by hbm2java */ public class Usuario implements java.io.Serializable { private Integer id; private String nome; private String email; private String senha; public Usuario() { } public Usuario(String nome, String email, String senha) { this.nome = nome; this.email = email; this.senha = senha; } public Integer getId() { return this.id; } public void setId(Integer id) { this.id = id; } public String getNome() { return this.nome; } public void setNome(String nome) { this.nome = nome; } public String getEmail() { return this.email; } public void setEmail(String email) { this.email = email; } public String getSenha() { return this.senha; } public void setSenha(String senha) { this.senha = senha; } }
Contato.java :
package com.springlesson09.model; // Generated Oct 1, 2012 11:10:44 PM by Hibernate Tools 3.2.1.GA /** * Contato generated by hbm2java */ public class Contato implements java.io.Serializable { private Integer id; private String nome; private String telefone; private String email; public Contato() { } public Contato(String nome, String telefone, String email) { this.nome = nome; this.telefone = telefone; this.email = email; } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getNome() { return this.nome; } public void setNome(String nome) { this.nome = nome; } public String getTelefone() { return this.telefone; } public void setTelefone(String telefone) { this.telefone = telefone; } public String getEmail() { return this.email; } public void setEmail(String email) { this.email = email; } }
5)-Criando uma interface DAO
![]() |
Figura 24 - Criando uma interface |
![]() | |
|
ContatoDAO.java
package com.springlesson09.dao; import com.springlesson09.model.Contato; import java.util.List; public interface ContatoDAO { public void saveOrUpdateContato(Contato contato); public List<Contato> listContato(); public Contato listContatoById(Integer contatoId); public void deleteContato(Integer contatoId); }
6) Criando a implementação do DAO
![]() | |
|
![]() |
Figura 27- Implementando uma interface, aproveite o NB |
ContatoDAOImpl.java
package com.springlesson09.dao; import com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget; import com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget; import com.springlesson09.model.Contato; import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; public class ContatoDAOImpl implements ContatoDAO { @SessionTarget Session session; @TransactionTarget Transaction transaction; /** * * @param contato */ @Override public void saveOrUpdateContato(Contato contato) { // throw new UnsupportedOperationException("Not supported yet."); try { session.saveOrUpdate(contato); } catch (Exception e) { transaction.rollback(); e.printStackTrace(); } } /** * * @return */ @SuppressWarnings("unchecked") @Override public List<Contato> listContato() { List<Contato> courses = null; try { courses = session.createQuery("from Contato").list(); } catch (Exception e) { e.printStackTrace(); } return courses; } @Override public Contato listContatoById(Integer contatoId) { Contato contato = null; try { contato = (Contato) session.get(Contato.class, contatoId); } catch (Exception e) { e.printStackTrace(); } return contato; } @Override public void deleteContato(Integer contatoId) { try { Contato contato = (Contato) session.get(Contato.class, contatoId); session.delete(contato); } catch (Exception e) { transaction.rollback(); e.printStackTrace(); } } }
7) Preparando o action (service)
![]() |
Figura 28- Implementando a action |
![]() |
Figura 29- Implementando a action |
ContatoAction.java :
package com.springlesson09.service; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; import com.opensymphony.xwork2.ModelDriven; import com.springlesson09.dao.ContatoDAO; import com.springlesson09.dao.ContatoDAOImpl; import com.springlesson09.model.Contato; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; public class ContatoAction extends ActionSupport implements ModelDriven<Contato> { private static final long serialVersionUID = -6659925652584240539L; private Contato contato = new Contato(); private List<Contato> contatoList = new ArrayList<Contato>(); private ContatoDAO contatoDAO = new ContatoDAOImpl(); @Override public Contato getModel() { return contato; } public String saveOrUpdate() { contatoDAO.saveOrUpdateContato(contato); return SUCCESS; } /** * To list all contatos. * * @return String */ public String list() { contatoList = contatoDAO.listContato(); return SUCCESS; } /** * To delete a contato. * * @return String */ public String delete() { HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); contatoDAO.deleteContato(Integer.parseInt(request.getParameter("id"))); return SUCCESS; } /** * To list a single contato by Id. * * @return String */ public String edit() { HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); contato = contatoDAO.listContatoById(Integer.parseInt(request.getParameter("id"))); return SUCCESS; } public Contato getContato() { return contato; } public void setContato(Contato contato) { this.contato = contato; } public List<Contato> getContatoList() { return contatoList; } public void setContatoList(List<Contato> contatoList) { this.contatoList = contatoList; } }
8) Criando os arquivos XML struts.xml e web.xml
![]() |
Figura 30- Implementando os arquivos XML |
src/struts.xml :
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <package name="default" extends="hibernate-default"> <action name="saveOrUpdateContato" method="saveOrUpdate" class="com.springlesson09.service.ContatoAction"> <result name="success" type="redirect">listContato</result> </action> <action name="listContato" method="list" class="com.springlesson09.service.ContatoAction"> <result name="success">/register.jsp</result> </action> <action name="editContato" method="edit" class="com.springlesson09.service.ContatoAction"> <result name="success">/register.jsp</result> </action> <action name="deleteContato" method="delete" class="com.springlesson09.service.ContatoAction"> <result name="success" type="redirect">listContato</result> </action> </package> </struts>
WEB-INF/web.xml :
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>Struts2Example19</display-name> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
O NB já deve ter criado os arquivo XML context.xml e o beans.xml:
META-INF/context.xml
<?xml version="1.0" encoding="UTF-8"?> <Context antiJARLocking="true" path="/SpringLesson09"/>
WEB-INF/beans.xml:
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/beans_1_0.xsd"> </beans>
Remova a lib do Hibernate que o NB adicionou
![]() |
Figura 31- Limpe o que o NB adicionou |
e deixe apenas as utilizadas.
![]() |
Figura 32- Limpeza das biblotecas |
9) Criando os arquivos jsp e css
I) acertemos o index.jsp que o NB criou :
index.jsp :
III) o style.css
index.jsp :
<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <script type="text/javascript"> location.href='/SpringLesson09/listContato'; </script> </body> </html>II)register.jsp
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@taglib uri="/struts-tags" prefix="s"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Novo Contato</title> <s:head /> <style type="text/css"> @import url(style.css); </style> </head> <body> <s:form action="saveOrUpdateContato"> <s:push value="contato"> <s:hidden name="id" /> <s:textfield name="nome" label="Nome" /> <s:textfield name="telefone" label="Fone" /> <s:textfield name="email" label="Email" /> <s:submit /> </s:push> </s:form> <s:if test="contatoList.size() > 0"> <div class="content"> <table class="contatoTable" cellpadding="5px"> <tr class="even"> <th>Nome</th> <th>Fone</th> <th>Email</th> <th> </th> <th> </th> </tr> <s:iterator value="contatoList" status="contatoStatus"> <tr class="<s:if test="#contatoStatus.odd == true ">odd</s:if><s:else>even</s:else>"> <td><s:property value="nome" /></td> <td><s:property value="telefone" /></td> <td><s:property value="email" /></td> <td><s:url id="editURL" action="editContato"> <s:param name="id" value="%{id}"></s:param> </s:url> <s:a href="%{editURL}">Edit</s:a></td> <td><s:url id="deleteURL" action="deleteContato"> <s:param name="id" value="%{id}"></s:param> </s:url> <s:a href="%{deleteURL}">Delete</s:a></td> </tr> </s:iterator> </table> </div> </s:if> </body> </html>
III) o style.css
@CHARSET "ISO-8859-1"; .content { font-family: sans-serif; font-size: small; } .userTable { border-width: 1px 1px 1px 1px; border-spacing: 2px; border-style: outset outset outset outset; border-color: black black black black; border-collapse: collapse; } .userTable td { border-width: 1px 1px 1px 1px; border-spacing: 2px; border-style: outset outset outset outset; border-color: black black black black; border-collapse: collapse; } .userTable th { border-width: 1px 1px 1px 1px; border-spacing: 2px; border-style: outset outset outset outset; border-color: black black black black; border-collapse: collapse; background-color: rgb(255, 255, 255); } .odd { background-color: #FFFFF0; } .even { background-color: #FAF0E6; }
10) Conferindo a estrutura do projeto :
![]() |
Figura 33- Visão do projeto |
11) Testando
![]() |
Figura 34-1º Teste sem utilizar as DI Spring |
Observe o Log :
INFO: No Spring WebApplicationInitializer types detected on classpath Oct 2, 2012 8:46:08 PM org.apache.catalina.core.ApplicationContext log INFO: Initializing Spring root WebApplicationContext Oct 2, 2012 8:50:54 PM org.apache.catalina.core.ApplicationContext log INFO: SessionListener: contextDestroyed() Oct 2, 2012 8:50:54 PM org.apache.catalina.core.ApplicationContext log INFO: ContextListener: contextDestroyed() Oct 2, 2012 8:52:25 PM org.apache.catalina.core.ApplicationContext log INFO: No Spring WebApplicationInitializer types detected on classpath Oct 2, 2012 8:52:25 PM org.apache.catalina.core.ApplicationContext log INFO: Initializing Spring root WebApplicationContext Oct 2, 2012 8:52:36 PM org.apache.catalina.core.ApplicationContext log INFO: ContextListener: contextInitialized() Oct 2, 2012 8:52:36 PM org.apache.catalina.core.ApplicationContext log INFO: SessionListener: contextInitialized() Oct 2, 2012 8:52:36 PM org.apache.catalina.core.ApplicationContext log INFO: ContextListener: attributeAdded('org.apache.jasper.compiler.TldLocationsCache', 'org.apache.jasper.compiler.TldLocationsCache@6a74f160') Oct 2, 2012 8:52:53 PM org.apache.catalina.core.ApplicationContext log INFO: Closing Spring root WebApplicationContext Oct 2, 2012 8:53:10 PM org.apache.catalina.core.ApplicationContext log INFO: No Spring WebApplicationInitializer types detected on classpath Oct 2, 2012 8:53:10 PM org.apache.catalina.core.ApplicationContext log INFO: Initializing Spring root WebApplicationContext Oct 2, 2012 8:54:20 PM org.apache.catalina.core.ApplicationContext log INFO: Closing Spring root WebApplicationContext Oct 2, 2012 8:54:25 PM org.apache.catalina.core.ApplicationContext log INFO: No Spring WebApplicationInitializer types detected on classpath Oct 2, 2012 8:54:25 PM org.apache.catalina.core.ApplicationContext log INFO: Initializing Spring root WebApplicationContext Oct 2, 2012 8:56:40 PM org.apache.catalina.core.ApplicationContext log INFO: Closing Spring root WebApplicationContext Oct 2, 2012 8:56:44 PM org.apache.catalina.core.ApplicationContext log INFO: No Spring WebApplicationInitializer types detected on classpath Oct 2, 2012 8:56:44 PM org.apache.catalina.core.ApplicationContext log INFO: Initializing Spring root WebApplicationContext Oct 2, 2012 9:02:24 PM org.apache.catalina.core.ApplicationContext log INFO: No Spring WebApplicationInitializer types detected on classpath Oct 2, 2012 9:02:24 PM org.apache.catalina.core.ApplicationContext log INFO: Initializing Spring root WebApplicationContext Oct 2, 2012 9:02:37 PM org.apache.catalina.core.ApplicationContext log INFO: ContextListener: contextInitialized() Oct 2, 2012 9:02:37 PM org.apache.catalina.core.ApplicationContext log INFO: SessionListener: contextInitialized() Oct 2, 2012 9:02:37 PM org.apache.catalina.core.ApplicationContext log INFO: ContextListener: attributeAdded('org.apache.jasper.compiler.TldLocationsCache', 'org.apache.jasper.compiler.TldLocationsCache@fae7b85')
Experimente adicionar, atualizar e excluir registros:
Download do projeto NB:
Certo. Já que as lições são sobre o Spring. Vamos fazer o Spring gerenciar tudo isso
vou começar outra numeração:
Para que o Spring possa gerenciar os beans, precisaremos fazer algumas modificações no projeto.
Como implementar um BO(Business Objects) em vez de um serviço, essa adaptação fiz do mkYoung
e por isso no App vc verá uma estrutura para uma tabela customer, que tem a mesma implementação com menos métodos.
II) compie e instale
307 cd /Users/surfer/Downloads/JavaDocs/apr-1.4.6
308 ./configure
309 make
310 sudo make install
311 cd /Library/Java/Extensions
322 ln -s /usr/local/apr/lib/* .
Apos compilar e instalar , instale o native que vem com tomcat que tem como parámetro o local estão os binários do libapr
348 cd /Users/surfer/_java/Servers/apache-tomcat-7.0.30/bin/tomcat-native-1.1.24-src/jni/native
349 ./configure --help
350 ./configure --with-apr=/usr/local/apr/ --with-java-home=/System/Library/Frameworks/JavaVM.framework/Versions/Current/
351 make
352 sudo make install
na proxima vez que vc iniciar o tomcat no log deve aparecer algo como :
Log :
Para que o Spring possa gerenciar os beans, precisaremos fazer algumas modificações no projeto.
Como implementar um BO(Business Objects) em vez de um serviço, essa adaptação fiz do mkYoung
e por isso no App vc verá uma estrutura para uma tabela customer, que tem a mesma implementação com menos métodos.
0) Apr
Se tiver problemas de memória com o TomCat, mesmo definindo no arquivo catalina.sh JAVA_OPTS="-Xms128M -Xmx256" ou mais, e instalando o Apr ou use o GlassFish ;)
I) baixe os fontes da libapr :
![]() |
Figura 35-Instalação do APR |
II) compie e instale
307 cd /Users/surfer/Downloads/JavaDocs/apr-1.4.6
308 ./configure
309 make
310 sudo make install
Apos compilar e instalar , crie os links p/ dentro de uma pasta que já está no CLASSPATH do tomcat
no caso do MAC OSX
311 cd /Library/Java/Extensions
322 ln -s /usr/local/apr/lib/* .
![]() |
Figura 36-linkando as novas libs |
Apos compilar e instalar , instale o native que vem com tomcat que tem como parámetro o local estão os binários do libapr
348 cd /Users/surfer/_java/Servers/apache-tomcat-7.0.30/bin/tomcat-native-1.1.24-src/jni/native
349 ./configure --help
350 ./configure --with-apr=/usr/local/apr/ --with-java-home=/System/Library/Frameworks/JavaVM.framework/Versions/Current/
351 make
352 sudo make install
![]() |
Figura 37-Instalação do APR no tomcat Native |
![]() |
Figura 38-Instalação do APR no tomcat Native |
na proxima vez que vc iniciar o tomcat no log deve aparecer algo como :
Log :
Oct 2, 2012 10:45:09 PM org.apache.catalina.core.AprLifecycleListener init INFO: Loaded APR based Apache Tomcat Native library 1.1.24 using APR version 1.4.6. Oct 2, 2012 10:45:10 PM org.apache.catalina.core.AprLifecycleListener init INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true]. Oct 2, 2012 10:45:10 PM org.apache.catalina.core.AprLifecycleListener initializeSSL INFO: OpenSSL successfully initialized (OpenSSL 0.9.8l 5 Nov 2009) Oct 2, 2012 10:45:12 PM org.apache.coyote.AbstractProtocol init INFO: Initializing ProtocolHandler ["http-apr-8080"] Oct 2, 2012 10:45:12 PM org.apache.coyote.AbstractProtocol init INFO: Initializing ProtocolHandler ["ajp-apr-8009"] Oct 2, 2012 10:45:12 PM org.apache.catalina.startup.Catalina load INFO: Initialization processed in 4661 ms Oct 2, 2012 10:45:12 PM org.apache.catalina.core.StandardService startInternal INFO: Starting service Catalina Oct 2, 2012 10:45:12 PM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet Engine: Apache Tomcat/7.0.30
2) pegue a versão mais atual do full-hibernate-plugin-for-struts2 e verifique as libs
O projeto novo deve ficar com a seguinte estrutura :
![]() |
Figura 39- Visão do projeto p/implementar o Spring |
![]() |
Figura 40- Visão do projeto p/implementar o Spring- Libs |
usei o recurso de mapeamento p/ gerar a classe Customer
3) Crie a interface ContatoBo
![]() |
Figura 41 - Adicionando um BO para o Contato |
Java :
package com.springlesson09.model; import java.util.List; public interface ContatoBo { public void saveOrUpdateContato(Contato contato); public List<Contato> listContato(); public Contato listContatoById(Integer contatoId); public void deleteContato(Integer contatoId); }
4) Implemente a interface ContatoBo
![]() |
Figura 42 - Implementando a Interface do BO |
![]() |
Figura 43 - Implementando a Interface do BO, pelo NB |
Java :
package com.springlesson09.model; import com.springlesson09.dao.CustomerDAO; import java.util.List; public class CustomerBoImpl implements CustomerBo { CustomerDAO customerDAO; //DI via Spring public void setCustomerDAO(CustomerDAO customerDAO) { this.customerDAO = customerDAO; } @Override public void addCustomer(Customer customer) { customerDAO.addCustomer(customer); } @Override public List<Customer> listCustomer() { return customerDAO.listCustomer(); } }
5) Verifique a classe de implementação do ContatoDAO
Usaremos os métodos do hibernate e não da nossa implementação ; observe :
package com.springlesson09.dao; import com.googlecode.s2hibernate.struts2.plugin.annotations.SessionTarget; import com.googlecode.s2hibernate.struts2.plugin.annotations.TransactionTarget; import com.springlesson09.model.Contato; import java.util.List; import org.hibernate.Session; import org.hibernate.Transaction; import org.springframework.orm.hibernate3.support.HibernateDaoSupport; public class ContatoDAOImpl extends HibernateDaoSupport implements ContatoDAO { @SessionTarget Session session; @TransactionTarget Transaction transaction; /** * * @param contato */ // @Override public void saveOrUpdateContato(Contato contato) { try { // session.saveOrUpdate(contato); session.save(contato); } catch (Exception ex) { transaction.rollback(); java.util.logging.Logger.getLogger(ContatoDAOImpl.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } } /** * * @return */ // @SuppressWarnings("unchecked") // @Override public List<Contato> listContato() { List<Contato> contatos = null; try { contatos = session.createQuery("from Contato").list(); } catch (Exception ex) { java.util.logging.Logger.getLogger(ContatoDAOImpl.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } return contatos; } // @Override public Contato listContatoById(Integer contatoId) { Contato contato = null; try { contato = (Contato) session.get(Contato.class, contatoId); } catch (Exception ex) { java.util.logging.Logger.getLogger(ContatoDAOImpl.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } return contato; } // @Override public void deleteContato(Integer contatoId) { try { Contato contato = (Contato) session.get(Contato.class, contatoId); session.delete(contato); } catch (Exception ex) { transaction.rollback(); java.util.logging.Logger.getLogger(ContatoDAOImpl.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); } } }
6) Agora vamos criar a action p/ Contato
vou chmar de outro nome ContatoSpringAction.java p/ enfatizar o uso do Spring
Java :
package com.springlesson09.service; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ModelDriven; import com.springlesson09.dao.ContatoDAO; import com.springlesson09.dao.ContatoDAOImpl; import com.springlesson09.model.Contato; import com.springlesson09.model.ContatoBo; import java.util.ArrayList; import java.util.List; import javax.servlet.http.HttpServletRequest; import org.apache.struts2.ServletActionContext; public class ContatoSpringAction implements ModelDriven { Contato contato = new Contato(); List<Contato> contatoList = new ArrayList<Contato>(); ContatoDAO contatoDAO = new ContatoDAOImpl(); ContatoBo contatoBo; @Override public Object getModel() { return contato; } public Contato getContato() { return contato; } public void setContato(Contato contato) { this.contato = contato; } public List<Contato> getContatoList() { return contatoList; } public void setContatoList(List<Contato> contatoList) { this.contatoList = contatoList; } public ContatoDAO getContatoDAO() { return contatoDAO; } public void setContatoDAO(ContatoDAO contatoDAO) { this.contatoDAO = contatoDAO; } public void setContatoBo(ContatoBo contatoBo) { this.contatoBo = contatoBo; } public String execute() throws Exception { return sync(); } public String sync() throws Exception { return "success"; } public String listcontato() throws Exception { contatoList = contatoDAO.listContato(); return sync(); } public String saveOrUpdateContato() throws Exception { contatoDAO.saveOrUpdateContato(contato); //reload contatoList = null; contatoList = contatoDAO.listContato(); return sync(); } public String listContatoById() throws Exception { contato = contatoDAO.listContatoById(contato.getId()); return sync(); } public String deleteContato() throws Exception { HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); contatoDAO.deleteContato(Integer.parseInt(request.getParameter("id"))); // contatoDAO.deleteContato(contato.getId()); contatoList = null; contatoList = contatoDAO.listContato(); return sync(); } public String edit() throws Exception { HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(ServletActionContext.HTTP_REQUEST); contato = contatoDAO.listContatoById(Integer.parseInt(request.getParameter("id"))); return sync(); } }
7) Implementemos um arquivo de nome jdbc.properties p/ ser lido pelo bean dataSource
![]() |
Figura 44 - Arquivo properties |
jdbc.driverClassName=com.mysql.jdbc.Driver jdbc.url=jdbc:mysql://ns1:3306/springlessons jdbc.username=springlessons jdbc.password=DHADdSXcDF29WGXy
8) Implementemos os Beans no arquivo applicationContext.xml
WEB-INF/applicationContext.xml: obs: neste caso coloquei todos os beans dentro desse arquivo
<?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p="http://www.springframework.org/schema/p" xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-2.5.xsd http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-2.5.xsd"> <!-- Meus Beans --> <!-- customer --> <bean id="customerAction" class="com.springlesson09.service.CustomerAction"> <property name="customerBo" ref="customerBo" /> </bean> <bean id="customerBo" class="com.springlesson09.model.CustomerBoImpl" > <property name="customerDAO" ref="customerDAO" /> </bean> <bean id="customerDAO" class="com.springlesson09.dao.CustomerDAOImpl" > <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- contato --> <bean id="contatoAction" class="com.springlesson09.service.ContatoSpringAction"> <property name="contatoBo" ref="contatoBo" /> </bean> <bean id="contatoBo" class="com.springlesson09.model.ContatoBoImpl" > <property name="contatoDAO" ref="contatoDAO" /> </bean> <bean id="contatoDAO" class="com.springlesson09.dao.ContatoDAOImpl" > <property name="sessionFactory" ref="sessionFactory" /> </bean> <!-- ADD PERSISTENCE SUPPORT HERE (jpa, hibernate, etc) --> <bean class="org.springframework.beans.factory.config.PropertyPlaceholderConfigurer"> <property name="location"> <value>WEB-INF/jdbc.properties</value> </property> </bean> <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource"> <property name="driverClassName" value="${jdbc.driverClassName}" /> <property name="url" value="${jdbc.url}" /> <property name="username" value="${jdbc.username}" /> <property name="password" value="${jdbc.password}" /> </bean> <bean id="sessionFactory" class="org.springframework.orm.hibernate3.LocalSessionFactoryBean"> <property name="dataSource"> <ref bean="dataSource"/> </property> <property name="hibernateProperties"> <props> <prop key="hibernate.dialect">org.hibernate.dialect.MySQLDialect</prop> <prop key="hibernate.show_sql">true</prop> </props> </property> <property name="mappingResources"> <list> <value>com/springlesson09/model/Customer.hbm.xml</value> <value>com/springlesson09/model/Contato.hbm.xml</value> </list> </property> </bean> </beans>
9) Implementemos os Actions no arquivo struts.xml
<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <constant name="struts.devMode" value="true" /> <!--<package name="default" namespace="/" extends="struts-default">--> <package name="default" namespace="/" extends="hibernate-default"> <!-- customer --> <action name="addCustomerAction" class="com.springlesson09.service.CustomerAction" method="addCustomer" > <result name="success">/customer.jsp</result> </action> <action name="listCustomerAction" class="com.springlesson09.service.CustomerAction" method="listCustomer" > <result name="success">/customer.jsp</result> </action> <!-- contato --> <action name="addContatoAction" class="com.springlesson09.service.ContatoSpringAction" method="saveOrUpdateContato" > <result name="success">/contato.jsp</result> </action> <action name="listContatoAction" class="com.springlesson09.service.ContatoSpringAction" method="listcontato" > <result name="success">/contato.jsp</result> </action> <action name="deleteContatoAction" class="com.springlesson09.service.ContatoSpringAction" method="deleteContato" > <result name="success">/contato.jsp</result> </action> <action name="editContatoAction" class="com.springlesson09.service.ContatoSpringAction" method="edit" > <result name="success">/contato.jsp</result> </action> <!-- Antes do Spring <package name="default" extends="hibernate-default"> <action name="saveOrUpdateContato" method="saveOrUpdate" class="com.springlesson09.service.ContatoAction"> <result name="success" type="redirect">listContato</result> </action> <action name="listContato" method="list" class="com.springlesson09.service.ContatoAction"> <result name="success">/register.jsp</result> </action> <action name="editContato" method="edit" class="com.springlesson09.service.ContatoAction"> <result name="success">/register.jsp</result> </action> <action name="deleteContato" method="delete" class="com.springlesson09.service.ContatoAction"> <result name="success" type="redirect">listContato</result> </action>--> </package> </struts>
10) Acertos no arquivo web.xml
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5"> <display-name>Struts2Example19</display-name> <context-param> <param-name>contextConfigLocation</param-name> <param-value>/WEB-INF/applicationContext.xml</param-value> </context-param> <filter> <filter-name>struts2</filter-name> <filter-class> org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter </filter-class> </filter> <filter-mapping> <filter-name>struts2</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <listener> <listener-class> org.springframework.web.context.ContextLoaderListener </listener-class> </listener> </web-app>
11) Arquivos jsp
I) index.jsp
index.jsp :
<%@page contentType="text/html" pageEncoding="UTF-8"%> <%@taglib uri="/struts-tags" prefix="s"%> <!DOCTYPE html> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> </head> <body> <h2>JNSBTut Lesson 09 Spring 3 + Full Hibernate Plugin's + Struts 2</h2> <img src="images/splash_mcezzare_JSNBTut09.png" /><br> <ul> <li><s:a href="/SpringLesson09-v2/listCustomerAction.action">Customer</s:a></li> <li><s:a href="/SpringLesson09-v2/listContatoAction.action">Contato</s:a></li> </ul> </body> </html>II)contato.jsp (por enquanto p/ cadastrar e atualizar, no update não carrega a lista)
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <%@taglib uri="/struts-tags" prefix="s"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>Novo Contato</title> <s:head /> <style type="text/css"> @import url(style.css); </style> </head> <body> <s:form action="addContatoAction"> <s:push value="contato"> <s:hidden name="id" /> <s:textfield name="nome" label="Nome" /> <s:textfield name="telefone" label="Fone" /> <s:textfield name="email" label="Email" /> <s:submit /> </s:push> </s:form> <s:if test="contatoList.size() > 0"> <div class="content"> <table class="contatoTable" cellpadding="5px"> <tr class="even"> <th>Nome</th> <th>Fone</th> <th>Email</th> <th> </th> <th> </th> </tr> <s:iterator value="contatoList" status="contatoStatus"> <tr class="<s:if test="#contatoStatus.odd == true ">odd</s:if><s:else>even</s:else>"> <td><s:property value="nome" /></td> <td><s:property value="telefone" /></td> <td><s:property value="email" /></td> <td><s:url id="editURL" action="editContato"> <s:param name="id" value="%{id}"></s:param> </s:url> <s:a href="%{editURL}">Edit</s:a></td> <td><s:url id="deleteURL" action="deleteContato"> <s:param name="id" value="%{id}"></s:param> </s:url> <s:a href="%{deleteURL}">Delete</s:a></td> </tr> </s:iterator> </table> </div> </s:if> </body> </html>
IV) customer (está no zip do projeto)
12) Teste
teste os dois: o CRUD
![]() |
Figura 45 - Teste das implementações |
o banco agora está assim :
![]() |
Figura 46 - Tabelas do banco |
CREATE TABLE IF NOT EXISTS `springlessons`.`customer` ( `CUSTOMER_ID` BIGINT(20) UNSIGNED NOT NULL AUTO_INCREMENT , `NAME` VARCHAR(45) NOT NULL , `ADDRESS` VARCHAR(255) NOT NULL , `CREATED_DATE` DATETIME NOT NULL , PRIMARY KEY (`CUSTOMER_ID`) ) ENGINE = InnoDB AUTO_INCREMENT = 5 DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci
CREATE TABLE IF NOT EXISTS `springlessons`.`contato` ( `id` INT(11) NOT NULL AUTO_INCREMENT , `nome` VARCHAR(45) NULL DEFAULT NULL , `telefone` VARCHAR(45) NULL DEFAULT NULL , `email` VARCHAR(45) NULL DEFAULT NULL , PRIMARY KEY (`id`) ) ENGINE = InnoDB AUTO_INCREMENT = 96 DEFAULT CHARACTER SET = utf8 COLLATE = utf8_general_ci
![]() |
Figura 47 - Projeto Organizado após as alterações - Classes e JSPs |
e como ficaram as Libs:
![]() |
Figura 48 - Projeto Organizado após as alterações - Libs |
AO compilar o programa, observe tudo o q ele está carregando no Output :
I) ao rodar no TomCat
IOct 3, 2012 2:51:15 AM org.apache.catalina.core.AprLifecycleListener init INFO: Loaded APR based Apache Tomcat Native library 1.1.24 using APR version 1.4.6. Oct 3, 2012 2:51:15 AM org.apache.catalina.core.AprLifecycleListener init INFO: APR capabilities: IPv6 [true], sendfile [true], accept filters [false], random [true]. Oct 3, 2012 2:51:16 AM org.apache.catalina.core.AprLifecycleListener initializeSSL INFO: OpenSSL successfully initialized (OpenSSL 0.9.8l 5 Nov 2009) Oct 3, 2012 2:51:17 AM org.apache.coyote.AbstractProtocol init INFO: Initializing ProtocolHandler ["http-apr-8080"] Oct 3, 2012 2:51:17 AM org.apache.coyote.AbstractProtocol init INFO: Initializing ProtocolHandler ["ajp-apr-8009"] Oct 3, 2012 2:51:17 AM org.apache.catalina.startup.Catalina load INFO: Initialization processed in 4328 ms Oct 3, 2012 2:51:17 AM org.apache.catalina.core.StandardService startInternal INFO: Starting service Catalina Oct 3, 2012 2:51:17 AM org.apache.catalina.core.StandardEngine startInternal INFO: Starting Servlet Engine: Apache Tomcat/7.0.30 Oct 3, 2012 2:51:17 AM org.apache.catalina.startup.HostConfig deployDescriptor INFO: Deploying configuration descriptor /Users/surfer/_java/Servers/apache-tomcat-7.0.30/conf/Catalina/localhost/SpringLesson09-v3.xml log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader). log4j:WARN Please initialize the log4j system properly. 02:51:45 - INFO: Full Hibernate Plugin Validation using Hibernate Validator 3.x Oct 3, 2012 2:51:46 AM org.apache.catalina.startup.HostConfig deployDirectory INFO: Deploying web application directory /Users/surfer/_java/Servers/apache-tomcat-7.0.30/webapps/docs Oct 3, 2012 2:51:46 AM org.apache.catalina.startup.HostConfig deployDirectory INFO: Deploying web application directory /Users/surfer/_java/Servers/apache-tomcat-7.0.30/webapps/examples Oct 3, 2012 2:51:48 AM org.apache.catalina.startup.HostConfig deployDirectory INFO: Deploying web application directory /Users/surfer/_java/Servers/apache-tomcat-7.0.30/webapps/host-manager Oct 3, 2012 2:51:48 AM org.apache.catalina.startup.HostConfig deployDirectory INFO: Deploying web application directory /Users/surfer/_java/Servers/apache-tomcat-7.0.30/webapps/manager Oct 3, 2012 2:51:49 AM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["http-apr-8080"] Oct 3, 2012 2:51:49 AM org.apache.coyote.AbstractProtocol start INFO: Starting ProtocolHandler ["ajp-apr-8009"] Oct 3, 2012 2:51:49 AM org.apache.catalina.startup.Catalina start INFO: Server startup in 32021 ms Oct 3, 2012 2:51:55 AM org.apache.jasper.compiler.TldLocationsCache tldScanJar INFO: At least one JAR was scanned for TLDs yet contained no TLDs. Enable debug logging for this logger for a complete list of JARs that were scanned but no TLDs were found in them. Skipping unneeded JARs during scanning can improve startup time and JSP compilation time. 02:53:26 - DEBUG: Preparing Injection Hibernate Session and Transaction process: /listContatoAction - Method: com.springlesson09.service.ContatoSpringAction.listcontato() 02:53:26 - DEBUG: Full Hibernate Plugin's Session Factory: destroy factory required... 02:53:26 - DEBUG: Full Hibernate Plugin's Session Factory: C3P0 not found 02:53:26 - DEBUG: Full Hibernate Plugin's Session Factory: All SessionFactories Destroyed sucessful 02:53:26 - DEBUG: Hibernate Session Required (from current Thread) - SessionFactory required: (default) 02:53:26 - DEBUG: No Hibernate Session in current thread. New Hibernate Session will be created and returned (SessionFactory "(default)") 02:53:26 - DEBUG: New Hibernate Session required - SessionFactory required: (default) 02:53:26 - DEBUG: Full Hibernate Plugin's Session Factory build started... 02:53:26 - DEBUG: Full Hibernate Plugin's Session Factory using Hibernate Annotation Configuration 02:53:26 - DEBUG: Full Hibernate Plugin's Session Factory configuration file "/hibernate.cfg.xml" configured 02:53:27 - DEBUG: SessionFactory "" configured from "/hibernate.cfg.xml" file 02:53:27 - DEBUG: "" configured as the *default* SessionFactory of the Full Hibernate Plugin's Session Factory 02:53:27 - DEBUG: Full Hibernate Plugin's Session Factory built successful 02:53:27 - DEBUG: New Hibernate Session created and returned (SessionFactory "") 02:53:27 - DEBUG: Hibernate Session from Full Hibernate Plugin's Hibernate Session Factory 02:53:27 - DEBUG: Hibernate Session injected (by annotation) into Action. Field "session". Class "com.springlesson09.dao.ContatoDAOImpl" 02:53:27 - DEBUG: Hibernate Transaction injected (by annotation) into Action. Field "transaction". Class "com.springlesson09.dao.ContatoDAOImpl" 02:53:27 - WARN: Full Hibernate Plugin Validation Allowed only in Actions that 'ISA' ActionSupport Hibernate: select contato0_.id as id5_, contato0_.nome as nome5_, contato0_.telefone as telefone5_, contato0_.email as email5_ from springlessons.contato contato0_ 02:53:36 - DEBUG: Hibernate Transation org.hibernate.transaction.JDBCTransaction@3cd16610 rolledback by Full Hibernate Plugin 02:53:36 - DEBUG: Hibernate Session closed 02:53:36 - DEBUG: Hibernate Session closed by Full Hibernate Plugin's Hibernate Session Factory 02:53:36 - DEBUG: Hibernate Transaction Committed 02:53:36 - DEBUG: Injection Hibernate Session and Transaction process for /listContatoAction - Method: com.springlesson09.service.ContatoSpringAction.listcontato() finished 02:54:12 - DEBUG: Preparing Injection Hibernate Session and Transaction process: /editContatoAction - Method: com.springlesson09.service.ContatoSpringAction.edit() 02:54:12 - DEBUG: Hibernate Session Required (from current Thread) - SessionFactory required: (default) 02:54:12 - DEBUG: No Hibernate Session in current thread. New Hibernate Session will be created and returned (SessionFactory "(default)") 02:54:12 - DEBUG: New Hibernate Session required - SessionFactory required: (default) 02:54:12 - DEBUG: New Hibernate Session created and returned (SessionFactory "") 02:54:12 - DEBUG: Hibernate Session from Full Hibernate Plugin's Hibernate Session Factory 02:54:12 - DEBUG: Hibernate Session injected (by annotation) into Action. Field "session". Class "com.springlesson09.dao.ContatoDAOImpl" 02:54:12 - DEBUG: Hibernate Transaction injected (by annotation) into Action. Field "transaction". Class "com.springlesson09.dao.ContatoDAOImpl" 02:54:12 - WARN: Full Hibernate Plugin Validation Allowed only in Actions that 'ISA' ActionSupport Hibernate: select contato0_.id as id5_0_, contato0_.nome as nome5_0_, contato0_.telefone as telefone5_0_, contato0_.email as email5_0_ from springlessons.contato contato0_ where contato0_.id=? 02:54:13 - DEBUG: Hibernate Transation org.hibernate.transaction.JDBCTransaction@11ace672 rolledback by Full Hibernate Plugin 02:54:13 - DEBUG: Hibernate Session closed 02:54:13 - DEBUG: Hibernate Session closed by Full Hibernate Plugin's Hibernate Session Factory 02:54:13 - DEBUG: Hibernate Transaction Committed 02:54:13 - DEBUG: Injection Hibernate Session and Transaction process for /editContatoAction - Method: com.springlesson09.service.ContatoSpringAction.edit() finished 02:54:15 - DEBUG: Preparing Injection Hibernate Session and Transaction process: /addContatoAction - Method: com.springlesson09.service.ContatoSpringAction.saveOrUpdateContato() 02:54:15 - DEBUG: Hibernate Session Required (from current Thread) - SessionFactory required: (default) 02:54:15 - DEBUG: No Hibernate Session in current thread. New Hibernate Session will be created and returned (SessionFactory "(default)") 02:54:15 - DEBUG: New Hibernate Session required - SessionFactory required: (default) 02:54:15 - DEBUG: New Hibernate Session created and returned (SessionFactory "") 02:54:15 - DEBUG: Hibernate Session from Full Hibernate Plugin's Hibernate Session Factory 02:54:15 - DEBUG: Hibernate Session injected (by annotation) into Action. Field "session". Class "com.springlesson09.dao.ContatoDAOImpl" 02:54:15 - DEBUG: Hibernate Transaction injected (by annotation) into Action. Field "transaction". Class "com.springlesson09.dao.ContatoDAOImpl" 02:54:15 - WARN: Full Hibernate Plugin Validation Allowed only in Actions that 'ISA' ActionSupport Hibernate: insert into springlessons.contato (nome, telefone, email) values (?, ?, ?) Hibernate: select contato0_.id as id5_, contato0_.nome as nome5_, contato0_.telefone as telefone5_, contato0_.email as email5_ from springlessons.contato contato0_ 02:54:17 - DEBUG: Hibernate Transation org.hibernate.transaction.JDBCTransaction@17f74864 rolledback by Full Hibernate Plugin 02:54:17 - DEBUG: Hibernate Session closed 02:54:17 - DEBUG: Hibernate Session closed by Full Hibernate Plugin's Hibernate Session Factory 02:54:17 - DEBUG: Hibernate Transaction Committed 02:54:18 - DEBUG: Injection Hibernate Session and Transaction process for /addContatoAction - Method: com.springlesson09.service.ContatoSpringAction.saveOrUpdateContato() finished 02:54:21 - DEBUG: Preparing Injection Hibernate Session and Transaction process: /deleteContatoAction - Method: com.springlesson09.service.ContatoSpringAction.deleteContato() 02:54:21 - DEBUG: Hibernate Session Required (from current Thread) - SessionFactory required: (default) 02:54:21 - DEBUG: No Hibernate Session in current thread. New Hibernate Session will be created and returned (SessionFactory "(default)") 02:54:21 - DEBUG: New Hibernate Session required - SessionFactory required: (default) 02:54:21 - DEBUG: New Hibernate Session created and returned (SessionFactory "") 02:54:21 - DEBUG: Hibernate Session from Full Hibernate Plugin's Hibernate Session Factory 02:54:21 - DEBUG: Hibernate Session injected (by annotation) into Action. Field "session". Class "com.springlesson09.dao.ContatoDAOImpl" 02:54:21 - DEBUG: Hibernate Transaction injected (by annotation) into Action. Field "transaction". Class "com.springlesson09.dao.ContatoDAOImpl" 02:54:21 - WARN: Full Hibernate Plugin Validation Allowed only in Actions that 'ISA' ActionSupport Hibernate: select contato0_.id as id5_0_, contato0_.nome as nome5_0_, contato0_.telefone as telefone5_0_, contato0_.email as email5_0_ from springlessons.contato contato0_ where contato0_.id=? Hibernate: delete from springlessons.contato where id=? Hibernate: select contato0_.id as id5_, contato0_.nome as nome5_, contato0_.telefone as telefone5_, contato0_.email as email5_ from springlessons.contato contato0_ 02:54:21 - DEBUG: Hibernate Transation org.hibernate.transaction.JDBCTransaction@42886462 rolledback by Full Hibernate Plugin 02:54:21 - DEBUG: Hibernate Session closed 02:54:21 - DEBUG: Hibernate Session closed by Full Hibernate Plugin's Hibernate Session Factory 02:54:21 - DEBUG: Hibernate Transaction Committed 02:54:21 - DEBUG: Injection Hibernate Session and Transaction process for /deleteContatoAction - Method: com.springlesson09.service.ContatoSpringAction.deleteContato() finished 02:54:21 - DEBUG: Preparing Injection Hibernate Session and Transaction process: /listContatoAction - Method: com.springlesson09.service.ContatoSpringAction.listcontato() 02:54:21 - DEBUG: Hibernate Session Required (from current Thread) - SessionFactory required: (default) 02:54:21 - DEBUG: No Hibernate Session in current thread. New Hibernate Session will be created and returned (SessionFactory "(default)") 02:54:21 - DEBUG: New Hibernate Session required - SessionFactory required: (default) 02:54:21 - DEBUG: New Hibernate Session created and returned (SessionFactory "") 02:54:21 - DEBUG: Hibernate Session from Full Hibernate Plugin's Hibernate Session Factory 02:54:21 - DEBUG: Hibernate Session injected (by annotation) into Action. Field "session". Class "com.springlesson09.dao.ContatoDAOImpl" 02:54:22 - DEBUG: Hibernate Transaction injected (by annotation) into Action. Field "transaction". Class "com.springlesson09.dao.ContatoDAOImpl" 02:54:22 - WARN: Full Hibernate Plugin Validation Allowed only in Actions that 'ISA' ActionSupport Hibernate: select contato0_.id as id5_, contato0_.nome as nome5_, contato0_.telefone as telefone5_, contato0_.email as email5_ from springlessons.contato contato0_ 02:54:23 - DEBUG: Hibernate Transation org.hibernate.transaction.JDBCTransaction@1f4e8ac9 rolledback by Full Hibernate Plugin 02:54:23 - DEBUG: Hibernate Session closed 02:54:23 - DEBUG: Hibernate Session closed by Full Hibernate Plugin's Hibernate Session Factory 02:54:23 - DEBUG: Hibernate Transaction Committed 02:54:23 - DEBUG: Injection Hibernate Session and Transaction process for /listContatoAction - Method: com.springlesson09.service.ContatoSpringAction.listcontato() finished
II) ao rodar no GlassFish (não funcionou)
INFO: JMX005: JMXStartupService had Started JMXConnector on JMXService URL service:jmx:rmi://mmac.lpanic.intra:8686/jndi/rmi://mmac.lpanic.intra:8686/jmxrmi INFO: WEB0169: Created HTTP listener [http-listener-1] on host/port [0.0.0.0:8080] INFO: WEB0169: Created HTTP listener [http-listener-2] on host/port [0.0.0.0:8181] INFO: WEB0169: Created HTTP listener [admin-listener] on host/port [0.0.0.0:4848] INFO: WEB0171: Created virtual server [server] INFO: WEB0171: Created virtual server [__asadmin] INFO: WEB0172: Virtual server [server] loaded default web module [] INFO: defaultVirtualServer = server INFO: SEC1002: Security Manager is OFF. INFO: No default web.xml INFO: standardContext = StandardEngine[glassfish-web].StandardHost[server].StandardContext[/osgi] INFO: No default web.xml INFO: standardContext = StandardEngine[glassfish-web].StandardHost[__asadmin].StandardContext[/osgi] INFO: SEC1010: Entering Security Startup Service INFO: SEC1143: Loading policy provider com.sun.enterprise.security.provider.PolicyWrapper. INFO: SEC1115: Realm [admin-realm] of classtype [com.sun.enterprise.security.auth.realm.file.FileRealm] successfully created. INFO: SEC1115: Realm [file] of classtype [com.sun.enterprise.security.auth.realm.file.FileRealm] successfully created. INFO: SEC1115: Realm [certificate] of classtype [com.sun.enterprise.security.auth.realm.certificate.CertificateRealm] successfully created. INFO: SEC1011: Security Service(s) Started Successfully INFO: WELD-000900 1.1.8 (Final) INFO: PWC1412: WebModule[null] ServletContext.log():No Spring WebApplicationInitializer types detected on classpath INFO: PWC1412: WebModule[null] ServletContext.log():Initializing Spring root WebApplicationContext SEVERE: log4j:WARN No appenders could be found for logger (org.springframework.web.context.ContextLoader). SEVERE: log4j:WARN Please initialize the log4j system properly. INFO: Hibernate 3.5.0-Final INFO: hibernate.properties not found INFO: Bytecode provider name : javassist INFO: using JDK 1.4 java.sql.Timestamp handling INFO: Mapping class: com.springlesson09.model.Customer -> customer INFO: Mapping class: com.springlesson09.model.Contato -> contato INFO: Initializing connection provider: org.springframework.orm.hibernate3.LocalDataSourceConnectionProvider INFO: RDBMS: MySQL, version: 5.1.63-0ubuntu0.11.10.1 INFO: JDBC driver: MySQL-AB JDBC Driver, version: mysql-connector-java-5.1.22 ( Revision: ${bzr.revision-id} ) INFO: Using dialect: org.hibernate.dialect.MySQLDialect INFO: Transaction strategy: org.springframework.orm.hibernate3.SpringTransactionFactory INFO: No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended) INFO: Automatic flush during beforeCompletion(): disabled INFO: Automatic session close at end of transaction: disabled INFO: JDBC batch size: 15 INFO: JDBC batch updates for versioned data: disabled INFO: Scrollable result sets: enabled INFO: JDBC3 getGeneratedKeys(): enabled INFO: Connection release mode: auto INFO: Maximum outer join fetch depth: 2 INFO: Default batch fetch size: 1 INFO: Generate SQL with comments: disabled INFO: Order SQL updates by primary key: disabled INFO: Order SQL inserts for batching: disabled INFO: Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory INFO: Using ASTQueryTranslatorFactory INFO: Query language substitutions: {} INFO: JPA-QL strict compliance: disabled INFO: Second-level cache: enabled INFO: Query cache: disabled INFO: Cache region factory : org.hibernate.cache.impl.NoCachingRegionFactory INFO: Optimize cache for minimal puts: disabled INFO: Structured second-level cache entries: disabled INFO: Echoing all SQL to stdout INFO: Statistics: disabled INFO: Deleted entity synthetic identifier rollback: disabled INFO: Default entity-mode: pojo INFO: Named query checking : enabled INFO: Check Nullability in Core (should be disabled when Bean Validation is on): enabled INFO: building session factory INFO: Not binding factory to JNDI, no JNDI name configured INFO: 01:18:33 - INFO: Full Hibernate Plugin Validation using Hibernate Validator 3.x INFO: WEB0671: Loading application [SpringLesson09-v2] at [/SpringLesson09-v2] INFO: SpringLesson09-v2 was successfully deployed in 30,920 milliseconds. WARNING: PWC4011: Unable to set request character encoding to UTF-8 from context /SpringLesson09-v2, because request parameters have already been read, or ServletRequest.getReader() has already been called WARNING: PWC4011: Unable to set request character encoding to UTF-8 from context /SpringLesson09-v2, because request parameters have already been read, or ServletRequest.getReader() has already been called WARNING: PWC4011: Unable to set request character encoding to UTF-8 from context /SpringLesson09-v2, because request parameters have already been read, or ServletRequest.getReader() has already been called INFO: 01:19:46 - DEBUG: Preparing Injection Hibernate Session and Transaction process: /listContatoAction - Method: com.springlesson09.service.ContatoSpringAction.listcontato() INFO: 01:19:46 - DEBUG: Full Hibernate Plugin's Session Factory: destroy factory required... INFO: 01:19:46 - DEBUG: Full Hibernate Plugin's Session Factory: C3P0 not found INFO: 01:19:46 - DEBUG: Full Hibernate Plugin's Session Factory: All SessionFactories Destroyed sucessful INFO: 01:19:46 - DEBUG: Hibernate Session Required (from current Thread) - SessionFactory required: (default) INFO: 01:19:46 - DEBUG: No Hibernate Session in current thread. New Hibernate Session will be created and returned (SessionFactory "(default)") INFO: 01:19:46 - DEBUG: New Hibernate Session required - SessionFactory required: (default) INFO: 01:19:46 - DEBUG: Full Hibernate Plugin's Session Factory build started... INFO: Hibernate Annotations 3.5.0-Final INFO: Hibernate Commons Annotations 3.2.0.Final INFO: 01:19:47 - DEBUG: Full Hibernate Plugin's Session Factory using Hibernate Annotation Configuration INFO: configuring from resource: /hibernate.cfg.xml INFO: Configuration resource: /hibernate.cfg.xml INFO: Reading mappings from resource : com/springlesson09/model/Usuario.hbm.xml INFO: Reading mappings from resource : com/springlesson09/model/Contato.hbm.xml INFO: Reading mappings from resource : com/springlesson09/model/Customer.hbm.xml INFO: Configured SessionFactory: null INFO: 01:19:47 - DEBUG: Full Hibernate Plugin's Session Factory configuration file "/hibernate.cfg.xml" configured INFO: Unable to find org.hibernate.search.event.FullTextIndexEventListener on the classpath. Hibernate Search is not enabled. INFO: Mapping class: com.springlesson09.model.Usuario -> usuario INFO: Mapping class: com.springlesson09.model.Contato -> contato INFO: Mapping class: com.springlesson09.model.Customer -> customer INFO: Hibernate Validator 3.1.0.GA INFO: Using Hibernate built-in connection pool (not for production use!) INFO: Hibernate connection pool size: 20 INFO: autocommit mode: false INFO: using driver: com.mysql.jdbc.Driver at URL: jdbc:mysql://ns1:3306/springlessons?zeroDateTimeBehavior=convertToNull INFO: connection properties: {user=springlessons, password=****} WARNING: Could not obtain connection to query metadata java.sql.SQLException: No suitable driver found for jdbc:mysql://ns1:3306/springlessons?zeroDateTimeBehavior=convertToNull at java.sql.DriverManager.getConnection(DriverManager.java:602) at java.sql.DriverManager.getConnection(DriverManager.java:154) at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:133) at org.hibernate.cfg.SettingsFactory.buildSettings(SettingsFactory.java:114) at org.hibernate.cfg.Configuration.buildSettingsInternal(Configuration.java:2163) at org.hibernate.cfg.Configuration.buildSettings(Configuration.java:2159) at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1383) at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:954) at com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.createAndTestSessionFactory(HibernateSessionFactory.java:282) at com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:227) at com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getNewSession(HibernateSessionFactory.java:155) at com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getSession(HibernateSessionFactory.java:100) at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.getHibernateSessionFromFactory(SessionTransactionInjectorInterceptor.java:379) at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.injectHibernateCoreSessionByAnnotation(SessionTransactionInjectorInterceptor.java:454) at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.injectHibernateCoreSessionByAnnotation(SessionTransactionInjectorInterceptor.java:470) at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.intercept(SessionTransactionInjectorInterceptor.java:165) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:680) INFO: Using dialect: org.hibernate.dialect.MySQLDialect INFO: Disabling contextual LOB creation as connection was null INFO: Using default transaction strategy (direct JDBC transactions) INFO: No TransactionManagerLookup configured (in JTA environment, use of read-write or transactional second-level cache is not recommended) INFO: Automatic flush during beforeCompletion(): disabled INFO: Automatic session close at end of transaction: disabled INFO: Scrollable result sets: disabled INFO: JDBC3 getGeneratedKeys(): disabled INFO: Connection release mode: auto INFO: Maximum outer join fetch depth: 2 INFO: Default batch fetch size: 1 INFO: Generate SQL with comments: disabled INFO: Order SQL updates by primary key: disabled INFO: Order SQL inserts for batching: disabled INFO: Query translator: org.hibernate.hql.ast.ASTQueryTranslatorFactory INFO: Using ASTQueryTranslatorFactory INFO: Query language substitutions: {} INFO: JPA-QL strict compliance: disabled INFO: Second-level cache: enabled INFO: Query cache: disabled INFO: Cache region factory : org.hibernate.cache.impl.NoCachingRegionFactory INFO: Optimize cache for minimal puts: disabled INFO: Structured second-level cache entries: disabled INFO: Echoing all SQL to stdout INFO: Statistics: disabled INFO: Deleted entity synthetic identifier rollback: disabled INFO: Default entity-mode: pojo INFO: Named query checking : enabled INFO: Check Nullability in Core (should be disabled when Bean Validation is on): disabled INFO: building session factory INFO: Not binding factory to JNDI, no JNDI name configured WARNING: SQL Error: 0, SQLState: 08001 SEVERE: No suitable driver found for jdbc:mysql://ns1:3306/springlessons?zeroDateTimeBehavior=convertToNull SEVERE: Could not build Full Hibernate Plugin's Session Factory SEVERE: org.hibernate.exception.JDBCConnectionException: Cannot open connection at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:99) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52) at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449) at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) at org.hibernate.jdbc.BorrowedConnectionProxy.invoke(BorrowedConnectionProxy.java:74) at $Proxy146.getMetaData(Unknown Source) at com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.createAndTestSessionFactory(HibernateSessionFactory.java:285) at com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:227) at com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getNewSession(HibernateSessionFactory.java:155) at com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getSession(HibernateSessionFactory.java:100) at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.getHibernateSessionFromFactory(SessionTransactionInjectorInterceptor.java:379) at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.injectHibernateCoreSessionByAnnotation(SessionTransactionInjectorInterceptor.java:454) at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.injectHibernateCoreSessionByAnnotation(SessionTransactionInjectorInterceptor.java:470) at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.intercept(SessionTransactionInjectorInterceptor.java:165) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:680) Caused by: java.sql.SQLException: No suitable driver found for jdbc:mysql://ns1:3306/springlessons?zeroDateTimeBehavior=convertToNull at java.sql.DriverManager.getConnection(DriverManager.java:602) at java.sql.DriverManager.getConnection(DriverManager.java:154) at org.hibernate.connection.DriverManagerConnectionProvider.getConnec SEVERE: tion(DriverManagerConnectionProvider.java:133) at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) ... 76 more SEVERE: Error! Please, check your JDBC/JDNI Configurations and Database Server avaliability. at /listContatoAction - Method: com.springlesson09.service.ContatoSpringAction.listcontato() Could not open or inject a Hibernate Session in ValueStack: org.hibernate.exception.JDBCConnectionException: Cannot open connection SEVERE: com.googlecode.s2hibernate.lang.BuildSessionFactoryException: org.hibernate.exception.JDBCConnectionException: Cannot open connection at com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:246) at com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getNewSession(HibernateSessionFactory.java:155) at com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.getSession(HibernateSessionFactory.java:100) at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.getHibernateSessionFromFactory(SessionTransactionInjectorInterceptor.java:379) at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.injectHibernateCoreSessionByAnnotation(SessionTransactionInjectorInterceptor.java:454) at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.injectHibernateCoreSessionByAnnotation(SessionTransactionInjectorInterceptor.java:470) at com.googlecode.s2hibernate.struts2.plugin.interceptors.SessionTransactionInjectorInterceptor.intercept(SessionTransactionInjectorInterceptor.java:165) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:163) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:148) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:93) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:128) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.ProfilingActivationInterceptor.intercept(ProfilingActivationInterceptor.java:104) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:148) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138) at com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:128) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) at com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:236) at org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) at org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:468) at org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77) at org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:76) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:256) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:217) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:279) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:175) at org.apache.catalina.core.StandardPipeline.doInvoke(StandardPipeline.java:655) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:595) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:161) at org.apache.catalina.connector.CoyoteAdapter.doService(CoyoteAdapter.java:331) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:231) at com.sun.enterprise.v3.services.impl.ContainerMapper$AdapterCallable.call(ContainerMapper.java:317) at com.sun.enterprise.v3.services.impl.ContainerMapper.service(ContainerMapper.java:195) at com.sun.grizzly.http.ProcessorTask.invokeAdapter(ProcessorTask.java:860) at com.sun.grizzly.http.ProcessorTask.doProcess(ProcessorTask.java:757) at com.sun.grizzly.http.ProcessorTask.process(ProcessorTask.java:1056) at com.sun.grizzly.http.DefaultProtocolFilter.execute(DefaultProtocolFilter.java:229) at com.sun.grizzly.DefaultProtocolChain.executeProtocolFilter(DefaultProtocolChain.java:137) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:104) at com.sun.grizzly.DefaultProtocolChain.execute(DefaultProtocolChain.java:90) at com.sun.grizzly.http.HttpProtocolChain.execute(HttpProtocolChain.java:79) at com.sun.grizzly.ProtocolChainContextTask.doCall(ProtocolChainContextTask.java:54) at com.sun.grizzly.SelectionKeyContextTask.call(SelectionKeyContextTask.java:59) at com.sun.grizzly.ContextTask.run(ContextTask.java:71) at com.sun.grizzly.util.AbstractThreadPool$Worker.doWork(AbstractThreadPool.java:532) at com.sun.grizzly.util.AbstractThreadPool$Worker.run(AbstractThreadPool.java:513) at java.lang.Thread.run(Thread.java:680) Caused by: org.hibernate.exception.JDBCConnectionException: Cannot open connection at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:99) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66) at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:52) at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:449) at org.hibernate.jdbc.ConnectionManager.getConnection(ConnectionManager.java:167) at org.hibernate.jdbc.BorrowedConnectionProxy.invoke(BorrowedConnectionProxy.java:74) at $Proxy146.getMetaData(Unknown Source) at com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.createAndTestSessionFactory(HibernateSessionFactory.java:285) at com.googlecode.s2hibernate.struts2.plugin.util.HibernateSessionFactory.rebuildSessionFactory(HibernateSessionFactory.java:227) ... 71 more Caused by: java.sql.SQLException: No suitable SEVERE: driver found for jdbc:mysql://ns1:3306/springlessons?zeroDateTimeBehavior=convertToNull at java.sql.DriverManager.getConnection(DriverManager.java:602) at java.sql.DriverManager.getConnection(DriverManager.java:154) at org.hibernate.connection.DriverManagerConnectionProvider.getConnection(DriverManagerConnectionProvider.java:133) at org.hibernate.jdbc.ConnectionManager.openConnection(ConnectionManager.java:446) ... 76 more INFO: Domain Pinged: stable.glassfish.org WARNING: PWC4011: Unable to set request character encoding to UTF-8 from context /SpringLesson09-v2, because request parameters have already been read, or ServletRequest.getReader() has already been called
SpringLesson09-v2.3.zip
Resumo, o que vimos :
- Aprendemos a conectar no Mysql pelo NB e armazenar um driver
- Aprendemos a utilizar e configurar o Hibernate pelo NB
- Aprendemos a fazer a engenharia reversa das tabelas do banco para as configurações do Hibernate gerando os arquivos de para os mappings: Hibernate Mapping
na versão V1:
- Implementar o Struts 2.1.6
- Criamos uma interface contatoDAO
- Implementamos a interface com a classe ContatoDaoImpl
- Criamos uma interface de Serviço ContatoAction que extende com.opensymphony.xwork2.ActionSupport.ActionSupport implementando ModelDriven
- Definimos as actions e mappings no arquivo struts-config.xml e web.xml
- Removemos as libs repetidas adicionadas pelo NB
- Implementamos a interface com a classe ContatoServiceImpl
- Criamos as classes p/ atender os actions que são mapeados no arquivo struts.xml, que extendem a classe org.apache.struts.action.Action
- Definimos as actions e mappings no arquivo struts.xml
- Criamos uma view através de um arquivo index.jsp
na versão V2:
- Habilitamos o módulo APR no TomCat
- introduzimos o Full Hibernate Plugin's Session Factory
- introduzimos o conceito de BO (Business Objects)
- Criamos uma interface de Serviço ContatoSpringAction que extende com.opensymphony.xwork2.ActionSupport.ActionSupport
- Externalizamos as credenciais do banco em um arquivo.properties
- Implementamos os Beans no applicationContext.xml para o Spring poder utilizar seus recursos de Injeção de dependências
- Aprendemos a usar as anotações do HB Transactional e Session
- Criamos uma vier p/ mostrar os erros
- Integramos o Spring 3 com o Struts 2 e delegamos a responsabilidade dos beans p/ serem gerenciados pelo Spring
- Vimos nos logs a ordem em que as classes são instanciadas e como localizar erros
- Testamos os cadastro e vimos funcionando
Vamos implementar as funcionalidades do Sistema que fizemos com Swing na lição 7, mas melhorando nossa interface utilizando outros recursos como facelets,richFaces, etc..
Dúvidas, Contribuições, Sugestões? Poste..
Grato,
Até a próxima.
Grato,
Até a próxima.
Nenhum comentário:
Postar um comentário