En este ejemplo se inserta un tupla en la base de datos creada, con los datos introducidos mediante un formulario rellenado por el usuario
Tenemos la tabla libros de la base de datos libros_jdbc, tal como viene en este ejemplo base de datos. Tenemos una tabla libros pertenecientes a la base datos con tres campos el titulo, autor y la temática del libro.
Para este ejemplo necesitamos para un mejor entendimiento necesitamos conocer como se crea un plugin y aquí tenemos uno hecho creación de plugin
Formulario de recogida de datos 
este formumario esta asociado a una acción recogida en el fichero de configuración de struts el struts-config.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 | <action path="/formularioHibernate" type="acciones.AccionHibernateLibro" scope="request" name="hibernatelibro" validate="true" input="/pages/formulariohibernate.jsp" > <set-property property="cancellable" value="true" /> <forward name="listado" path="/pages/listadohibernate.jsp"/> <forward name="cancelada" path="/pages/cancelada2.jsp"/> </action> |
Se ha explicado en otros post anteriores cada uno de los elementos que aparecen en esta configuración, pero a modo de recordatorio, se enumeran los valores de los diferentes campos. Para el path tenemos el nombre de la acción que se ejecuta en este caso (formulariohibernate), esta acción esta recogida en una clase (AccionHibernateLibro) que es la encargada de evaluar y procesar los datos, el name hace referencia al bean en este caso dinámico encargado de recoger los datos del formulario (hibernatelibro).
Código del bean dinámico encargado de recoger los datos del formulario, para poder ser tratados por la clase (AcciónHibernateLibro)
1 2 3 4 5 | <form-bean name="hibernatelibro" type="org.apache.struts.validator.DynaValidatorForm"> <form-property name="titulo" type="java.lang.String"/> <form-property name="tematica" type="java.lang.String"/> <form-property name="autor" type="java.lang.String"/> </form-bean> |
Código del formulario formulariohibernate.jsp correspondiente a la imagen anterior
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 | <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="http://struts.apache.org/tags-html" prefix="html" %> <%@taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html:html> <head> <html:base/> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="../css/estilo.css" type="text/css"/> <title><bean:message key="titulo.hibernate"/></title> </head> <body> <div id="contenedor"> <h2><bean:message key="titulo.hibernate"/></h2> <div id="errores"> <html:errors/> </div> <div id="imagen"> <html:img srcKey="libro.imagen" titleKey="libro.imagen.alt"/> </div> <div id="contenido"> <html:form method="post" action="formularioHibernate" styleId="formulario" focus="titulo" > <div class="campo"> <bean:message key="formulariodatasource.titulolibro"/> <html:text property="titulo"/> </div> <div class="campo"> <bean:message key="formulariodatasource.autor"/> <html:text property="autor"/> </div> <div class="campo"> <bean:message key="formulariodatasource.tematica"/> <html:text property="tematica"/> </div> <html:submit styleClass="boton" value="enviar"/> <html:cancel styleClass="boton" value="cancelar"/> <html:reset styleClass="boton" value="borrar"/> </html:form> </div> <div id="pie"> <p> www.railsymas.com </p> </div> </div> </body> </html:html> |
configuración del plugin en el fichero struts-config.xml, creamos un plugin indicando la clase HibernatePlugin y la propiedad dirección con el valor de la ruta del fichero de configuración de hibernate
1 2 3 4 5 6 7 8 | <!-- ========== Hibernate ======= --> <plug-in className="configuracion.plugin.HibernatePlugin"> <set-property property="direccion" value="/hibernate.cfg.xml"/> </plug-in> |
para cargar el fichero de configuración de hibernate creamos un plugin, como repaso tenemos que extender de la clase Plugin y sobre escribimos los métodos destroy e init. Se crea por comodidad una variable estática de la clase llamada clave_hibernate que nos permitirá recoger la factoria de hibernate para poder insertar, borrar, editar etc..
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 | package configuracion.plugin; import javax.servlet.ServletContext; import javax.servlet.ServletException; import org.hibernate.SessionFactory; import org.hibernate.cfg.Configuration; import org.apache.struts.action.ActionServlet; import org.apache.struts.action.PlugIn; import org.apache.struts.config.ModuleConfig; import org.hibernate.HibernateException; public class HibernatePlugin implements PlugIn { private String direccion; public static final String clave_hibernate = "Hibernate"; private SessionFactory factoria = null; public String getDireccion() { return direccion; } public void setDireccion(String direccion) { this.direccion = direccion; } public void destroy() { try { factoria.close(); } catch(HibernateException e) { System.out.println("No se puede cerrar la sesión: " + e.getMessage()); } } public void init(ActionServlet servlet, ModuleConfig config) throws ServletException { Configuration configuration = null; ServletContext contexto = null; try{ contexto = servlet.getServletContext(); configuration = (new Configuration()).configure(direccion); factoria = configuration.buildSessionFactory(); contexto.setAttribute(clave_hibernate, factoria); }catch(HibernateException e){ System.out.println("Error de inicialización de hibernate: " + e.getMessage()); } } } |
código de la clase encargada de recoger la acción, esta clase como solamente realiza una acción extendemos de action y editamos el método ejecute. Esta clase es la encargada de recoger los datos del formulario así como de la utilización de recuperar el manejador de la factoria.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 | package acciones; import org.apache.struts.action.Action; import org.apache.struts.action.ActionMapping; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.ServletContext; import org.apache.struts.action.ActionForm; import org.apache.struts.validator.DynaValidatorForm; import org.apache.struts.action.ActionForward; import configuracion.plugin.HibernatePlugin; import org.hibernate.SessionFactory; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.TransactionException; import modelos.*; import java.util.List; import java.util.Iterator; public class AccionHibernateLibro extends Action { private ActionForward reenvio = null; private DynaValidatorForm formulario = null; private Session sesion = null; private SessionFactory factory= null; private Transaction transaction = null; public ActionForward execute (ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { formulario = (DynaValidatorForm) form; if (isCancelled(request)) { reenvio = mapping.findForward("cancelada"); } else { ServletContext context = request.getSession().getServletContext(); factory = (SessionFactory) context.getAttribute(HibernatePlugin.clave_hibernate); sesion = factory.openSession(); try { transaction = sesion.beginTransaction(); Libros libro = new Libros(); //introducimos los valores para el libro nuevo libro.setTitulo(formulario.getString("titulo")); libro.setAutor(formulario.getString("autor")); libro.setTematica(formulario.getString("tematica")); sesion.save(libro); transaction.commit(); transaction = sesion.beginTransaction(); List <Libros> libros = sesion.createQuery("from Libros").list(); for ( Iterator <Libros> iterador = libros.iterator() ; iterador.hasNext();) { libro = (Libros) iterador.next(); System.out.println("titulo:"+libro.getTitulo()); System.out.println("autor:"+libro.getAutor()); System.out.println("tematica:"+libro.getTematica()); } transaction.commit(); request.setAttribute("libros", libros); reenvio = mapping.findForward("listado"); } catch (TransactionException e ) { //abortamos la transacción y restauramos los valores anteriores transaction.rollback(); e.printStackTrace(); } finally { //cerramos la sesión sesion.close(); } } return reenvio; } } |
archivo de configuración hibernate.cfg,xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <?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.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <property name="hibernate.connection.url"> jdbc:mysql://localhost:3306/libros_jdbc</property> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5Dialect</property> <property name="hibernate.hbm2ddl.auto">update</property> <property name="show_sql">true</property> <property name="format_sql">true</property> <mapping resource="modelos/Libros.hbm.xml"/> </session-factory> </hibernate-configuration> |
sobre los parámetros recogidos en el fichero hibernate.cfg.xml se comentaron en el post hibernate tools
Para el mapeo de las tablas tenemos que crear un archivo xml con extension hbm.xml. estos archivos los podemos poner en un package propio por en este ejemplo “modelo” haciendo referencia a las las clases y ficheros de configuración asociados a las tablas de la base de datos.
Al ejecutar la aplicación se nos crea automáticamente una clase bean con los propiedades indicadas en los ficheros hbm.xml, en este caso una clase Libro
Para crear un fichero hbm vamos con la vista hibernate de eclipse activada a new, hibernate xml mapping creamos un fichero libros.hbm.xml
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | <?xml version="1.0"?> <!DOCTYPE hibernate-mapping PUBLIC "-//Hibernate/Hibernate Mapping DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd"> <!-- Generated 26-ene-2010 1:33:06 by Hibernate Tools 3.2.4.GA --> <hibernate-mapping> <class name="modelos.Libros" table="libros" catalog="libros_jdbc"> <id name="id" type="java.lang.Integer"> <column name="id" /> <generator class="identity" /> </id> <property name="titulo" type="string"> <column name="titulo" length="50" not-null="true" /> </property> <property name="autor" type="string"> <column name="autor" length="50" not-null="true" /> </property> <property name="tematica" type="string"> <column name="tematica" length="50" not-null="true" /> </property> </class> </hibernate-mapping> |
Valores de los parámetros, table hace referencia a la tabla de la base de datos, catalog hace referencia a la base de datos, el primer parametro id indicamos que el campo es la clave primaria, los atributos property indicamos el nombre de la propiedad y a que campo de la tabla corresponde es decir podemos tener el campo titulo en la tabla y en la propiedad titu_x por decir algo, entoces a la hora de usar por código el objeto de mapeo haríamos objeto.titu_x pero por comodidad le damos el mismo valor que la tabla así es más fácil acordorse de las propiedades.
Imagen del listado del libro una vez guardado los datos
Salida por pantalla para verificar la inserción como consecuencia de activar en el fichero hibernate.cfg.xml el parámetro show_sql y format_sql
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | INFO: Tiles definition factory found for request processor ''.
Hibernate:
insert
into
libros_jdbc.libros
(titulo, autor, tematica)
values
(?, ?, ?)
Hibernate:
select
libros0_.id as id0_,
libros0_.titulo as titulo0_,
libros0_.autor as autor0_,
libros0_.tematica as tematica0_
from
libros_jdbc.libros libros0_
titulo:titulo3
autor:autor3
tematica:tematica3 |


Estan fantasticos los tutoriales que presentas apenas, estoy iniciando en esto de struts, y no entiendo mucho de lo que explicas me podrías recomendar algún libro o tutorial para ir iniciando.
saludos
Struts es un framework de desarrollo creado en el año 2000, tiene ya su tiempo, tutoriales en sitios web en ingles abundan más que en español, sitos buenos en ingles http://www.roseindia.com para múltiples frameworks además de struts, http://www.vaannila.com en inglés tambien con una serie de ejercicios, y
En castallano sitios http://www.adictosaltrabajo.com mucho material de java pero de struts le falta material respecto a las de inglés.
Libros en castellano jakarta Struts de anaya o’really este libro lo compré hace varios años, es un libro traducido de oreally es un clásico y una referencia tanto en inglés como en castellano. El problema que le encontre a ese libro es que tiene una aplicación grande que la va trabajando por capítulo mezcla teoría con práctica, lo encontre para gente que tenía una noción inicial de struts.
Libro editado por anaya multimedia de la editorial wrox Fundamentos del desarrollo Web con Jsp , es un libro que trata en sus primeros capítulos de temas de jsp, servlets, jdbc y sus dos capítulos últimos son extensos y tratan sobre struts, considero que es mejor opción que jakarta struts, mucho más ordenado
La editorial manning suele tener buenos libros struts in action, y struts2 in action.
Si se quiere empezar con struts2 la editorial Ra-ma tiene un libro, pongo el enlace struts 2
Todos los tutoriales desde cero de struts de este sitio puestos por el usuario supernicky en scribd en el siguiente enlace
Struts pdf supernicky