quinta-feira, 31 de janeiro de 2008

EL não funciona na JSP

Certa vez tive problemas para fazer as expressões de linguagem funcionarem no JSP. Colocava Nome: ${nome}, por exemplo e aparecia este mesmo código.
Para resolver este problema é necessário adicionar:

<%@page isELIgnored="false"%>

no cabeçalho do jsp

quarta-feira, 30 de janeiro de 2008

Introdução à Jpa (Java Persistence API)

Neste artigo criaremos um pequeno exemplo utilizando a jpa.

A JPA (Java Persistence API) faz o mapeamento objeto-relacional, ou seja, traduz o mundo objetos do java para o mundo relacional dos bancos de dados.
Trata-se apenas de uma especificação, ou seja, a implementação ficará por conta de terceiros como:

  • Hibernate
  • TopLink
  • Kodo
  • etc

    Em nosso exemplo utilizaremos o Hibernate. Para obtê-lo é necessário fazer o download de algumas bibliotecas do site http://hibernate.org:
  • Hibernate Core
  • Hibernate EntityManager

    Ao descompactar estes arquivos observa-se uma grande quantidade de .jar's. Após fazer alguns testes notei que os imprescindíveis são:
    antlr-2.7.6.jar
    asm.jar
    cglib-2.1.3.jar
    commons-collections-2.1.1.jar
    commons-logging-1.0.4.jar
    dom4j-1.6.1.jar
    hibernate-annotations.jar
    hibernate-commons-annotations.jar
    hibernate-entitymanager.jar
    hibernate3.jar
    javassist.jar
    jboss-archive-browsing.jar
    jta.jar
    persistence.jar
    
    Inicialmente criaremos a classe contato. Observe no código abaixo a existência de algumas anotações.
    @Entity
    
    Define uma entidade. Usamos esta anotação para dizer que a classe anotada é uma entidade, portanto, será persistida no banco de dados.
    @Id
    
    Define o campo que conterá o identificador da entidade. Será a chave primaria da tabela.
    @GeneratedValue(strategy=SEQUENCE, generator = "geradorPessoa")
    @SequenceGenerator(name="geradorPessoa", sequenceName = "gerador_pessoa")
    
    Configurações para utilizar um Sequence do banco de dados.
    Classe Contato
    package org.jchico.jpa;

    import static javax.persistence.GenerationType.SEQUENCE;

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

    @Entity
    public class Contato {

     
    @Id
       @GeneratedValue
    (strategy=SEQUENCE, generator = "geradorPessoa")
      
    @SequenceGenerator(name="geradorPessoa", sequenceName = "gerador_pessoa")
      
    private int codigo;
     
    private String nome;
     
    private String telefone;
     
    private String endereco;

     
    public int getCodigo() {
       
    return codigo;
     
    }
     
    public void setCodigo(int codigo) {
       
    this.codigo = codigo;
     
    }
     
    public String getNome() {
       
    return nome;
     
    }
     
    public void setNome(String nome) {
       
    this.nome = nome;
     
    }
     
    public String getTelefone() {
       
    return telefone;
     
    }
     
    public void setTelefone(String telefone) {
       
    this.telefone = telefone;
     
    }
     
    public String getEndereco() {
       
    return endereco;
     
    }
     
    public void setEndereco(String endereco) {
       
    this.endereco = endereco;
     
    }
    }



    Agora criaremos a classe TesteContatoJpa. Esta classe será responsável por persistir os contatos. Note a necessidade da existência do EntityManager. Ele é o gerenciador de entidades. Este gerenciador é capaz de persistir, listar, remover, alterar, etc as entidades.
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("exemplo");
    EntityManager em = emf.createEntityManager();
    EntityTransaction tx = em.getTransaction();
    
    Para fazer consultas é necessário utilizar a JPAQL:
    Query query = em.createQuery("select e from Contato e");
    


    Classe TesteContatoJpa
    package org.jchico.jpa;

    import java.util.List;
    import java.util.Scanner;

    import javax.persistence.EntityManager;
    import javax.persistence.EntityManagerFactory;
    import javax.persistence.EntityTransaction;
    import javax.persistence.Persistence;
    import javax.persistence.Query;

    public class TesteContatoJpa {

      
    public static void main(String[] args) {
         
    EntityManagerFactory emf = Persistence.createEntityManagerFactory("exemplo");
          EntityManager em = emf.createEntityManager
    ();
          EntityTransaction tx = em.getTransaction
    ();
         
         
    //cria um contato e ajusta seus valores
         
    Contato contato = new Contato();
          Scanner scan =
    new Scanner(System.in);
          System.out.print
    ("\nDigite o nome:");
          contato.setNome
    (scan.nextLine());
          System.out.print
    ("\nDigite o endereço:");
          contato.setEndereco
    (scan.nextLine());
          System.out.print
    ("\nDigite o telefone:");
          contato.setTelefone
    (scan.nextLine());
         
         
    //adiciona um contato no banco
         
    tx.begin();
          em.persist
    (contato);
          tx.commit
    ();
         
         
    //listar os contatos
         
    Query query = em.createQuery("select e from Contato e");
          List<Contato> listaContatos = query.getResultList
    ();
         
    for(Contato c : listaContatos){
            
    System.out.printf("%20s %20s %20s", c.getNome(), c.getEndereco(), c.getTelefone());
         
    }
       }
    }



    Agora veja o persistence.xml abaixo. Este arquivo deverá ficar no diretório META-INF da sua aplicação. Neste arquivo realizamos as configurações necessárias para a JPA, como o driver do banco, a url, usuario e senha.
    <?xml version="1.0" encoding="UTF-8"?>
    <persistence version="1.0"
     xmlns="http://java.sun.com/xml/ns/persistence"
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd">
     <persistence-unit name="exemplo">
      <class>org.jchico.jpa.Contato</class>
      <properties>
                <property name="hibernate.hbm2ddl.auto" value="update"/>
                <property name="hibernate.dialect" value="org.hibernate.dialect.HSQLDialect"/>
                <property name="hibernate.connection.driver_class" value="org.hsqldb.jdbcDriver"/>
                <property name="hibernate.connection.username" value="sa"/>
                <property name="hibernate.connection.password" value=""/>
                <property name="hibernate.connection.url" value="jdbc:hsqldb:hsql://localhost/exemplo"/>
                <property name="hibernate.show_sql" value="true"/>
            </properties>
        </persistence-unit>
    </persistence>
    
    
    Espero que você tenha gostado desta informação.

  • segunda-feira, 28 de janeiro de 2008

    Debug Remoto no eclipse

    Algumas vezes é necessário resolver problemas que ocorrem somente quando a aplicação está sendo executada em um servidor. Nestes casos pode ser feito um debug remoto que consistem em iniciar o container (no caso o Tomcat) no modo debug e conectar uma IDE (no caso o Eclipse) para realizar o debug.

    Preparei um video que demonstra como fazer debug remoto no eclipse.

    clique aqui para ver o video
    e aprenda a fazer debug remoto com eclipse

    retirar a navbar do blogger

    Para retirar a navbar do blobber adicione a seguinte tag:

    #navbar iframe{heigth: 0px; visibility: hidden; display: none;}

    Antes da tag body

    Alguns Lembretes Importantes para trabalhar com JSF

    Lembrete 1:

    Criar um novo sistema web, em Project Facets marcar a opção JavaServer Faces


    Lembrete 2:

    Utilizar as seguintes taglibs


    <%@ taglib uri="http://java.sun.com/jsf/core" prefix="f" %>

    <%@ taglib uri="http://java.sun.com/jsf/html" prefix="h" %>


    Lembretes para adicionar suporte ao MyFaces


    Lembrete 1:

    Acrescentar o seguinte filtro no arquivo WEB-INF/web.xml


    <filter>

    <filter-name>MyFacesExtensionsFilter</filter-name>

    <filter-class>org.apache.myfaces.webapp.filter.ExtensionsFilter</filter-class>

    <init-param>

    <param-name>maxFileSize</param-name>

    <param-value>20m</param-value>

    </init-param>

    </filter>



    <filter-mapping>

    <filter-name>MyFacesExtensionsFilter</filter-name>

    <servlet-name>Faces Servlet</servlet-name>

    </filter-mapping>



    <filter-mapping>

    <filter-name>MyFacesExtensionsFilter</filter-name>

    <url-pattern>/faces/myFacesExtensionResource/*</url-pattern>

    </filter-mapping>


    Lembrete 2:

    Acrescentar o seguinte listener no arquivo WEB-INF/web.xml

    <listener>

    <listener-class>org.apache.myfaces.webapp.StartupServletContextListener</listener-class>

    </listener>




    Lembretes para adicionar suporte ao RichFaces


    Lembrete 1:

    Acrescentar o seguinte filtro no arquivo WEB-INF/web.xml


    <filter>

    <display-name>RichFaces Filter</display-name>

    <filter-name>richfaces</filter-name>

    <filter-class>org.ajax4jsf.Filter</filter-class>

    </filter>


    <filter-mapping>

    <filter-name>richfaces</filter-name>

    <servlet-name>Faces Servlet</servlet-name>

    <dispatcher>REQUEST</dispatcher>

    <dispatcher>FORWARD</dispatcher>

    <dispatcher>INCLUDE</dispatcher>

    </filter-mapping>



    Lembretes para trabalhar com facelets


    Lembrete 1:

    Acrescentar os seguintes parametros no WEB-INF/web.xml


    <context-param>

    <param-name>javax.faces.DEFAULT_SUFFIX</param-name>

    <param-value>.jspx</param-value>

    </context-param>

    <context-param>

    <param-name>javax.faces.STATE_SAVING_METHOD</param-name>

    <param-value>client</param-value>

    </context-param>


    <!-- Special Debug Output for Development -->

    <context-param>

    <param-name>facelets.DEVELOPMENT</param-name>

    <param-value>true</param-value>

    </context-param>


    <!-- Optional JSF-RI Parameters to Help Debug -->

    <context-param>

    <param-name>com.sun.faces.validateXml</param-name>

    <param-value>true</param-value>

    </context-param>


    <context-param>

    <param-name>com.sun.faces.verifyObjects</param-name>

    <param-value>true</param-value>

    </context-param>


    Lembrete 2:

    O arquivo de template:


    <?xml version="1.0" encoding="iso-8859-1"?>

    <html xmlns="http://www.w3.org/1999/xhtml"

    xmlns:ui="http://java.sun.com/jsf/facelets"

    xmlns:h="http://java.sun.com/jsf/html"

    xmlns:t="http://myfaces.apache.org/tomahawk">

    <head>

    </head>


    <body leftmargin="0" bottommargin="0" topmargin="0" rightmargin="0">

    <ui:insert name="corpo"/>


    <ui:include src="Rodape.jspx"/>

    </body>

    </html>



    Lembrete 3:

    As páginas:



    <?xml version="1.0" encoding="iso-8859-1"?>

    <jsp:root xmlns:jsp="http://java.sun.com/JSP/Page"

    xmlns:h="http://java.sun.com/jsf/html"

    xmlns:f="http://java.sun.com/jsf/core"

    xmlns:ui="http://java.sun.com/jsf/facelets"

    xmlns:t="http://myfaces.apache.org/tomahawk">

    <ui:composition template="template.jspx">

    <ui:define name="corpo">

    <h:form id="formulario">


    </h:form>

    </ui:define>

    </ui:composition>

    </jsp:root>



    Lembrete 4:

    Para configurar facelets com RichFaces é necessário adicionar:


    <context-param>

    <param-name>org.ajax4jsf.VIEW_HANDLERS</param-name>

    <param-value>com.sun.facelets.FaceletViewHandler</param-value>

    </context-param>


    quinta-feira, 3 de janeiro de 2008

    Como configurar um servidor SubVersion

    O Tutorial abaixo apresenta como configurar um Servidor SubVersion em um máquina com Linux Debian
    Instalação

    apt-get install subversion
    apt-get install subversion-tools
    apt-get install web-svn
    
    Iniciar o serviço
    para ligar o servidor: svnserver -d

    Criar repositório
    para criar um repositorio: svnadmin create /diretorio do repositorio

    Configurar o repositório
    crie o arquivo conf/passwd (no diretorio do repositório)

    insira o seguinte:

    [users]
    carlos=senha do carlos
    chico=senha do chico
    

    No arquivo svnserver.conf descomente as seguintes linhas
    [general]
    anon-access = read
    auth-access = write
    password-db = passwd
    realm = REPOSITORIO JavaCerrado.org