sábado, 2 de novembro de 2013

Primeiro Exemplo de Aplicação Spring Web MVC com o NetBeans IDE - 3

No artigo anterior fizemos o nosso primeiro Controller que devolveu uma View e os dados do Model que queriamos usar na view.

Artigos anteriores:
     - Primeiro Exemplo de Aplicação Spring Web MVC com o NetBeans IDE - 1

     - Primeiro Exemplo de Aplicação Spring Web MVC com o NetBeans IDE - 2


Neste artigo vamos usar o Hibernate para a camada Model, o que nos permite obter dados de uma base de dados e os passar a uma view para os listar no browser.

A camada model de este projeto Spring Web MVC é exatamente a mesma que foi usada no projeto Struts. Ver artigos: 


E, o nosso objetivo aqui, neste artigo, é fazer em Spring Web MVC, o que fizémos no artigo 3 referido acima, em Struts.

Assim, para este exemplo, que é construido sobre o do artigo anterior, queremos criar a classe Book.java e o respetivo ficheiro de mapeamento do Hibernate hibernateBook.hbm.xml.




Book.java:

package exemploModel;

import java.sql.Date;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;

public class Book {
    private int ID;
    private String isbn;
    private String title;
    private java.sql.Date dateEdition;
    private String edition;
    private String editor;

    public int getID() {
        return ID;
    }

    public void setID(int ID) {
        this.ID = ID;
    }
     
... restantes getters e setters ...
   
    public static List<Book> getAllBooks(){
        Session session = HibernateUtil.getSessionFactory().openSession();
        
        List<Book> books = new ArrayList<Book>(session.createQuery("from Book").list());
        
        session.close();
        
        return books;
    }

}


hibernateBook.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">
<hibernate-mapping>
  <class name="exemploModel.Book" table="BOOK">
      <id name="ID" column="ID" type="int">
          <generator class="sequence">
              <param name="sequence">BOOK_SEQ</param>
          </generator>
      </id>
      <property name="ID" column="ID" type="int" insert="false" update="false" />
      <property name="isbn" column="isbn" type="string"/>
      <property name="title" column="title" type="string"/>
      <property name="dateEdition" column="dateEdition" type="date"/>
      <property name="edition" column="edition" type="string"/>
      <property name="editor" column="editor" type="string"/>
  </class>    

</hibernate-mapping>


O ficheiro de configuração do Hibernate (hibernate.cfg.xml) configura, neste caso, a ligação a uma base de dados Oracle XE, e faz a referência aos ficheiros de mapeamento:

<?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.Oracle10gDialect
        </property>
        <property name="hibernate.connection.driver_class">
             oracle.jdbc.OracleDriver
        </property>
        <property name="hibernate.connection.url">
             jdbc:oracle:thin:@localhost:1521:XE
        </property>
        <property name="hibernate.connection.username">miguel</property>
        <property name="hibernate.connection.password">miguel</property>
        <property name="hibernate.connection.release_mode">auto</property>
        <property name="hibernate.connection.pool_size">1</property>
    
        <property name="hibernate.cache.provider_class">
             org.hibernate.cache.HashtableCacheProvider
        </property>
        <property name="hibernate.default_schema">miguel</property>
        <property name="hibernate.show_sql">true</property>
        <property name="hibernate.jdbc.use_scrollable_resultset">true</property>
        
        <mapping resource="hibernateBook.hbm.xml" />
        
   </session-factory>

</hibernate-configuration>


A linha
        <mapping resource="hibernateBook.hbm.xml" />
faz a referência ao ficheiro de mapeamento entre a classe Book do Model e a respetiva tabela na base de dados.


Falta, depois, acrescentar algumas linhas ao ficheiro de configuração do serviço de dispatcher (dispacher-servlet.xml) que já tínhamos no exemplo do artigo anterior.
Nomeadamente, é necessário acrescentar um mapeamento explícito para listBooks.htm, que vamos usar como chave para a funcionalidade de listagem de livros, de modo a redirecionar qualquer pedido desse recurso para a instância de controller listBooksController, cuja classe iremos fazer de seguida:

    <bean id="urlMapping" class="org.springframework.web.servlet.handler.SimpleUrlHandlerMapping">
        <property name="mappings">
            <props>
                <prop key="index.htm">indexController</prop>
                <prop key="listBooks.htm">listBooksController</prop>
            </props>
        </property>

    </bean>

Temos também que dizer qual a classe desse controller:

    <bean name="listBooksController" class="exemplo.ListBooksController">
    </bean>

Por fim, é necessário instanciar um bean sessionFactory, o qual é configurado através do ficheiro de configuração do Hibernate:
    
    <bean id="sessionFactory" 
        class="org.springframework.orm.hibernate3.LocalSessionFactoryBean">
        <property name="configLocation">
            <value>classpath:hibernate.cfg.xml</value>
        </property>
        <property name="configurationClass">
            <value>org.hibernate.cfg.AnnotationConfiguration</value>
        </property>

    </bean>


Falta-nos, ainda, fazer a View (listBooks.jsp) e a classe do controlador (ListBooksController.java) que deve ler os livros da BD e chamar a view, passando-lhe a lista de livros a listar...

ListBooksController.java:
package exemplo;

import exemploModel.*;
import java.util.ArrayList;
import java.util.List;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.mvc.AbstractController;

public class ListBooksController extends AbstractController {

    @Override
    protected ModelAndView handleRequestInternal(
            HttpServletRequest request,
            HttpServletResponse response) throws Exception {
        
        List<Book> books;
        books = Book.getAllBooks();
        return new ModelAndView("listBooks", "books", books);
    }

}


listBooks.jsp (na pasta WEB-INF/jsp):

<%@page contentType="text/html"%>
<%@page pageEncoding="UTF-8"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="spring" uri="http://www.springframework.org/tags" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form"%>

<html:html lang="true">
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>List of Books</title>
        <html:base/>
    </head>
    <body style="background-color: white">       
        <div style="background-color:blueviolet;height:30px;font-weight:bold;">
            <h2>List of Books</h2>
        </div>
        <br/>
        <table border="0" width="90%">
            <tbody>
                <tr style="background-color:blueviolet;font-weight:bold;">
                    <td>Title</td>
                    <td>ISBN</td>
                    <td>Date Edition</td>
                    <td>Edition</td>
                    <td>Editor</td>
                </tr>
                <c:forEach items="${books}" var="book">
                    <tr>
                        <td>${book.title}</td>
                        <td>${book.isbn}</td>
                        <td>${book.dateEdition}</td>
                        <td>${book.edition}</td>
                        <td>${book.editor}</td>                        
                    </tr>
                </c:forEach>
            </tbody>
        </table>
    </body>

</html:html>



Por fim, resta acrescentar um link no nosso ficheiro index.jsp, para chamar o recurso listBooks.htm:

<a href="listBooks.htm">List Books</a>


Ao executar a aplicação, e após clicar no link List Books, que acrescentámos no index.jsp, deve aparecer-nos a lista de livros que temos na BD.





Outros artigos relacionados:



Sem comentários:

Enviar um comentário