Si vis pacem para bellum

iReport sobre Struts – Paso 1 : Preparando Struts

Sobre el código del ejemplo anterior añadiremos una nueva funcionalidad para permitir que los usuarios identificados en la aplicación puedan introducir unos datos y generar un informe en PDF (invocando un método de negocio de momento vacío).

Haremos un informe meteorológico que constará de tres campos introducidos por el usuario :

  • Ciudad sobre la que se realiza el informe
  • Temperatura mínima del día actual
  • Temperatura máxima del día actual

También añadiremos nosotros automáticamente la fecha del informe, que será la fecha de hoy.

Para ello necesitaremos implementar una nueva "rama" :

  • jsp/generarInforme.jsp – Una jsp de entrada de la que recoger el formulario introducido por el usuario.
  • es.lycka.holamundoStruts138Jasper.model.Informe – Un objeto de modelo que represente el informe.
  • es.lycka.holamundoStruts138Jasper.form.InformeForm – Un actionForm asociado
  • es.lycka.holamundoStruts138Jasper.action.InformeAction – Un action que atienda la petición
  • es.lycka.holamundoStruts138Jasper.negocio.InformeBO – Una clase de negocio que nos devuelva el informe en formato PDF
  • Configurar Struts para que todo esto funcione

Me habré dejado algo en el tintero ? Probemos.

Vista

En el jsp que ven los usuarios identificados (jsp/indexIdentificado.jsp) añadimos un enlace a nuestra nueva funcionalidad: 

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

    pageEncoding="ISO-8859-1"%>

<%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

      <title>Zona Identificada</title>

</head>

<body>

      <h2>Bienvenido a la zona de administración</h2>

      <p>Su identificador de usuario es : <bean:write scope="session" name="usuario" property="identificador" /></p>

      <p>Usted puede realizar las siguientes operaciones:</p>

      <ul>

            <li><html:link href="jsp/generarInforme.jsp">Generar Informe</html:link></li>

      </ul>

</body>

</html>

Se vería así :

 

 

 

Y ahora tenemos que implementar una nueva página JSP (jsp/generarInforme.jsp) que permita al usuario introducir unos datos y enviarlos al servidor para que genere el informe.

<%@ page language="java" contentType="text/html; charset=ISO-8859-1"

    pageEncoding="ISO-8859-1"%>

<%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

      <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">

      <title>Generar Informe</title>

      <script>

      function enviar (){

            document.informeForm.submit();

      }

      </script>

</head>

<body>

<h2>Generación de Informe</h2>

<html:form action="generarInforme">

<div>

      <span style="text-aling:rigth">Ciudad</span>

      <span>&nbsp;&nbsp;&nbsp;<html:text property="informe.ciudad" /></span>

</div>

<div>

      <span style="text-aling:rigth">Temperatura Máxima Hoy</span>

      <span>&nbsp;&nbsp;&nbsp;<html:text property="informe.temperaturaMaxima" /></span>

</div>

<div>

      <span style="text-aling:rigth">Temperatura Mínima Hoy</span>

      <span>&nbsp;&nbsp;&nbsp;<html:text property="informe.temperaturaMinima" /></span>

</div>

<div>&nbsp;</div>

<div>

      <input type="button" value="Generar Informe" onclick="javascript:enviar();" />

</div>

</html:form>

</body>

</html>

El resultado sería algo parecido a :

 

 

 

Modelo

Necesitamos crear un bean que modele nuestro informe, es.lycka.holamundoStruts138Jasper.model.Informe :

package es.lycka.holamundoStruts138Jasper.model;

public class Informe {

      private String ciudad;

      private String temperaturaMaxima;

      private String temperaturaMinima;

      public String getCiudad() {

            return ciudad;

      }

      public void setCiudad(String ciudad) {

            this.ciudad = ciudad;

      }

      public String getTemperaturaMaxima() {

            return temperaturaMaxima;

      }

      public void setTemperaturaMaxima(String temperaturaMaxima) {

            this.temperaturaMaxima = temperaturaMaxima;

      }

      public String getTemperaturaMinima() {

            return temperaturaMinima;

      }

      public void setTemperaturaMinima(String temperaturaMinima) {

            this.temperaturaMinima = temperaturaMinima;

      }

}

Controlador

El formulario asociado (es.lycka.holamundoStruts138Jasper.form.InformeForm) es muy sencillo, sólo lleva un informe (objeto Informe) :

package es.lycka.holamundoStruts138Jasper.form;

import org.apache.struts.action.ActionForm;

import es.lycka.holamundoStruts138Jasper.model.Informe;

public class InformeForm extends ActionForm {

      private Informe informe = new Informe ();

      public Informe getInforme() {

            return informe;

      }

      public void setInforme(Informe informe) {

            this.informe = informe;

      }

}

La clase action que necesitamos (es.lycka.holamundoStruts138Jasper.action.InformeAction) no es muy complicada, así que vamos a introducir nostros una complicación. Sabemos que por defecto Struts ejecuta el método execute de nuestro action. Pero y si queremos tener varios métodos en el mismo action ? Por ejemplo si queremos asociar varias acciones al mismo tipo de objetos : listar Informes, obtener Informe, insertar Informe, actualizar Informe, borrar Informe…

Una solución sencilla es tener varios métodos en el mismo action y utilizar uno u otro según la configuración de la acción (en el struts-config.xml). Por eso crearemos el método:

package es.lycka.holamundoStruts138Jasper.action;

import java.io.ByteArrayOutputStream;

import java.io.IOException;

import javax.servlet.ServletOutputStream;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import org.apache.struts.action.Action;

import org.apache.struts.action.ActionForm;

import org.apache.struts.action.ActionForward;

import org.apache.struts.action.ActionMapping;

import es.lycka.holamundoStruts138Jasper.form.InformeForm;

import es.lycka.holamundoStruts138Jasper.negocio.InformeBO;

public class InformeAction extends Action {

      public ActionForward execute (ActionMapping mapping, ActionForm form,

                  HttpServletRequest request, HttpServletResponse response) {

            InformeForm informeForm = (InformeForm) form;

            String destino                           = "ERROR";

            try {

                  byte[] informePDF = InformeBO.generarInforme (informeForm.getInforme ());

                  mostrarInforme (informePDF, response);

            } catch (Exception e) {

                  e.printStackTrace();

                  request.setAttribute("mensaje", "Error interno. Por favor, inténtelo otra vez en unos minutos.");

            }

            return mapping.findForward(destino);

      }

}

Negocio

Creamos un objeto de negocio (es.lycka.holamundoStruts138Jasper.negocio.InformeBO) pero no implementamos todavía el método.

package es.lycka.holamundoStruts138Jasper.negocio;

import es.lycka.holamundoStruts138Jasper.model.Informe;

public class InformeBO {

      public static byte[] generarInforme (Informe informe) throws Exception {

            return null;

      }

}

Configurar todo esto

En la etiqueta <form-beans> declaramos nuestro nuevo formulario :

<form-bean name="informeForm" type="es.lycka.holamundoStruts138Jasper.form.InformeForm" />

Y en la etiqueta <action-mappings> declaramos la nueva acción. Utilizamos parameter para indicar qué método del action se ejecutará.

<action path="/generarInforme" type="es.lycka.holamundoStruts138Jasper.action.InformeAction"

      name="informeForm" scope="request" validate="false" parameter="generar">

      <forward name="SUCCESS" path="/jsp/indexIdentificado.jsp" />

      <forward name="ERROR" path="/jsp/indexIdentificado.jsp" />

</action>

Finalmente la estructura del proyecto quedaría así (pincha en la imagen para verla ampliada) :

 

2 Comentarios hasta el momento »

  1. Jorge Armando dijo

    20 de January del 2009 a las 8:23 pm

    Hola que tal.
    Primero que nada, excelente blog, me ha ayudado muchisimo en lo que se refiere a struts.

    Oye tengo una pregunta, podrias hacer o pasarme por mail algun ejemplo en struts de combos dependientes (Ejemplo: Pais – Ciudad).

    Por mas que lo intento no puedo hacer funcionar un ejemplo que estoy haciendo con el tag “optionsCollection”.

    Saludos.

  2. yoyoooyoy dijo

    21 de January del 2009 a las 10:26 am

    Hola Jorge Armando,

    no veas lo que se agradecen los piropos con lo que cuesta currarse esto ! muchas gracias !

    Este tipo de combos dependientes implica que el usuario seleccione una opción en un combo, se genera una llamada al servidor que devuelve los datos a pintar en el segundo combo. Esto significa que se recarga toda la página; para evitar esto y que sólo se recarge el combo secundario puedes utilizar AJAX.

    Tengo ganas de colgar un ejemplo de AJAX.

    Otra opción menos eficiente pero que te puede servir es que el servidor manda los datos del combo primario y todos los datos posibles del combo secundario. Por JavaScript puedes hacer que se pinte un combo u otro en el secundario. En un ejemplo Provincia – Municipio no sería una buena idea, pero a lo mejor sí en uno Comunidad Autónoma – Provincia.

    Esta semana estoy HIPERLIADO, ya ves que no saco tiempo para continuar con este ejemplo. Intentaré mandarte algo la semana que viene.

    Saludos

Comentarios RSS · TrackBack URI

Dejanos tu Comentario

Nombre: (Requerido)

E-Mail: (Requerido)

Sitio WEB:

Comentario:

Comenta