Skip to content

10. Aplicação exemplo-06: rdvmedecins-pfm-spring

10.1. A implementação

Vamos agora portar a aplicação anterior para um ambiente Spring / Tomcat:

Vamos basear-nos em duas aplicações já desenvolvidas. Vamos utilizar:

  • as camadas [DAO] e [JPA] da versão 02 JSF / Spring,
  • a camada [web] / Primefaces mobile da versão 05 PFM / EJB,
  • os ficheiros de configuração do Spring da versão 02

Estamos aqui a repetir um trabalho semelhante ao que foi realizado para portar a aplicação JSF2 / EJB / Glassfish para um ambiente JSF2 / Spring Tomcat. Por isso, daremos menos explicações. Se necessário, o leitor pode consultar essa migração.

Colocamos todos os projetos necessários para a portabilidade numa nova pasta [rdvmedecins-pfm-spring] [1]:

  • [mv-rdvmedecins-spring-dao-jpa]: as camadas [DAO] e [JPA] da versão 02 JSF / Spring,
  • [mv-rdvmedecins-spring-metier]: a camada [métier] da versão 02 JSF / Spring,
  • [mv-rdvmedecins-pfmobile]: a camada [web] da versão 05 Primefaces mobile / EJB,
  • em [2], carregamo-las no NetBeans,
  • em [3], as dependências do projeto web já não estão corretas:
    • as dependências nas camadas [DAO], [JPA] e [métier] têm de ser alteradas para passarem a referir-se aos projetos Spring;
    • o servidor Glassfish fornecia as bibliotecas de JSF. Já não é esse o caso com o servidor Tomcat. Por isso, é necessário adicioná-las às dependências.

O projeto [web] evolui da seguinte forma:

O ficheiro [pom.xml] da camada [web] tem agora as seguintes dependências:


<dependencies>
    <dependency>
      <groupId>org.primefaces</groupId>
      <artifactId>primefaces</artifactId>
      <version>3.2</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>org.primefaces</groupId>
      <artifactId>mobile</artifactId>
      <version>0.9.1</version>
      <type>jar</type>
    </dependency>
    <dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-api</artifactId>
      <version>2.1.8</version>
    </dependency>
    <dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-impl</artifactId>
      <version>2.1.8</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>mv-rdvmedecins-spring-dao-jpa</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>mv-rdvmedecins-spring-metier</artifactId>
      <version>${project.version}</version>
    </dependency>
  </dependencies>

Surgem erros. Estes devem-se às referências EJB da camada [web]. Analisemos primeiro o bean [Application]:

Eliminamos todas as linhas com erros devido a pacotes em falta, renomeamos a interface [IMetierLocal] para [IMetier] (este é o seu nome na camada [métier] do Spring) e utilizamos o Spring para a instanciar:


package beans;

import java.util.ArrayList;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import rdvmedecins.metier.service.IMetier;

public class Application {

  // camada de negócios
  private IMetier metier;
  // erros
  private List<Erreur> erreurs = new ArrayList<Erreur>();
  private Boolean erreur = false;

  public Application() {
    try {
      // instanciação da camada [métier]
      ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config-metier-dao.xml");
      metier = (IMetier) ctx.getBean("metier");
    } catch (Throwable th) {
      // regista-se o erro
      erreur = true;
      erreurs.add(new Erreur(th.getClass().getName(), th.getMessage()));
      while (th.getCause() != null) {
        th = th.getCause();
        erreurs.add(new Erreur(th.getClass().getName(), th.getMessage()));
      }
      return;
    }
  }

  // getters
  public Boolean getErreur() {
    return erreur;
  }

  public List<Erreur> getErreurs() {
    return erreurs;
  }

  public IMetier getMetier() {
    return metier;
  }
}
  • linhas 20-21: instanciação da camada [métier] a partir do ficheiro de configuração do Spring. Este ficheiro é o mesmo utilizado pelas camadas [métier] e [1]. Copiamo-lo para o projeto web [2]:
  • linhas 22-31: tratamos uma eventual exceção e guardamos a sua pilha no campo da linha 14.

Feito isto, o bean [Application] já não apresenta erros. Vejamos agora os beans [Form], [1] e [2]:

3
4

Eliminamos todas as linhas com erros (importações e anotações) devido a pacotes em falta e renomeamos a interface [IMetier] para [ImetierLocal]. Isto é suficiente para eliminar todos os erros [3].

Além disso, é necessário adicionar ao código do bean [Form] o getter e o setter do campo


  // bean Application
private Application application;

Algumas das anotações removidas nos beans [Application] e [Form] declaravam as classes como beans com um determinado âmbito. Agora, esta configuração é feita no seguinte ficheiro [faces-config.xml] [4]:


<?xml version='1.0' encoding='UTF-8'?>

<!-- =========== FULL CONFIGURATION FILE ================================== -->

<faces-config version="2.0"
              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/web-facesconfig_2_0.xsd">

  <application>
    <!-- o ficheiro de mensagens -->
    <resource-bundle>
      <base-name>
        messages
      </base-name>
      <var>msg</var>
    </resource-bundle>
    <message-bundle>messages</message-bundle>
    <default-render-kit-id>PRIMEFACES_MOBILE</default-render-kit-id>
  </application>
    <!-- o bean applicationBean -->
  <managed-bean>
    <managed-bean-name>applicationBean</managed-bean-name>
    <managed-bean-class>beans.Application</managed-bean-class>
    <managed-bean-scope>application</managed-bean-scope>
  </managed-bean>
    <!-- o bean do formulário -->
  <managed-bean>
    <managed-bean-name>form</managed-bean-name>
    <managed-bean-class>beans.Form</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
      <property-name>application</property-name>
      <value>#{applicationBean}</value>
    </managed-property>
  </managed-bean>
</faces-config>

A migração está concluída. Podemos tentar executar a aplicação web.

Deixamos que o leitor teste esta nova aplicação. Podemos melhorá-la ligeiramente para lidar com o caso em que a inicialização do bean [Application] falhar. Sabemos que, nesse caso, os seguintes campos foram inicializados:


  // erros
  private List<Erreur> erreurs = new ArrayList<Erreur>();
private Boolean erreur = false;

Este caso pode ser previsto no método init do bean [Form]:


@PostConstruct
  private void init() {

    // A inicialização decorreu corretamente?
    if (application.getErreur()) {
      // recuperar a lista de erros
      erreurs = application.getErreurs();
      // a visualização dos erros é apresentada
      setForms(false, false, true);
    }

    // os médicos e os clientes são armazenados em cache
    ...
  }
  • linha 5: se o bean [Application] não tiver sido inicializado corretamente,
  • linha 7: recuperamos a lista de erros,
  • linha 9: e exibe-se a página de erro.

Assim, se pararmos o SGBD e o MySQL e reiniciarmos a aplicação, recebemos agora a seguinte página:

Image

10.2. Conclusion

A migração da aplicação Primefaces mobile/EJB/Glassfish para um ambiente Primefaces mobile/Spring/Tomcat revelou-se simples. O problema de fuga de memória assinalado no estudo da aplicação JSF / Spring / Tomcat (parágrafo 4.3.5) persiste. Resolver-se-á da mesma forma.

10.3. Testes com o Eclipse

Importamos os projetos Maven para o Eclipse [1]:

Executamos o projeto web [2].

Selecionamos o servidor Tomcat [3]. A página inicial da aplicação é então apresentada no navegador interno do Eclipse [4].

10.4. Testes em dispositivos móveis

Para testar a aplicação num telemóvel, deve-se proceder conforme indicado no parágrafo 8.5.6. Aqui estão algumas fotografias da aplicação: