|
Esta tutorial explicará los primeros pasos usando los
struts de Apache como framework para internet y eclipse como ambiente
de desarrollo. Crearemos un ejemplo simple de una aplicaión
para biblioteca usando plugins libres como la consola Struts y JBOSS
IDE.
Información General
Autor :
Sebastian Hennebrüder
Sascha Wolski
http://www.laliluna.de/tutorials.html
Tutoriales para Struts, EJB, eclipse y xdoclet.
Traducción:
Sebastian Arechederreta
Dato :
Enero, 20 th 2005 Herramientas De Desarrollo
Eclipse 3.x
Consola struts
JBOSS IDE (al usar JBOSS)
Sysdeo plugin (al usar Tomcat)
Código fuente:
http://www.laliluna.de/assets/tutorials/first_steps_with_struts.zip
Uso del código fuente.
El código fuente no incluye ninguna de las bibliotecas solo
los fuentes. Cree un proyecto web, agregue las bibliotecas
manualmente según lo explicado en este tutorial. Luego
extraiga los códigos fuentes, que proporcionamos, a su
proyecto.
La versión pdf de este tutorial (en inglés).
http://www.laliluna.de/assets/tutorials/first_steps_with_struts_es.pdf
Primeros pasos usando struts y eclipse 1
Información general 1
Requisitos 1
Instalación de la consola struts 2
Crear un proyecto web 2
Agregando soporte struts 2
Crear una página de bienvenida por defecto 4
Global Action Forwards y Action Mapping 5
Caso de uso: lista de libros 6
Caso de uso: Agregar, editar y borrar datos 15
Cambios a la lista de libros JSP 21
Prueba de la aplicación 22
Requisitos
Requerimientos para la instalación de JBOSS IDE, cuando
está utilizando JBOSS como servidor de aplicación. Una
tutorial de cómo crear y distribuir proyectos web con la JBOSS
IDE se puede encontrar aquí.
http://www.laliluna.de/webprojects-eclipse-jbosside-tutorial-en.html
Cuando se utiliza Tomcat, se puede utilizar el plugin de eclipse
http://www.sysdeo.com/eclipse/tomcatPlugin.html
como alternativa.
Instalación de la consola struts
Descargue los fuentes del website
http://www.jamesholmes.com/struts/console/
Descomprima el archivo y copie el directorio
com.jamesholmes.console.struts
a la carpeta de plugins de eclipse
Inicie eclipse y eso es todo.
Cree un proyecto web
La creación de un proyecto web con la IDE JBOSS se explica
en este tutorial
http://www.laliluna.de/webprojects-eclipse-jbosside-tutorial-en.html
el cuál fue mencionado en los requisitos. Desarrolle un
proyecto web como se explica allí.
Agregando soporte struts
Por ahora el proyecto es un proyecto normal de JEE, así que
necesitamos agregar las capacidades de los struts (bibliotecas,
archivos xml...). La manera más fácil es copiar un
poryecto struts en blanco en su proyecto.
Usted puede descargar un proyecto en blanco aquí.
http://www.laliluna.de/assets/tutorials/struts-blanc-project-1.2.zip
Descomprima el contenido del proyecto struts en blanco en el
espacio de trabajo de eclipse donde esta su proyecto.
Actualice el proyecto en el explorador del paquete presionando el
botón derecho del ratón - > el comando "refresh"
(Actualizar).
Su proyecto ahora se parece el siguiente.

Agregando las bibliotecas de struts
Ahora usted debe agregar las bibliotecas a su classpath. Botón
derecho sobre el proyecto y seleccione "properties" en el
menú de contexto.
Seleccione "Java Build Path" y "Add jars" en
la lengüeta de las bibliotecas.

 Usted
encontrará los archivos JAR en Project > WebRoot >
WEB-INF > lib . Utilice SHIFT para seleccionar múltiples
archivos jar.
Las bibliotecas de struts ahora
aparecerán en el explorador de paquete.

Cree una página de bienvenida por defecto
Bien, ahora deseamos crear una página por defecto. Botón
derecho (sí otra vez) en la carpeta WebRoot en el proyecto y
elija ?New? > JSP. Si usted no puede encontrar esta opción,
seleccione "other" y entonces JSP.
¡Usted debe tener instalado el JBOSS IDE!
Cree un JSP nuevo en el directorio WebRoot.

Usted encontrará el archivo index.jsp en la carpeta WebRoot
del proyecto. Debemos agregar las bibliotecas de etiqueta de struts a
nuestro JSP. Necesitamos bibliotecas de etiqueta (Tag Libraries)para
utilizar etiquetas de struts en un JSP. En este caso necesitamos
solamente la biblioteca de la lengüeta de la lógica de
struts. Cambie su contenido de JSP al siguiente.
<% @page contentType="text/html" %> <% @page language="Java" %> <% @taglib uri="http://jakarta.apache.org/struts/tags-logic" prefix="logic" %>
<logic:forward name="welcome"/>
La etiqueta logic:forward hace que Struts busque una redirección
(forward) en el archivo de configuración. Cuando no se puede
encontrar esta redirección occure una excepción.
Explicamos la action forward en el capítulo siguiente.
Cree un segundo JSP index.jsp en el directorio/WebRoot/jsp. Cambie
el JSP a lo siguiente:
<%@ page language="java"%> <%@ taglib uri="http://jakarta.apache.org/struts/tags-html" prefix="html" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html:html locale="true"> <head> <html:base /> <title>index.jsp</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="Esta es mi página"> </head> <body> Bienvenido! <br> <html:link action="bookList">Mostrar lista de libros</html:link> </body> </html:html>
Global Action Forwards y Action Mappings
¿Qué es una acción de redirección
(action forward)? Una acción
de redirección se puede utilizar para redireccionar a un jsp o
a un mapa de acción (action mapping). Hay dos acciones de
redirección diferentes. La redirección de acción
global y la de acción local. Usted puede tener acceso a una
redirección de acción global en cada jsp o en la clase
Action. Una redirección de acción local solamente puede
ser accedida por la clase asignada.
¿Qué es un mapa de acción (action
mapping)? El mapa de acción
es el corazón de struts. Maneja todas las acciones entre la
aplicación y el usuario. Usted puede definir qué acción
será ejecutada creando un mapa de acción (Action
Mapping).
El diagrama le muestra, cómo el
servidor de aplicación maneja la petición del index.jsp
o una acción no mapeada.

En el primer paso creamos una
nueva acción mapeada. Abra el archivo struts-config.xml de la
configuración de struts, que está situado en
WebRoot/WEB-INF. Se abre la consola de struts. (si no, botón
derecho sobre struts-config.xml y seleccióne "open with".
Marque Action Mapping y y seleccione
Add.
Escriba /default como Path y
seleccione el tipo de acción Forward. Usaremos como página
de bienvenida /jsp/default.jsp

En el paso siguiente crearemos la
acción global forward. Marque "Global Forwards",
seleccione "add".
Elija /default.do como Path, que es la
acción que especificamos antes.
![]()
Caso de uso: Listar los libros
Una acción de struts siempre
hace una cierta lógica del negocio y guarda el resultado en
una clase del tipo ActionForm. Los datos del ActionForm se pueden
mostrar en un JSP.
Nuestra Action leerá datos de
una base de datos, guardandolos en ActionForm. El JSP exhibirá
nuestros datos.
Crear una clase "Libro" (?Book?)
Cree una clase nueva ?Libro? en el
paquete de.laliluna.tutorial.library.

La clase Libro representa un libro con
las propiedades: id, autor, título y disponibilidad.(id,
author, title y available) Cree cuatro variables.

Cree un getter y un setter para cada
una de las variables. Botón derecho en su clase, Source >
Generate Getters and Setters

Elija seleccionar todo (Select All) y
Last Method en Insertion Point

Agregue dos constructores a la clase
para fijar las propiedades en la inicialización de la clase.
// Contructor public Book(){ } // Contructor para propiedades iniciales public Book(long id, String author, String title, boolean available) { this.id = id; this.author = author; this.title = title; this.available = available; }
¡Eso es todo para nuestra clase libro!
Crear un form bean, action form y jsp
Cree una nueva sub clase de
ActionForm. El ActionForm contendrá nuestros libros para
exhibirlos en el JSP.

Abra struts-config.xml y agregue un
nuevo form bean con la consola de struts. El tipo es nuestra última
clase creada.

Cambie el código fuente de la clase action form.
Abra el archivo BookListForm.java y
cambie el código fuente:
public class BookListForm extends ActionForm { private Collection books; /* lalinuna.de 02.11.2004 * obtiene la collection de libros */ public Collection getBooks() { return books; } /* lalinuna.de 02.11.2004 * establece la collection de libros */ public void setBooks(Collection books) { this.books = books; } /* lalinuna.de 02.11.2004 * limpia la collection de libros */ public void reset(ActionMapping arg0, HttpServletRequest arg1) { books = new ArrayList(); } }
En nuestra clase hemos definido cada
vez una colección de libros y los métodos de acceso
(getters y setters).El método reset es llamado por struts cada
vez que un formulario es inicializado. Cuando su estructura es
requerida, éste es en cada petición.
Crear un Action Mapping y una Action Class.
Cree una clase BookListAction. Esta
clase carga los libros de la base de datos y los guarda en
BookListForm.

Cambie el código fuente de la clase Action.
Abra la clase bookListAction e
implemente el método execute desde la super clase
ActionForm. La llamada siguiente mapping.findForward("showList")
busca un forward con el nombre "showList" en la declaración
del Action Mapping el declaración y se redirecciona.
/** * Method execute * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward execute( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { BookListForm bookListForm = (BookListForm) form; /* lalinuna.de 03.11.2004 * inicia la clase SimulateDB y pone algunos datos */ SimulateDB simulateDB = new SimulateDB(); bookListForm.setBooks(simulateDB.getAllBooks(request.getSession())); return mapping.findForward("showList"); }
Clase SimulateDB
No utilizaremos una base de datos
verdadera en este tutorial sino una simulación de la base de
datos. Copie el archivo SimulateDB.java del código fuente que
proporcionamos como una descarga arriba del paquete
de.laliluna.tutorial.library.

Configuración struts para la lista de libros
Cree una nueva Action Mapping con la
consola de struts. La ruta debe comenzar con un /, el tipo es la
acción que acabamos de crear.

Marque en Action Mapping en la consola
Struts para acceder a la configuración avanzada.

Cree un Forward pata la Action Mapping
del JSP con el nombre showList

Crear la lista de libros JSP
Cree un nuevo JSP en la carpeta /jsp/
, nombrelo bookList.jsp .
<%@ 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>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> </td> <td> </td> </tr> <%-- check if book exists and display message or iterate over books --%> <logic:empty name="bookListForm" property="books"> <tr> <td colspan="5">No books available</td> </tr> </logic:empty> <logic:notEmpty name="bookListForm" property="books"> <logic:iterate name="bookListForm" property="books" id="book"> <tr> <%-- print out the 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> <%-- print out the edit and delete link for each book --%> <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> </logic:notEmpty> <%-- end interate --%> </tbody> </table> </body> </html>
La marca <logic:iterate> recorre
la colección de libros del form bean bookListForm Con la
marca <logic:iterate> se tiene acceso a las propiedades de un
libro. La marca <bean:write> muestra la propiedad (author,
title) de la posición actual. <html:checkbox> crea
una casilla de verificación.
Esto es producción fuuuhh,
tenemos nuestro form Bean con una Action Form Class, nuestro Action
Mapping con su Action Class y JSP, y los servicios necesarios
activos.
Muy bien. Tenemos que crear un action
class que gaurde los datos en un action form. Para mostrar la lista
de libros hemos creado un JSP que utiliza los datos en action form.
Fácil, no?.
Si quiere puede hacer una prueba de la
aplicación ahora. Mire al final del tutorial como probarla.
Caso de uso: Agregar, editar y borrar datos
En la sección siguiente
agregamos las funcionalidades de Agregar, Editar y Borrar datos. El
proceso es el mismo:
Action
ActionForm
Configuración Struts
 Nuevo
form bean
Cree una nueva clase como action form
en el paquete de.laliluna.tutorial.library.form . Denominelo
BookEditForm.
Agregue una nueva instancia de libro
(Book).
Book book = new Book();
Genere los getters y
setters. Luego herede todos los métodos de la clase Book.

![]()
El código fuente debería
ser como este:
public class BookEditForm extends ActionForm { Book book = new Book(); public Book getBook() { return book; } public void setBook(Book book) { this.book = book; } public boolean equals(Object arg0) { return book.equals(arg0); } public String getAuthor() { return book.getAuthor(); } public long getId() { return book.getId(); } public String getTitle() { return book.getTitle(); } public int hashCode() { return book.hashCode(); } public boolean isAvailable() { return book.isAvailable(); } public void setAuthor(String author) { book.setAuthor(author); } public void setAvailable(boolean available) { book.setAvailable(available); } public void setId(long id) { book.setId(id); } public void setTitle(String title) { book.setTitle(title); } public String toString() { return book.toString(); } }
Ahora podemos acceder a los atributos
de libro en el action form.
Crear la action class
Cree una nueva clase. Esta vez la
clase no es una sub clase de Action pero sí de
org.apache.struts.DispatchAction.
Un DispatchAction no ejecuta métodos
pero puede tener diferentes métodos dependiendo del parámetro.
Con el parámetro podemos decidir si el método llamado
es crear/editar/borrar.

Código fuente de la clase DispatchAction
Abra el archivo bookEditAction.java.
Agregue los métodos:
/** * Method editBook * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward editBook( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { BookEditForm bookEditForm = (BookEditForm) form; /* lalinuna.de 04.11.2004 * obtiene el id del libro de la solicitud */ long id = Long.parseLong(request.getParameter("id")); /* lalinuna.de 04.11.2004 * inicia la clase SimulateDB y obtiene un libro por id */ SimulateDB simulateDB = new SimulateDB(); bookEditForm.setBook(simulateDB.loadBookById(id, request.getSession())); return mapping.findForward("showEdit"); }
El método editBook obtiene el parámetro id de la
solicitud y lee el libro según el id desde la base de datos
simulada. El forward showEdit se refiere a la página
bookEdit.jsp
/** * Method deleteBook * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward deleteBook( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { BookEditForm bookEditForm = (BookEditForm) form; /* lalinuna.de 04.11.2004 * obtiene el id del libro de la solicitud */ long id = Long.parseLong(request.getParameter("id")); /* lalinuna.de 04.11.2004 * inicia la clase SimulateDB y borra un libro según el id */ SimulateDB simulateDB = new SimulateDB(); simulateDB.deleteBookById(id, request.getSession()); return mapping.findForward("showList"); }
El método deleteBook obtiene el id de la solicitud y elimina
el libro de la base de datos simulada. El forward showList actualiza
la lista de libros con la página bookList.jsp
/** * Method addBook * @param mapping * @param form * @param request * @param response * @return ActionForward */ public ActionForward addBook( ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { BookEditForm bookEditForm = (BookEditForm) form; return mapping.findForward("showAdd"); }
El método addBook se refiere a la página bookAdd.jsp
/** * Method saveBook * @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; /* lalinuna.de 04.11.2004 * inicia la clase SimulateDB y obtiene los datos según id */ SimulateDB simulateDB = new SimulateDB(); simulateDB.saveToDB(bookEditForm.getBook(), request.getSession()); return mapping.findForward("showList"); }
El último método obtiene el libro del form bean
bookEditForm y lo guarda en la base de datos simulada. Luego la
aplicación muestra la lista de libros.
Configuración Struts
Cree un nuevo form bean con la consola
struts.

Cree un nuevo action mapping. Como
parámetro especifique do. Este parámetro es necesario
para el DispatchAction.

Cambie el Action.

Cree tres forwards en la lengüeta
?forward tab?. Uno para el JSP que edita, otro para el JSP que
agrega y otro para el que muestra la lista de libros.
El último forward no irá
a ningun JSP pero sí a otra acción.

Cree un JSP llamado bookAdd.jsp en la
carpeta /WebRoot/jsp. El forward showAdd apuntará a esta
página.
Cambie el código fuente del JSP
Abra el archivo bookAdd.jsp y agregue
el siguiente código.
<%@ 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>Agregar un libro</title> </head> <body> <%-- crear un formulario html --%> <html:form action="bookEdit"> <%-- Mostrar los datos del formulario --%> <table border="1"> <tr> <td>Autor:</td> <td><html:text property="author" /></td> </tr> <tr> <td>Título:</td> <td><html:text property="title" /></td> </tr> <tr> <td>Disponible:</td> <td><html:checkbox property="available" /></td> </tr> <tr> <td colspan="2"> <html:submit>Guardar</html:submit> </td> </tr> </table> <%-- fijar el parámetro para dispatch action --%> <html:hidden property="do" value="saveBook" /> </html:form> </body> </html>
La etiqueta <html:form> crea un
nuevo formulario HTML y se refiere con el parámetro
action=?bookEdit? al action mapping. La etiqueta <html:text>
crea un campo de texto con la propiedad autor del
libro. <html:hidden> es un campo oculto con el nombre do.
Necesitamos este campo oculto, porque le dice a la clase dispatch
action que método será llamado.
Abra el archivo bookEdit.jsp. Puede
usar el código del archivo bookAdd.jsp y cambiar las
siguientes líneas.
<title>Editar un libro</title>
Agregue la siguiente línea
<html:hidden property="do" value="saveBook" />
<%-- Campo oculto que contiene el id del libro --%> <html:hidden property="id" />
Cambios a la lista de libros JSP
Abra el archivo bookList.jsp y cambie el código fuente:
<%@ 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>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> </td> <td> </td> </tr> <%-- check if book exists and display message or iterate over books --%> <logic:empty name="bookListForm" property="books"> <tr> <td colspan="5">No books available</td> </tr> </logic:empty> <logic:notEmpty name="bookListForm" property="books"> <logic:iterate name="bookListForm" property="books" id="book"> <tr> <%-- print out the 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> <%-- print out the edit and delete link for each book --%> <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> </logic:notEmpty>
<%-- print out the add link --%> <tr> <td colspan="5"><html:link action="bookEdit.do?do=addBook">Add a new book</html:link> </td> </tr> <%-- end interate --%> </tbody> </table> </body> </html>
Ahora, hemos finalizado toda la
codificación y podemos probar la aplicación.
Prueba de la aplicación
Inicie jboss y convierta el proyecto a
un archivo paquete. (Esto está explicado en el tutorial JBOSS
IDE, mencionado anteriormente).
Llame al proyecto en su navegador
favorito:
http://localhost:8080/LibraryWeb/


Felicitaciones, estas muy cerca de ser
un experto en struts. ;-)
|