Documente Academic
Documente Profesional
Documente Cultură
En esta tutorial demostraremos cómo los struts e Hibernate para persistencia de base de datos se
pueden utilizar juntos. Aunque explicamos algo básico, usted debe probar los tutoriales
introductorios primero si es un prinicpiante.
General
Autor:
Sebastian Hennebrüder
http://www.laliluna.de/tutorials.html
Tutoriales para los struts, EJB, xdoclet y eclipse.
Fecha:
Revisado enero, 16 th 2005
Primera Edición Diciembre, 20 2004
Código fuente:
http://www.laliluna.de/assets/tutorials/struts-hibernate-integration-tutorial.zip
Uso del código fuente.
El código fuente no incluye ninguna biblioteca solo los fuentes. Cree un proyecto web, agregue las
bibliotecas manualmente o con la ayuda de MyEclipse y descomprima los fuentes que
proporcionamos a su proyecto.
Versión del pdf del tutorial :
http://www.laliluna.de/assets/tutorials/struts-hibernate-integration-tutorial-es.pdf
Herramientas de Desarrollo
Eclipse 3.x
MyEclipse 3,8 plugin
(Una extensión barata y muy poderosa de eclipse para desarrollar aplicaciones web y aplicaciones
de EJB (J2EE). Pienso que hay una versión de prueba disponible en MyEclipse.)
Base de datos
PostgreSQL 8,0 beta o MySQL
Servidor de Aplicación
Jboss 3,2,5
Puede utilizar Tomcat aquí si usted quiere.
Importante:
Cuando usted está utilizando Tomcat en forma independiente y no incluido en Jboss, no puede
utilizar dos proyectos separados. Esto normalmente trabaja con Jboss mientras que Jboss comparte
clases por defecto.
Dos proyectos separados deben desarrollarse como proyecto EAR (MyEclipse - > new J2EE
project) Un proyecto EAR puede incluir múltiples proyectos web.
¡Si usted cambió la carga de clases de Jboss, también debe utilizar un proyecto EAR!
Tabla de contenidos
Primeros pasos usando los struts e Hibernate 1
General 1
Crear un proyecto de la biblioteca Hibernate 2
Creación del Proyecto de Persistencia 2
Creación de la base de datos 6
Generación del archivo de Mapeo de Hibernate y las clases 6
Reparación del mapeo Hibernate 9
Corrección del mapeo buleano 10
Mejoras al session Factory 10
Prueba de la parte de Hibernate 11
Problema de PostgreSQL 15
Generación de la lógica del negocio 16
Creación de una clase para la lógica del negocio 16
Creación de los diálogos 22
Configuración de la ruta de construcción de Java 25
Creación de una página de bienvenida por defecto 25
Global Action Forwards y Action Mappings
(Acciones de redirección global y Mapeo de Acciones) 27
Lista de libros 30
Action Mapping y clase Action para la lista de libros 32
Edición del código fuente de la clase Form Action 32
Edición del código fuente de la clase Action 33
Muestra de la lista de libros en el archivo jsp. 33
Prueba de la aplicación 36
Añadir, editar, pedir prestados y suprimir los libros 36
Nuevo Form Bean 36
Caso de uso: editar libro 40
Mapeo de Acción 40
Métodos de envío de la clase acción 44
Caso de uso: la lista de clientes 47
Edición del código fuente de la clase Form Action 50
Muestra de la lista de clientes 50
Caso de uso: añadir, editar, suprimir clientes 51
Nuevo Form Bean 53
Edición del código fuente de la clase Action 56
Edición del código fuente del archivo jsp 57
Prueba de la aplicación 58
Crear un proyecto de la biblioteca Hibernate
Comenzaremos creando y probando un proyecto de Hibernate. El segundo paso es agregar la lógica
de negocio y en el último integrar la parte de struts.
Agregue las capacidades de Hibernate al hacer clic derecho en la vista del paquete del proyecto .
Compruebe las dos casillas de verificación para agregar las bibliotecas al proyecto y seleccione
crear un nuevo archivo de mapeo hibernate. El archivo de hibernate lleva a cabo la configuración de
sus ajustes y mappings del hibernate.
Cerciórese de que usted tenga marcado la casilla "Copy JDBC driver...". Vamos a utilizar
PostgreSQL. No debería ser difícil hacer lo mismo con MySQL u otra base de datos. Cerciórese de
que tenga el archivo jar del controlador de la base de datos en alguna parte en su disco.
En el paso siguiente usted debe inventar un nombre descriptivo para su SessionFactory.
¿Qué es un SessionFactory?
Hibernate espera que haya una sola instancia de la clase de sesión de Hibernate por cada conexión
(thread). Tendría que tener para crear una implementación de la clase un ThreadLocal. MyEclipse
hace esto para usted. La parte difícil es inventar un nombre para él. Si usted no está utilizando
MyEclipse heche un vistazo a los fuentes.
Reduzca Las Bibliotecas De Hibernate
Por defecto MyEclipse incluye una carga pesada de bibliotecas. Algunas de ellas serán solamente
necesarias para el desarrollo local otros solamente para implementaciones especiales de cache.
Cuando desea optimizar su desarrollo después de que aprenda los fundamentos de la transferencia
directa de Hibernate bajando Hibernate del website http://www.hibernate.org/ en el directorio lib
usted encontrará un README.txt donde explica qué bibliotecas son opcionales.
Ahora estamos preparados para comenzar el desarrollo. Abrochese los cinturones, esto ahora irá
muy rápido.
Seleccione las dos tablas que acabamos de crear. Botón derecho y elija "Create Hibernate Mapping".
Seleccione como destino su proyecto LibraryPersistence. Cuando se está utilizando PostgreSQL
seleccione la "secuence" como generador de la identificación. Cuando usted está utilizando MySQL
seleccione "native".
Ahora veremos más de cerca en nuestro explorador del paquete para ver qué sucedió.
Primero abra el hibernate.cfg.xml.
Hay dos nuevas entradas, que especificanddonde se localizan los dos archivos de mapeo. Es una
buena idea mantener los archivos de mapeo separados del hibernate.cfg.xml . (lo qué MyEclipse
hace realmente para usted.)
<hibernate-mapping package="de.laliluna.library">
<class name="Book" table="book">
<id name="id" column="id" type="java.lang.Integer">
<generator class="sequence"/>
</id>
MyEclipse creó dos archivos por clase. El primero es una clase abstracta. (AbstractBook) será
sobreescrito cada vez que usted repita el procedimiento de la importación. En la segunda clase
(libro) usted puede adaptar cualquier cambio que desee realizar. Se genera solamente una vez.
<hibernate-mapping package="de.laliluna.library">
<class name="Customer" table="customer">
<id name="id" column="id" type="java.lang.Integer">
<generator class="sequence"/>
</id>
</hibernate-mapping>
La especificamos como
inverse="false "
Esto especifica que queremos cambiar el atributo en "uno" de la relación “uno a muchos” para ser
reflejados en la base de datos.
Pro ejemplo:
customer.getbooks().add(aBook);
Deberemos escribir la clave foránea en la tabla Customer.
Manualmente cambiar el archivo no es muy bueno pero no hay otra forma aquí.
La desventaja de esto es que será sobreescrito cada vez qye regenere los archivos de mapeo. En
nuestro caso no es importante pero en un proyecto grande esto es imposible para usar la
autogeneración de MyEclipse excepto que lo haga al principio. La función de importación es
realmente nueva en MyEclipse asi que seguramente habra grandes mejoras en las próximas
versiones.
Cambie la variable, los getter y setter en el archivo AbstractBook.java a tipo Boolean. private
java.lang.Boolean available;
/**
* Return the value of the available column.
* @return java.lang.Byte
*/
public java.lang.Boolean getAvailable()
{
return this.available;
}
/**
* Set the value of the available column.
* @param available
*/
public void setAvailable(java.lang.Boolean available)
{
this.available = available;
}
El tarea más fácil con respecto a esto es esperar hasta que MyEclipse mejore la rutina. La más
rápida es crear una secuencia llamada hibernate_sequence. Una desventaja es que todas las tablas
compartidas tiene la misma secuencia. Tendrá una tabla con una sobrecarga.
CREATE SEQUENCE hibernate_sequence
INCREMENT 1
MINVALUE 1
MAXVALUE 9223372036854775807
START 1
CACHE 1;
La forma más agradable, pero solo es posible cuando esté seguro de no generar sus archivos de
mapeo (Debería sobreescribir sus cambios) es cambiar el mapeo de
<generator class="sequence"/>
Este clase mantendrá todos los métodos necesarios como lógica de negocio
• crear, modificar y borrar libros
• crear, modificar y borrar clientes
• pedir prestado y devolver libros
• leer todos los clientes o libros de la db para una lista
Excepciones en Hibernate
Cuando una excepción ocurre se recomienda hacer roll back a la transacción e inmediatamente
cerrar la sesión. Eso es lo que hemos hecho con
try
catch {}
finally{}
Creación de diálogos
Cree un nuevo proyecto struts con File > New > Project o use el atajo Ctrl + n.
Elija el Wizard de proyectos Web J2EE.
Pongale un buen nombre a su proyecto.
Por ahora su proyecto es como un proyecto Web común, lo que necesitamos es agregar las
capacidades struts. Botón derecho en el proyecto y agregue estas capacidades con Add Struts
Capabilities.
Encontrará el archivo index.jsp en la carpeta WebRoot del proyecto. Al principio del archivo
encontrará la declaración de la biblioteca de marcas de struts. Esto será usado para acceder a las
marcas de struts. En este caso solo necesitamos la biblioteca de marcas lógicas.
Inserte la siguiente linea que incluye la marca logic.
<logic:forward name="welcome" />
Esta línea le dice a struts que busque una redirección (forward) con el nombre “welcome”. Si la
aplicación no encuentra este forward, devolverá un error, en la sección siguiente explicaré
brevemente la acción forward.
MyEclipse provee algunas buenas características para crear archivos struts. Abra struts-config.xml y
la vista Outline.
Clic con el botón derecho del mouse en action-mappings para crear una nueva acción con el
asistente.
Seleccione Use Case default y Action Type Forward. El Forward Path es la página de bienvenida /
jsp/index.jsp
Para atrapar todas las solicitudes de las acciones que no esten mapeadas, tenemos que agregar
manualmente un parámetro unknow="true" en action forward.
<action-mappings >
<action forward="/jsp/index.jsp" path="/default" unknown="true"/>
</action-mappings>
Lista de Libros
Este caso de uso lista todo los libros disponibles.
Seleccione el asistente para crear un nuevo Formulario, acción y JSP.
El caso de uso es bookList, Superclass org.apache.struts.ActionForm. Elija public void reset.. para
crear este método.
No necesita tipear los métodos getter y setter. Clic con el botón derecho sobre el proyecto -> select
Source -> Generate Getters/Setters.
<html>
<head>
<title>Show book list</title>
</head>
<body>
<table border="1">
<tbody>
<%-- set the header --%>
<tr>
<td>Author</td>
<td>Book name</td>
<td>Available</td>
<td>Borrow by</td>
<td> </td>
<td> </td>
<td> </td>
</tr>
<%-- start with an iterate over the collection books --%>
<logic:iterate name="bookListForm" property="books" id="book">
<tr>
<%-- book informations --%>
<td><bean:write name="book" property="author" /></td>
<td><bean:write name="book" property="title" /></td>
<td><html:checkbox disabled="true"
name="book"
property="available"/>
</td>
<td>
<%-- check if a customer borrowed a book,
when its true display his name
otherwise display nothing --%>
<logic:notEmpty name="book" property="customer">
<bean:write name="book" property="customer.name" />,
<bean:write name="book" property="customer.lastname" />
</logic:notEmpty>
<logic:empty name="book" property="customer">
-
</logic:empty>
</td>
<%-- borrow, edit and delete link for each book --%>
<td>
<%-- check if a user borrowed a book,
when its true display the return link
otherwise display the borrow link --%>
<logic:notEmpty name="book" property="customer">
<html:link action="bookEdit.do?do=returnBook"
paramName="book"
paramProperty="id"
paramId="id">Return book</html:link>
</logic:notEmpty>
<logic:empty name="book" property="customer">
<html:link action="bookEdit.do?do=borrowBook"
paramName="book"
paramProperty="id"
paramId="id">Borrow book</html:link>
</logic:empty>
</td>
<td><html:link action="bookEdit.do?do=editBook"
paramName="book"
paramProperty="id"
paramId="id">Edit</html:link>
</td>
<td><html:link action="bookEdit.do?do=deleteBook"
paramName="book"
paramProperty="id"
paramId="id">Delete</html:link>
</td>
</tr>
</logic:iterate>
<%-- end interate --%>
</tbody>
</table>
<br>
<%-- add and back to menu button --%>
<html:button property="add"
onclick="location.href='bookEdit.do?do=addBook'">Add a new book
</html:button>
<html:button property="back"
onclick="location.href='default.do'">Back to menu
</html:button>
</body>
</html>
La marca <logic:iterate> recorre el array de libros. Con la marca Ud. tiene acceso a las propiedades
de los libros con el nombre “book”. La marca <bean:write> imprime una propiedad de un libro, por
ejemplo el título (title). Con la marca <logic:notEmpty> y <logic:empty> vcerificamos, si un
usuario a ha pedido prestado un libro o no.
Sí eso es todo, ha creado su formulario bean con un action form class, un action mapping con un
action class y el jsp que muestra algo.
Prueba de la aplicación
Arranque el jboss y despliegue el proyecto (LibraryPersistenceLibs, LibraryPersistence y
LibraryWeb) como archivos adjuntos
Cree un nuevo formulario bean y una clase action form. Ponga como Use case a bookEdit y elmine
todos los métodos en Optional details – Methods. MyEcplise crea un archivo jsp por nosotros.
Abra la clase BookEditForm.java en de.laliluna.tutorial.library.form .
Cree los atributos book y customerId.
/**
* we will need this field to save the customer id in the dialogs where
a customer borrows a book
*/
private Integer customerId;
Genere los getters y setters para los atributos. Luego genere todos los métodos delegados por el
atributo book.
El código será como el siguiente:
public class BookEditForm extends ActionForm {
private Book book = new Book();
/**
* we will need this field to save the customer id in the dialogs where a
customer borrows a book
*/
private Integer customerId;
/**
* @return Returns the book.
*/
public Book getBook() {
return book;
}
/**
* @param book The book to set.
*/
public void setBook(Book book) {
this.book = book;
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object arg0) {
return book.equals(arg0);
}
/**
* @return
*/
public String getAuthor() {
return book.getAuthor();
}
/**
* @return
*/
public Boolean getAvailable() {
return book.getAvailable();
}
/**
* @return
*/
public Customer getCustomer() {
return book.getCustomer();
}
/**
* @return
*/
public Integer getId() {
return book.getId();
}
/**
* @return
*/
public String getTitle() {
return book.getTitle();
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return book.hashCode();
}
/**
* @param author
*/
public void setAuthor(String author) {
book.setAuthor(author);
}
/**
* @param available
*/
public void setAvailable(Boolean available) {
book.setAvailable(available);
}
/**
* @param customer
*/
public void setCustomer(Customer customer) {
book.setCustomer(customer);
}
/**
* @param id
*/
public void setId(Integer id) {
book.setId(id);
}
/**
* @param title
*/
public void setTitle(String title) {
book.setTitle(title);
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
return book.toString();
}
/**
* @return Returns the customerId.
*/
public Integer getCustomerId() {
return customerId;
}
/**
* @param customerId The customerId to set.
*/
public void setCustomerId(Integer customerId) {
this.customerId = customerId;
}
}
Action Mapping
Cree un nuevo action mapping. Hay una diferencia con nuestra primer first action class. La nueva
action class extenderá la superclase org.apache.struts.DispatchAction. Una Dispatch action no llama
al método execute pero si a otros métodos especificados por un parámetro. Cuando el usuario haga
clic en un enlace de edición (Edit Link) la dispatch action llamará al método Edit, cuando él haga
clic en un enlace para Agregar, la dispatch action llama al método create.
En Parameter agregamos el parámetro do. Este parámetro lo necesita la dispatch action class.
Agregue cuatro nuevos forwards. Uno para la página de edición, el segundo para la página que
agrega, donde se podrá agregar libros, el tercer forward para la página de préstamo y la cuarta para
redireccionar al usuaio al listado de libros.
El último forward es distinto a los otros. Se refiere a una action mapping existente y redirecciona al
usuario.
<html>
<head>
<title>Add a book</title>
</head>
<body>
<%-- create a html form --%>
<html:form action="bookEdit">
<%-- print out the form data --%>
<table border="1">
<tbody>
<tr>
<td>Author:</td>
<td><html:text property="author" /></td>
</tr>
<tr>
<td>Title:</td>
<td><html:text property="title" /></td>
</tr>
<tr>
<td>Available:</td>
<td><html:checkbox property="available" /></td>
</tr>
</tbody>
</table>
<%-- set the parameter for the dispatch action --%>
<html:hidden property="do" value="saveBook" />
<br>
<%-- submit and back button --%>
<html:button property="back"
onclick="history.back();">
Back
</html:button>
<html:submit>Save</html:submit>
</html:form>
</body>
</html>
<html>
<head>
<title>Show customers</title>
</head>
<body>
<html:form action="bookEdit">
<table border="1">
<tbody>
<%-- set the header --%>
<tr>
<td>Last name</td>
<td>Name</td>
<td>Borrow</td>
</tr>
/* lalinuna.de 04.11.2004
* get id of the book from request
*/
Integer id = Integer.valueOf(request.getParameter("id"));
// [laliluna] 28.11.2004 get business logic
LibraryManager libraryManager = new LibraryManager();
bookEditForm.setBook(libraryManager.getBookByPrimaryKey(id));
return mapping.findForward("showEdit");
}
/**
* loads a book from the db and forwards to the borrow book form
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward borrowBook(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
System.out.println("borrowBook");
/* lalinuna.de 04.11.2004
* get id of the book from request
*/
Integer id = Integer.valueOf(request.getParameter("id"));
/* lalinuna.de 16.11.2004
* load the session facade for book and user
* get the book information and get all users
*/
LibraryManager libraryManager = new LibraryManager();
return mapping.findForward("showBorrow");
}
/**
* return a book from a customer
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward returnBook(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
System.out.println("returnBook");
/* lalinuna.de 04.11.2004
* get id of the book from request
*/
Integer id = Integer.valueOf(request.getParameter("id"));
libraryManager.returnBook(id);
return mapping.findForward("showList");
}
/**
* deletes a book from the database
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward deleteBook(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
System.out.println("deleteBook");
/* lalinuna.de 04.11.2004
* get id of the book from request
*/
Integer id = Integer.valueOf(request.getParameter("id"));
libraryManager.removeBookByPrimaryKey(id);
return mapping.findForward("showList");
}
/**
* forwards to the add book form
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward addBook(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
System.out.println("addBook");
return mapping.findForward("showAdd");
/**
* saves the borrow assigned in the form in the database
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward saveBorrow(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
BookEditForm bookEditForm = (BookEditForm) form;
return mapping.findForward("showList");
}
/**
* updates or creates the book in the database
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward saveBook(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response) {
BookEditForm bookEditForm = (BookEditForm) form;
El próximo paso es poner la acción que será llamada antes que su JSP se muestre. Haga los cambios
como se muestra debajo.
El último paso es crear el forwards la acción que redireccionará al JSP que muestra la lista de
clientes.
Por ahora, emos creado todos los archivos necesarios para nuestros casos de uso. El paso siguiente
es rellenarlos con contenido.
No necesitamos un método reset aquí, como el bean es usado solamente para pasar los datos de la
acción al JSP.
Edite la action class.
public class CustomerListAction extends Action
{
/**
* loads customers from the db and saves them in the request
* @param mapping
* @param form
* @param request
* @param response
* @return ActionForward
*/
public ActionForward execute(
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
{
CustomerListForm customerListForm = (CustomerListForm) form;
// [laliluna] 29.11.2004 get business logic
LibraryManager libraryManager = new LibraryManager();
customerListForm.setCustomers(libraryManager.getAllCustomers());
return mapping.findForward("showCustomerList");
}
}
Abra el archivo jsp customerList.jsp y cambie el contenido del archivo por esto.
<%@ page language="java"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-bean" prefix="bean"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html"%>
<%@ taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic"%>
<html>
<head>
<title>JSP for customerListForm form</title>
</head>
<body>
<table border="1">
<tbody>
<%-- set the header --%>
<logic:present name="customerListForm" property="customers">
<tr>
<td>Name</td>
<td>Last name</td>
<td>Age</td>
<td></td>
<td></td>
</tr>
<%-- start with an iterate over the collection books --%>
<logic:iterate name="customerListForm" property="customers" id="customer">
<tr>
<%-- book informations --%>
<td><bean:write name="customer" property="name" /></td>
<td><bean:write name="customer" property="lastname" /></td>
<td><bean:write name="customer" property="age" /></td>
<%-- edit and delete link for each customer --%>
<td><html:link action="customerEdit.do?do=editCustomer"
paramName="customer"
paramProperty="id"
paramId="id">Edit</html:link>
</td>
<td><html:link action="customerEdit.do?do=deleteCustomer"
paramName="customer"
paramProperty="id"
paramId="id">Delete</html:link>
</td>
</tr>
</logic:iterate>
<%-- end interate --%>
</logic:present>
<%-- if customers cannot be found display a text --%>
<logic:notPresent name="customerListForm" property="customers">
<tr>
<td colspan="5">No customers found.</td>
</tr>
</logic:notPresent>
</tbody>
</table>
<br>
<%-- add and back to menu button --%>
<html:button property="add"
onclick="location.href='customerEdit.do?do=addCustomer'">Add a new customer
</html:button>
<html:button property="back"
onclick="location.href='default.do'">Back to menu
</html:button>
</body>
</html>
}
/* (non-Javadoc)
* @see java.lang.Object#equals(java.lang.Object)
*/
public boolean equals(Object arg0) {
return customer.equals(arg0);
}
/**
* @return
*/
public Integer getAge() {
return customer.getAge();
}
/**
* @return
*/
public Integer getId() {
return customer.getId();
}
/**
* @return
*/
public String getLastname() {
return customer.getLastname();
}
/**
* @return
*/
public String getName() {
return customer.getName();
}
/* (non-Javadoc)
* @see java.lang.Object#hashCode()
*/
public int hashCode() {
return customer.hashCode();
}
/**
* @param age
*/
public void setAge(Integer age) {
customer.setAge(age);
}
/**
* @param id
*/
public void setId(Integer id) {
customer.setId(id);
}
/**
* @param lastname
*/
public void setLastname(String lastname) {
customer.setLastname(lastname);
}
/**
* @param name
*/
public void setName(String name) {
customer.setName(name);
}
/* (non-Javadoc)
* @see java.lang.Object#toString()
*/
public String toString() {
return customer.toString();
}
}
Edición del código de la action class
Integer id = Integer.valueOf(request.getParameter("id"));
LibraryManager libraryManager = new LibraryManager();
customerEditForm.setCustomer(libraryManager.getCustomerByPrimaryKey(id));
return mapping.findForward("editCustomer");
}
/**
* saves the customers and forwards to the list
* @param mapping
* @param form
* @param request
* @param response
* @return
*/
public ActionForward saveCustomer(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
CustomerEditForm customerEditForm = (CustomerEditForm) form;
LibraryManager libraryManager = new LibraryManager();
libraryManager.saveCustomer(customerEditForm.getCustomer());
return mapping.findForward("customerList");
}
Y finalmente cuando hace clic en eliminar, el siguiente método es llamado.
/**
* deletes the customers and forwards to the list
* @param mapping
* @param form
* @param request
* @param response
* @return
*/
public ActionForward deleteCustomer(ActionMapping mapping, ActionForm form,
HttpServletRequest request, HttpServletResponse response) {
CustomerEditForm customerEditForm = (CustomerEditForm) form;
LibraryManager libraryManager = new LibraryManager();
libraryManager.removeCustomerByPrimaryKey(customerEditForm.getCustomer().
getId());
return mapping.findForward("customerList");
}
Cuando la lógica del negocio se mantiene separada, el código de acción es siempre mucho más
corto y fácil de leer.
<html>
<head>
<title>JSP for customerEditForm form</title>
</head>
<body>
<html:form action="/customerEdit">
<html:hidden property="id"/>
<html:hidden property="do" value="saveCustomer"/>
Name: <html:text property="name"/><br/>
Last name <html:text property="lastname"/><br/>
Age <html:text property="age"/><br/>
<html:submit/><html:cancel/>
</html:form>
</body>
</html>
Test the applications
Start the jboss and deploy the project as package archiv.