En este post van a aprender cómo integrar Spring4 MVC con aplicación de Hibernate con la herramienta de compilación de Maven y realizará las operaciones CRUD usando base de datos MySql.
Estructura del proyecto:
La captura de pantalla siguiente muestra la estructura final del proyecto:
Paso 1: Crear tabla de la base de datos
Para esta demo, he creado una tabla cliente en la base de datos MySQL. Encontrar la secuencia de comandos para crear la tabla cliente.
CREATE TABLE `archivo`.`cliente` (
`idcliente` INT NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(45) NULL,
`paterno` VARCHAR(45) NULL,
`materno` VARCHAR(45) NULL,
`fecha_reg` DATETIME NULL,
PRIMARY KEY (`idcliente`));
`idcliente` INT NOT NULL AUTO_INCREMENT,
`nombre` VARCHAR(45) NULL,
`paterno` VARCHAR(45) NULL,
`materno` VARCHAR(45) NULL,
`fecha_reg` DATETIME NULL,
PRIMARY KEY (`idcliente`));
Paso 2: Actualizar las dependencias de Maven
Actualización pom.xml para incluir las dependencias necesarias
pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0
http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.ugurcan.simple</groupId>
<artifactId>archivo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<name>archivo</name>
<build>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>2.3.2</version>
<configuration>
<source>1.7</source>
<target>1.7</target>
</configuration>
</plugin>
</plugins>
</build>
<dependencies>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.1.7</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>servlet-api</artifactId>
<version>2.5</version>
</dependency>
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>jsp-api</artifactId>
<version>2.1</version>
</dependency>
<dependency>
<groupId>com.sun.el</groupId>
<artifactId>el-ri</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.primefaces.extensions</groupId>
<artifactId>all-themes</artifactId>
<version>1.0.7</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-context</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-web</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-tx</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-orm</artifactId>
<version>${spring.version}</version>
</dependency>
<dependency>
<groupId>commons-dbcp</groupId>
<artifactId>commons-dbcp</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>javax.persistence</groupId>
<artifactId>persistence-api</artifactId>
<version>1.0</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-core</artifactId>
<version>4.1.9.Final</version>
</dependency>
<dependency>
<groupId>mysql</groupId>
<artifactId>mysql-connector-java</artifactId>
<version>5.1.6</version>
</dependency>
<!-- http://mvnrepository.com/artifact/org.primefaces/primefaces -->
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>5.3</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.2.2</version>
</dependency>
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>1.4</version>
</dependency>
</dependencies>
<properties>
<spring.version>3.2.3.RELEASE</spring.version>
<netbeans.hint.deploy.server>gfv3ee6</netbeans.hint.deploy.server>
</properties>
</project>
Paso 3: Descriptor de despliegue (web.xml)
Necesitamos en nuestra aplicación web, que se realiza mediante la configuración de Spring framework DispatcherServlet como controlador frontal plugin framework de spring.
<?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>Simple</display-name>
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Projection</param-value>
</context-param>
<!-- Spring Context Configuration' s Path definition -->
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/WEB-INF/applicationContext.xml
</param-value>
</context-param>
<listener>
<listener-class>
org.springframework.web.context.ContextLoaderListener
</listener-class>
</listener>
<listener>
<listener-class>
org.springframework.web.context.request.RequestContextListener
</listener-class>
</listener>
<!-- Change to "Production" when you are ready to deploy -->
<context-param>
<param-name>javax.faces.PROJECT_STAGE</param-name>
<param-value>Development</param-value>
</context-param>
<!-- Welcome page -->
<welcome-file-list>
<welcome-file>login.xhtml</welcome-file>
</welcome-file-list>
<!-- JSF mapping -->
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<!-- Map these files with JSF -->
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.jsf</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.faces</url-pattern>
</servlet-mapping>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>*.xhtml</url-pattern>
</servlet-mapping>
<context-param>
<param-name>primefaces.THEME</param-name>
<param-value>blitzer</param-value>
</context-param>
<filter>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<filter-class>
org.primefaces.webapp.filter.FileUploadFilter
</filter-class>
<init-param>
<param-name>javax.faces.UPLOADED_FILE_MAX_SIZE</param-name>
<param-value>9999999999504857600</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>PrimeFaces FileUpload Filter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
</web-app>
Paso 4: Archivo de configuración de Spring (applicationContext.xml)
MVC-applicationContext.xml
<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:context="http://www.springframework.org/schema/context"
xmlns:jee="http://www.springframework.org/schema/jee"
xmlns:tx="http://www.springframework.org/schema/tx"
xmlns:task="http://www.springframework.org/schema/task"
xsi:schemaLocation="http://www.springframework.org/schema/aop
http://www.springframework.org/schema/aop/spring-aop-3.2.xsd
http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
http://www.springframework.org/schema/context
http://www.springframework.org/schema/context/spring-context-3.2.xsd
http://www.springframework.org/schema/jee
http://www.springframework.org/schema/jee/spring-jee-3.2.xsd
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx-3.2.xsd
http://www.springframework.org/schema/task
http://www.springframework.org/schema/task/spring-task-3.2.xsd">
<context:component-scan base-package="com.ugurcanlacin.simple.*" />
<tx:annotation-driven/>
<bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
<property name="driverClassName" value="com.mysql.jdbc.Driver" />
<property name="url" value="jdbc:mysql://localhost:3306/archivo" />
<property name="username" value="root" />
<property name="password" value="root" />
</bean>
<bean id="sessionFactory" class="org.springframework.orm.hibernate4.LocalSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
<property name="packagesToScan" value="com.ugurcanlacin.simple.*"/>
<property name="hibernateProperties">
<props>
<prop
key="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect
</prop>
<!--
<prop key="hibernate.show_sql">true</prop>
<prop key="hibernate.format_sql">true</prop>
-->
</props>
</property>
</bean>
<bean id="transactionManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager"
p:sessionFactory-ref="sessionFactory">
</bean>
</beans>
Paso 6: Capa de persistencia
ClienteEntity.java
@Entity
@Table(name = "cliente")
public class ClienteEntity implements Serializable{
@Id
@Column(name = "idcliente")
private Integer id;
private String nombre;
private String paterno;
private String materno;
@Temporal(javax.persistence.TemporalType.DATE)
private Date fecha_reg ;
// get y set
}
Hibernate DAO implementación
Vamos a crear interfaz GenericDAO para declarar los métodos que usaremos en nuestro proyecto. A continuación, proporcionaremos.
public interface GenericDAO<T> {
public List<T> getAllDAO();
public void addDAO(T t);
public void updateDAO(T t);
public void deleteDAO(T t);
}
public List<T> getAllDAO();
public void addDAO(T t);
public void updateDAO(T t);
public void deleteDAO(T t);
}
Crear una clase de tipo interfaz ClienteDao
public interface ClienteDao extends GenericDAO<ClienteEntity> {
}
}
@Repository
public class ClienteDaoImpl implements ClienteDao{
@Autowired
private SessionFactory sessionFactory;
private Session getSession() {
return sessionFactory.getCurrentSession();
}
@Override
public List<ClienteEntity> getAllDAO() {
Criteria criteriaList = this.getSession().createCriteria(ClienteEntity.class);
return criteriaList.list();
}
@Override
public void addDAO(ClienteEntity t) {
this.getSession().save(t);
}
@Override
public void updateDAO(ClienteEntity t) {
this.getSession().update(t);
}
@Override
public void deleteDAO(ClienteEntity t) {
this.getSession().delete(t);
}
}
Crerar GenericServicede tipo interface
public interface GenericService<T> {
public List<T> getAllDAO();
public void addDAO(T t);
public void updateDAO(T t);
public void deleteDAO(T t);
}
Crerar ClienteService de tipo interface
public interface ClienteService extends GenericService<ClienteEntity> {
}
Crear una clase con nombre ClienteServiceImpl
@Transactional
@Service
public class ClienteServiceImpl implements ClienteService{
@Autowired
ClienteDao clienteDao;
@Override
public List<ClienteEntity> getAllDAO() {
return clienteDao.getAllDAO();
}
@Override
public void addDAO(ClienteEntity t) {
this.clienteDao.addDAO(t);
}
@Override
public void updateDAO(ClienteEntity t) {
this.clienteDao.updateDAO(t);
}
@Override
public void deleteDAO(ClienteEntity t) {
this.clienteDao.deleteDAO(t);
}
}
Crear ClienteBean de tipo Bean
@Controller
@ManagedBean
@SessionScoped
public class ClienteBean implements Serializable{
@Autowired
ClienteService clienteService;
private List<ClienteEntity> list;
private ClienteEntity entity;
public ClienteBean() {
this.entity = new ClienteEntity();
this.list = new ArrayList<>();
}
public List<ClienteEntity> getList() {
list = clienteService.getAllDAO();
return list;
}
public void setList(List<ClienteEntity> list) {
this.list = list;
}
public ClienteEntity getEntity() {
return entity;
}
public void setEntity(ClienteEntity entity) {
this.entity = entity;
}
public void registrar(){
try {
clienteService.addDAO(entity);
FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Se registro correctamente"));
entity = new ClienteEntity();
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
FacesContext.getCurrentInstance().addMessage("", message);
}
}
public void actualizar(){
try {
clienteService.updateDAO(entity);
FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Se registro correctamente"));
entity = new ClienteEntity();
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
FacesContext.getCurrentInstance().addMessage("", message);
}
}
public void eliminar(){
try {
clienteService.deleteDAO(entity);
FacesContext.getCurrentInstance().addMessage("", new FacesMessage("Se registro correctamente"));
entity = new ClienteEntity();
} catch (Exception e) {
System.out.println("Error: " + e.getMessage());
FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, e.getMessage(), "");
FacesContext.getCurrentInstance().addMessage("", message);
}
}
}
cliente de xhtml
Resultados


