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" />
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.
A camada model de este projeto Spring Web MVC é exatamente a mesma que foi usada no projeto Struts. Ver artigos:
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