Sie sind auf Seite 1von 32

Primeros pasos usando struts y eclipse tutorial

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 aplicain para biblioteca usando plugins libres como la consola Struts y JBOSS IDE.

Informacin General
Autor : Sebastian Hennebrder Sascha Wolski http://www.laliluna.de/tutorials.html Tutoriales para Struts, EJB, eclipse y xdoclet. Traduccin: 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) Cdigo fuente: http://www.laliluna.de/assets/tutorials/first_steps_with_struts.zip

Uso del cdigo fuente. El cdigo fuente no incluye ninguna de las bibliotecas solo los fuentes. Cree un proyecto web, agregue las bibliotecas manualmente segn lo explicado en este tutorial. Luego extraiga los cdigos fuentes, que proporcionamos, a su proyecto. La versin pdf de este tutorial (en ingls). http://www.laliluna.de/assets/tutorials/first_steps_with_struts_es.pdf

Tabla de contenido Primeros pasos usando struts y eclipse 1 Informacin general 1

Requisitos 1 Instalacin de la consola struts 2 Crear un proyecto web 2 Agregando soporte struts 2 Crear una pgina 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 aplicacin 22

Requisitos
Requerimientos para la instalacin de JBOSS IDE, cuando est utilizando JBOSS como servidor de aplicacin. Una tutorial de cmo 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.

Instalacin 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 creacin de un proyecto web con la IDE JBOSS se explica en este tutorial http://www.laliluna.de/webprojects-eclipse-jbosside-tutorial-en.html

el cul 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 ms fcil 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 botn derecho del ratn - > 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. Botn derecho sobre el proyecto y seleccione "properties" en el men de contexto.

Seleccione "Java Build Path" y "Add jars" en la lengeta de las bibliotecas.

Usted encontrar los archivos JAR en Project > WebRoot > WEB-INF > lib . Utilice SHIFT para seleccionar mltiples archivos jar.

Las bibliotecas de struts ahora aparecern en el explorador de paquete.

Cree una pgina de bienvenida por defecto


Bien, ahora deseamos crear una pgina por defecto. Botn derecho (s otra vez) en la carpeta WebRoot en el proyecto y elija ?New? > JSP. Si usted no puede encontrar esta opcin, 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 lengeta de la lgica 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 redireccin (forward) en el archivo de configuracin. Cuando no se puede encontrar esta redireccin occure una excepcin. Explicamos la action forward en el captulo 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 pgina"> </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 accin de redireccin (action forward)? Una accin de redireccin se puede utilizar para redireccionar a un jsp o a un mapa de accin (action mapping). Hay dos acciones de redireccin diferentes. La redireccin de accin global y la de accin local. Usted puede tener acceso a una redireccin de accin global en cada jsp o en la clase Action. Una redireccin de accin local solamente puede ser accedida por la clase asignada.

Qu es un mapa de accin (action mapping)? El mapa de accin es el corazn de struts. Maneja todas las acciones entre la aplicacin y el usuario. Usted puede definir qu accin ser ejecutada creando un mapa de accin (Action Mapping). El diagrama le muestra, cmo el servidor de aplicacin maneja la peticin del index.jsp o una accin no mapeada.

En el primer paso creamos una nueva accin mapeada. Abra el archivo struts-config.xml de la configuracin de struts, que est situado en WebRoot/WEB-INF. Se abre la consola de struts. (si no, botn derecho sobre struts-config.xml y seleccine "open with".

Marque Action Mapping y y seleccione Add. Escriba /default como Path y seleccione el tipo de accin Forward. Usaremos como pgina de bienvenida /jsp/default.js

En el paso siguiente crearemos la accin global forward. Marque "Global Forwards", seleccione "add". Elija /default.do como Path, que es la accin que especificamos antes.

Caso de uso: Listar los libros

Una accin de struts siempre hace una cierta lgica 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, ttulo y disponibilidad.(id, author, title y available) Cree cuatro variables.

Cree un getter y un setter para cada una de las variables. Botn 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 inicializacin 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 cdigo fuente de la clase action form.


Abra el archivo BookListForm.java y cambie el cdigo 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 coleccin de libros y los mtodos de acceso (getters y setters).El mtodo reset es llamado por struts cada vez que un formulario es inicializado. Cuando su estructura es requerida, ste es en cada peticin.

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 cdigo fuente de la clase Action.


Abra la clase bookListAction e implemente el mtodo execute desde la super clase ActionForm. La llamada siguiente mapping.findForward("showList") busca un forward con el nombre "showList" en la declaracin del Action Mapping el declaracin 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 simulacin de la base de datos. Copie el archivo SimulateDB.java del cdigo fuente que proporcionamos como una descarga arriba del paquete de.laliluna.tutorial.library.

Configuracin 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 accin que acabamos de crear.

Marque en Action Mapping en la consola Struts para acceder a la configuracin 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>&nbsp;</td> <td>&nbsp;</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 coleccin 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 posicin actual. <html:checkbox> crea una casilla de verificacin.

Esto es produccin 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. Fcil, no?. Si quiere puede hacer una prueba de la aplicacin ahora. Mire al final del tutorial como probarla.

Caso de uso: Agregar, editar y borrar datos


En la seccin siguiente agregamos las funcionalidades de Agregar, Editar y Borrar datos. El proceso es el mismo:

Action ActionForm Configuracin 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 mtodos de la clase Book.

El cdigo fuente debera 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 mtodos pero puede tener diferentes mtodos dependiendo del parmetro. Con el parmetro podemos decidir si el mtodo llamado es crear/editar/borrar.

Cdigo fuente de la clase DispatchAction


Abra el archivo bookEditAction.java. Agregue los mtodos:
/** * 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 mtodo editBook obtiene el parmetro id de la solicitud y lee el libro segn el id desde la base de datos simulada. El forward showEdit se refiere a la pgina 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 segn el id */ SimulateDB simulateDB = new SimulateDB(); simulateDB.deleteBookById(id, request.getSession()); return mapping.findForward("showList"); }

El mtodo 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 pgina 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 mtodo addBook se refiere a la pgina 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 segn id */ SimulateDB simulateDB = new SimulateDB(); simulateDB.saveToDB(bookEditForm.getBook(), request.getSession()); } return mapping.findForward("showList");

El ltimo mtodo obtiene el libro del form bean bookEditForm y lo guarda en la base de datos simulada. Luego la aplicacin muestra la lista de libros.

Configuracin Struts
Cree un nuevo form bean con la consola struts.

Cree un nuevo action mapping. Como parmetro especifique do. Este parmetro es necesario para el DispatchAction.

Cambie el Action.

Cree tres forwards en la lengeta ?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 accin.

Cree un JSP llamado bookAdd.jsp en la carpeta /WebRoot/jsp. El forward showAdd apuntar a esta pgina.

Cambie el cdigo fuente del JSP


Abra el archivo bookAdd.jsp y agregue el siguiente cdigo.

<%@ 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>Ttulo:</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 parmetro 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 parmetro 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 mtodo ser llamado. Abra el archivo bookEdit.jsp. Puede usar el cdigo del archivo bookAdd.jsp y cambiar las siguientes lneas.
<title>Editar un libro</title>

Agregue la siguiente lnea <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 cdigo 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>&nbsp;</td> <td>&nbsp;</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 codificacin y podemos probar la aplicacin.

Prueba de la aplicacin
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. ;-)