SlideShare une entreprise Scribd logo
1  sur  15
Télécharger pour lire hors ligne
Manual Básico de Struts
Autor: Javier Antoniucci
    •   Introducción
             • ¿Qué es Struts?
             • ¿Cómo funciona esto en aplicaciones Web?
             • ¿Para qué sirve?
             • ¿Licencia?
             • ¿Y para qué este manual básico?
             • ¿Dónde encuentro más info?




Introducción
 ¿Qué es Struts?
Es un framework que implementa el patrón de arquitectura MVC en Java
Un framework es la extensión de un lenguaje mediante una o más jerarquías de clases que
implementan una funcionalidad y que (opcionalmente) pueden ser extendidas. El framework puede
involucrar TagLibraries.
El patrón de arquitectura MVC (Model-View-Controller) es un patrón que define la organización
independiente del Model (Objetos de Negocio), la View (interfaz con el usuario u otro sistema) y el
Controller (controlador del workflow de la aplicación: "si estoy aquí y me piden esto entonces hacer
tal cosa, si sale bien mostrar esto y sino lo aquello otro").
¿Cómo funciona esto en aplicaciones Web?




El navegador genera una solicitud que es atendida por el Controller (un Servlet especializado). El
mismo se encarga de analizar la solicitud, seguir la configuración que se le ha programado en su
XML y llamar al Action correspondiente pasándole los parámetros enviados. El Action instanciará
y/o utilizará los objetos de negocio para concretar la tarea. Según el resultado que retorne el Action,
el Controller derivará la generación de interfaz a una o más JSPs, las cuales podrán consultar los
objetos del Model a fines de realizar su tarea.

 ¿Para qué sirve?
Evidentemente, como todo framework intenta, simplifica notablemente la implementación de una
arquitectura según el patrón MVC. El mismo separa muy bien lo que es la gestión del workflow de
la aplicación, del modelo de objetos de negocio y de la generación de interfaz.
El controlador ya se encuentra implementado por Struts, aunque si fuera necesario se puede heredar
y ampliar o modificar, y el workflow de la aplicación se puede programar desde un archivo XML
Las acciones que se ejecutarán sobre el modelo de objetos de negocio se implementan basándose en
clases predefinidas por el framework y siguiendo el patrón Facade. Y la generación de interfaz se
soporta mediante un conjunto de Tags predefinidos por Struts cuyo objetivo es evitar el uso de
Scriplets (los trozos de código Java entre "<%" y "%>"), lo cual genera ventajas de mantenibilidad
y de perfomance (pooling de Tags, caching, etc).
Logísticamente, separa claramente el desarrollo de interfaz del workflow y lógica de negocio
permitiendo desarrollar ambas en paralelo o con personal especializado.
También es evidente que potencia la reutilización, soporte de múltiples interfaces de usuario (Html,
sHtml, Wml, Desktop applications, etc.) y de múltiples idiomas, localismos, etc.

 ¿Licencia?
Struts está disponible bajo la licencia "free-to-use-license" de la Apache Software Foundation (ver
http://www.apache.org/LICENSE-1.1)
¿Y para qué este manual básico?
Para simplificar el "first touch" y para explicar Struts desde el punto de vista del desarrollo de
aplicaciones Web.
No pretende ser un tutorial, una guía del usuario ni un manual de referencia. Ellos ya se han escrito
y están disponibles en las direcciones que se mencionan en la sección "¿Dónde encuentro más
info?"

 ¿Dónde encuentro más info?
    •   http://jakarta.apache.org/struts
    •   http://jakarta.apache.org/struts/userGuide
    •   http://jakarta.apache.org/struts/api/index.html
    •   http://jguru.com/faq/Struts
    •   http://jguru.com/forums/Struts
    •   http://jakarta.apache.org/struts/#Involved
Búsquedas en www.google.com poniendo como primera palabra Struts.
Manual Básico de Struts
Autor: Javier Antoniucci
    •   Model
           •    Intro
           •    Action Bean
           •    System State Beans
           •    BusinessLogic Beans
           •    Accediendo a BD



Model

               Intro
El Model comprende todos los Objetos de Negocio donde se implementa la lógica de negocio (el
"how it's done") y donde se debe soportar todos los requisitos funcionales del Sistema sin mezclarlo
con partes correspondientes al workflow (el "what to do") que corresponden al Controller.


               Action Bean
Generalmente, los Action Beans siempre realizan las siguientes acciones:
    1. Obtener los valores necesarios del Action Form, JavaBean, request, session o de
       donde sea.
    2. Llamar a los objetos de negocio del Model.
    3. Analizar los resultados, y según los mismos retornar el ActionForward correspondiente.
Veamos entonces un ejemplo de Action Bean:
public final class LogonAction extends Action {
 public ActionForward perform(ActionMapping mapping,
                              ActionForm form,
                              HttpServletRequest request,
                              HttpServletResponse response)
         throws IOException, ServletException {

 // Obteniendo atributos

  Locale locale = getLocale(request);
  MessageResources messages = getResources();
  User user = null;

 // Validando los parámetros

  ActionErrors errors = new ActionErrors();
  String username = ((LogonForm) form).getUsername();
  String password = ((LogonForm) form).getPassword();
  try {
   DataSource dataSource = servlet.findDataSource(null);
   Connection myConnection = dataSource.getConnection();
  } catch (SQLException e) {
   errors.add(ActionErrors.GLOBAL_ERROR, new
ActionError("error.database.missing"));
    saveErrors(request, errors);
    return (new ActionForward(mapping.getInput()));
  }
  UserFactory userFactory = new UserFactory(database);
  user = userFactory.getUser(username, password);
  if (user == null) {
    errors.add(ActionErrors.GLOBAL_ERROR, new
ActionError("error.password.mismatch"));
    saveErrors(request, errors);
    return (new ActionForward(mapping.getInput()));
  }

    // Guardando el usuario en la sesion

    HttpSession session = request.getSession();
    session.setAttribute(Constants.USER_KEY, user);

    // Eliminando el form bean obsoleto

    if (mapping.getAttribute() != null) {
      if ("request".equals(mapping.getScope()))
       request.removeAttribute(mapping.getAttribute());
      else
       session.removeAttribute(mapping.getAttribute());
    }
    // Pasando el control a la siguiente página
    return (mapping.findForward("success"));
 }
}



            System State Beans
Los System State Beans son el conjunto de objetos de negocio que representan el estado actual del
sistema, por ejemplo: el carrito de la compra que el usuario va modificando a lo largo de su
interacción con la aplicación. Estos objetos de negocio serán típicamente JavaBeans o EJBs de los
que se guardará referencia en la sesión del usuario, que serán modificados desde los Action y que
serán consultados desde las JSPs.
Esta clase de objetos no debiera tener ningún conocimiento de la View.


            BusinessLogic Beans
Los objetos de negocio son los que implementan la lógica de negocio, el cómo hacer las cosas y su
propia persistencia. Estos objetos de negocio no debiera tener ningún conocimiento de la View o el
Controller de forma que debieran ser perfectamente reutilizables para implementar soporte a
distintas interfaces y hasta para incluirse en nuevas aplicaciones.


            Accediendo a BD
Con Struts se puede definir un datasource para una aplicación desde el struts-config.xml (más
información en la sección "The Action Mappings Configuration File" del "Struts User Manual").
Este datasource nos permite obtener una connection desde un Action y desde allí utilizarlo o pasarlo
al Model. Muy práctico.
Este es un ejemplo de acceso a una conexión desde un Action:
public ActionForward perform(ActionMapping mapping,
            ActionForm form,
            HttpServletRequest request,
            HttpServletResponse response) {

 javax.sql.DataSource dataSource;
 java.sql.Connection myConnection;
 ...
 try {
   dataSource = servlet.findDataSource(null);
   myConnection = dataSource.getConnection();
   ...
 } catch (SQLException sqle) {
   getServlet().log("Connection.process", sqle);
 } finally {
   ...
   try {
     myConnection.close();
   } catch (SQLException e) {
     getServlet().log("Connection.close", e);
   }
 }
}
Manual Básico de Struts
Autor: Javier Antoniucci
    •   View
           •    Intro
           •    Internacionalización
           •    Forms
           •    Tags



View

               Intro
La View comprende las JSP (principalmente) y los servlets involucrados en la generación de la
interfaz de usuario o con otros Sistemas. Struts provee soporte para construir aplicaciones multi-
idioma, interacción con formularios y otras utilidades mediante la utilización de Tags especiales
(TagLibraries).


               Internacionalización
Lo podemos abreviar en la siguiente receta:
    1. Crear un archivo de texto (ej: MiAplicacion.properties) en el directorio donde se encuentren
       las clases de la aplicación (ej: d:comempresaaplicacion) donde se contengan las claves y
       valores con el formato clave.subclave=texto de los textos que pertenezcan al idioma
       principal. Ejemplo:
        ...
        application.title= Demo de Struts en APLICACION
        index.header=Bienvenido a la Demo de Struts en APLICACION
        ...

    2. Para cada idioma alternativo se creará un archivo nuevo que se llame igual pero que termine
       en "_xx.properties" siendo xx el código ISO de idioma (ej: MiAplicación_en.properties).
    3. En struts-config.xml se debe configurar el Tag /servlet/init-param/param-name application
       y ponerle como param-value la localización del archivo con el idioma principal. Ejemplo:
        <servlet>
            <servlet-name>action</servlet-name>
            ...
            <init-param>
              <param-name>application</param-name>
              <param-value>com.empresa.aplicacion.MiAplicacion</param-value>
            </init-param>
            ...

    4. En web.xml deberemos inclur:
        <web-app>
          ...
          <taglib>
            <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
<taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
         </taglib>
         ...
       </web-app>

    5. En las JSPs donde utilicemos la internacionalización deberemos incluir al comienzo:
       ...
       <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
       ...

       para declarar que utilizaremos la TagLibrary struts-bean con el prefijo bean y definida
       en /WEB-INF/struts-bean.tld
    6. Y finalmente, utilizaremos el Tag <bean:message key="clave.subclave"/>
       donde clave y subclave corresponden al texto por el que se reemplazará según el idioma del
       usuario. Ejemplo
       ...
       <TITLE><bean:message key="application.title"/></TITLE>
       ...

Por defecto Struts asigna a cada usuario el idioma principal de la aplicación. Si se utiliza el tag
<html:html locale="true"> (reemplaza a "<html>" y debe cerrarse con
"</html:html>") entonces se utilizará el primero de los idiomas soportados por la aplicación
que se encuentre en el header "Accept-Language" enviado por su navegador. Pero si se desea
proponerle al usuario una lista de idiomas entonces éste podrá cambiarse mediante
session.setAttribute( Action.LOCALE_KEY, new
java.util.Locale(country, language)) donde country y language serán el string del
país e idioma a establecer.
Además de texto podran incluirse variables (al igual que se hace en los println) y hasta formato de
datos. Para más información ver la documentación oficial de Sun disponible en
http://java.sun.com/j2se/1.3/docs/guide/intl/


            Forms
Una de las tareas que durante el desarrollo de una aplicación insume mucho trabajo (aunque en
realidad no lo merezcan) es la interacción con formularios, ya sea para editar u obtener nueva
información. Las comprobaciones, la gestión de errores, el volver a presentarle el mismo form al
usuario con los valores que puso y los mensajes de error y un largo etcétera están soportadas por
Struts a fines de hacernos la vida un poco más fácil.
La idea es la siguiente: todo el trabajo de comprobaciones y generación de mensajes de error se
implementa en los ActionForm y todo el trabajo de generación de interfaz en la/s JSP.
Veamos la receta:
    1. Crear el ActionForm (ver la sección Model / ActionForm Beans)
    2. Crear la página JSP del formulario utilizando los Tags que provee Struts (ver la sección
       View / Tags). Ejemplo:
       ...
       <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %>
       <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
       ...
       <html:html>
       ...
           <html:form action="/logon" focus="username">
...
             <h1><bean:message key="logon.header"/></h1>
             <html:form action="/logon" focus="username">
             <h5><html:errors/></h5>
             <h3><bean:message key="logon.mainText"/></h3>
             <p><bean:message key="logon.username"/>
                   <html:text property="username" size="16" maxlength="16"/></p>
             <p><bean:message key="logon.password"/>
                   <html:password property="password" size="16" maxlength="16"
       redisplay=false/></p>
             <p><html:submit property="submit" value="Submit"/></p>
             <p><html:reset/></p>
       ...
           </html:form>
       ...
       </html:html>

    3. Declarar el ActionForm en struts-config.xml agregando en /struts-config/form-beans el tag
       <form-bean name="nombreForm" type="paquete.clase"/> y en la
       declaración del Action (ver la sección Controller / Action Beans) agregar los atributos
       name="nombreForm", scope="(request ó session)", e
       input="paginaForm.jsp". Ejemplo:
       <struts-config>
         ...
         <form-beans>
         ...
          <form-bean name="logonForm" type="com.empresa.aplicacion.LogonForm"/>
         ...
         </form-beans>
         ...
         <action-mappings>
         ...
          <action path="/logon" type="com.empresa.aplicacion.LogonAction"
       name="logonForm"
                       scope="request" input="/logon.jsp">
           ...
          </action>
          ...
         <action-mappings>
         ...
       </struts-config>



             Tags
Básicamente, un Tag de JSP consiste en un Tag con formato <prefijoTagLib:nombreTag
atributo=valor ... > que cuando la JSP se compila es sustituído por una llamada a la clase
TagHandler que se encarga de resolver su funcionalidad.
El TagHandler extiende BodyTagSupport o TagSupport (según si es un tag que tiene body),
que implementa su funcionalidad en los métodos doStartTag(),
doEndTag(),doInitBody(), doAfterBody() (los dos últimos sólo en las que extienden
BodyTagSupport), además de los getters y setters correspondientes a sus atributos. Esta clase se
define en un Tag Library Definition (archivo xml con extensión TLD donde se define el nombre del
tag, la clase TagHandler que lo atiende, la definición de sus atributos, si tiene body, etc.) que a su
vez se debe declarar en el web.xml (dentro de <web-app> se pone <taglib> <taglib-uri>
nombreTagLib </taglib-uri> <taglib-
location>/directorios/nombreArchivo.tld </taglib-location>
</taglib>) y en la JSP donde se utilizará (<%@ taglib uri="nobreTagLib"
prefix="prefijoTagLib" %>). Finalmente, el Tag que se usa en la JSP consiste en
<prefijoTagLib:nombreTag atributo=valor ... >. Para más info, ver la página
oficial de Sun sobre TagLibraries en http://java.sun.com/products/jsp/taglibraries.html.
La funcionalidad de los Tags incluídos en Struts se encuentran documentados en:
    •   html: http://jakarta.apache.org/struts/struts-html.html
    •   bean: http://jakarta.apache.org/struts/struts-bean.html
    •   logic: http://jakarta.apache.org/struts/struts-logic.html
    •   nested: http://jakarta.apache.org/struts/struts-nested.html
Las clases TagHandlers que implementan dicha funcionalidad están documentadas en:
    •   html: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/html/package-
        summary.html
    •   bean: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/bean/package-
        summary.html
    •   logic: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/logic/package-
        summary.html
    •   nested: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/nested/package-
        summary.html
Manual Básico de Struts
Autor: Javier Antoniucci
    •   Controller
           • Intro
           • ActionForm Beans




Controller

             Intro
El Controller comprende la funcionalidad involucrada desde que un usuario genera un estímulo
(click en un link, envío de un formulario, etc.) hasta que se genera la interfaz de respuesta. Entre
medio, llamará a los objetos de negocio del Model para que resuelvan funcionalidad propia de la
lógica de negocio y según el resultado de la misma ejecutará la JSP que deba generar la interfaz
resultante.
Struts incluye un servlet que a partir de la configuración de struts-config.xml recibe las solicitudes
del usuario, llama al Action Bean que corresponda y, según lo que éste retorne, ejecuta una JSP. Por
consiguiente, las tareas que se deben realizar son:
    1. Escribir una clase Action que extienda de org.apache.action.Action. Ver sección
       "Controller Action Bean".
    2. Configurar el struts-config.xml para que incluya el nuevo action mapping y sus posibles
       forwards de salida. Por ejemplo:
        <struts-config>
        ...
          <action-mappings>
        ...
            <action path="/logoff" type="com.empresa.aplicacion.LogoffAction">
              <forward name="success" path="/index.jsp"/>
            </action>
        ...
          </action-mappings>
        ...
        </struts-config>

        En este caso, cuando la solicitud sea "/logoff" el Controller llamará a LogoffAction y si
        esta retorna un ActionForward con valor success entonces ejecutará /index.jsp. Pero...
        ¿qué pasa si es una acción asociada a un formulario? La respuesta es un poco más compleja:
        se debe definir un Form Bean, un Action Mapping con el Form Bean asociado y el
        o los forwards necesarios. Por ejemplo:
        <struts-config>
        ...
          <form-beans>
        ...
            <form-bean name="logonForm" type="com.empresa.aplicacion.LogonForm"/>
        ...
          </form-beans>
        ...
          <global-forwards>
...
           <forward    name="success" path="/mainMenu.do"/>
       ...
         </global-forwards>
       ...
         <action-mappings>
       ...
           <action path="/logon" type="com.empresa.aplicacion.LogonAction"
                    name="logonForm" scope="request" input="/logon.jsp"> </action>
       ...
         </action-mappings>
       ...
       </struts-config>

       En este caso se ha definido un global-forward que, como su nombre lo indica, viene a ser un
       forward que se aplica a todos los action-mappings (excepto que se re-defina para alguno en
       particular).
    3. Incluir los links (preferentemente utilizando <html:link>) o forms (necesariamente
       utilizando <html:form>) necesarios en las JSPs correspondientes.


             ActionForm Beans
Los ActionForm Beans son clases que extienden ActionForm y que implementan métodos get y set
para cada una de los inputs de un form de una página, y los métodos validate y reset.



Cuando un usuario completa un formulario y lo envía, el Controller busca en el scope especificado
el ActionForm Bean correspondiente (todo esto configurado en el struts-config.xml) y si no lo
encuentra lo crea. Luego realiza un set por cada input del form y finalmente llama al método
validate. Si éste retornara uno o más errores, el Controller llamaría a la JSP del formulario para
que ésta lo volviera a generar (con los valores establecidos por el usuario) e incluyera el o los
mensajes de error correspondientes. Si todo estuviese bien, llamaría al método perform del
Action (también configurado en el struts-config.xml) pasándole el ActionForm Bean como
parámetro para que sea utilizado para obtener los valores de los datos.
Si bien el ActionForm tienen características que corresponden al Model, los ActionForm
pertenecen a la View. Justamente uno de estos puntos comunes es la validación de datos y a fines de
evitar la duplicación de funcionalidad, si un desde un ActionForm debe realizar controles de
validación que se hubiesen implementado en un objeto de negocio entonces se debería utilizar una
instancia de éste para efectuarlos. Ejemplo:
public final class ClienteForm extends ActionForm {
 private String nombre = null;
 ActionErrors errors = null;
 Cliente cliente = null;
 ...
 public ClienteForm() {
   ...
   // Crear u obtener el objeto como sea...
   cliente = new Cliente();
   errors = new ActionErrors;
   ...
 }
 public String getNombre() {
   return (this.nombre);
 }
public void setNombre(String nombre) {
   try {
     cliente.setNombre(nombre);
   } catch (Exception e) {
     errors.add("nombre", new ActionError("error.nombre"));
   }
   this.nombre = nombre;
 }
 public void reset(ActionMapping mapping, HttpServletRequest request) {
   this.nombre = null;
 }
 public ActionErrors validate(ActionMapping mapping, HttpServletRequest request)
{
    ...
    return errors;
 }
}

Al momento de escribir un ActionForm debemos tener en mente los siguientes principios:
     •   No debe tener nada que corresponda a la lógica de negocio
     •   No debería tener más que implementaciones de getters y setters (obligatoriamente un par por
         cada input del form; si el input se llama nombre entonces tendremos getNombre() y
         setNombre(String nombre)), y de los métodos reset y validate
     •   Debe ser un Firewall entre el usuario y el Action que detenga todo tipo de errores de
         incompletitud o inconsistencia
     •   Si el formulario se desarrolla en varias páginas (por ejemplo, en las interfaces de tipo
         "Wizard"/"Asistentes") el ActionForm y el Action deberán ser los mismos, lo que permitirá,
         entre otras cosas, que los input se puedan reorganizar en distintas páginas sin cambiar los
         ActionForm ni los Action
Manual Básico de Struts
Autor: Javier Antoniucci
    •   ¿Cómo pongo en funcionamiento Struts?



¿Cómo pongo en funcionamiento Struts?
Como todo framework, Struts consiste en una librería de clases y una serie de configuraciones por
lo que su instalación es muy similar en todos los servidores de aplicaciones que provean (o puedan
agregársele) soporte de:
    •   Java Development Kit (version 1.2 or posterior)
    •   Servlet Container (version 2.2 or posterior)
    •   JavaServer Pages (JSP) (version 1.1 o posterior)
    •   XML Parser compatible con Java API for XML Parsing (JAXP) specification, 1.1 o
        posterior
    •   JDBC 2.0 Optional Package Classes
La instalación consiste en:
    1. Obtener la distribución binaria desde http://jakarta.apache.org/struts/index.html#Acquiring y
       descomprimirla
    2. Copiar lib/commons-*.jar (clases comunes de Jakarta), lib/struts.jar (JAR de las clases
       Struts) y lib/struts-*.tld (Tag Library Descriptors de los Tags de Struts) en el directorio
       WEB-INF/lib de la aplicación
    3. Modificar el WEB-INF/web.xml de la aplicación para incluir un elemento "<servlet>"
       que define el Servlet del Controller y un "<servlet-mapping>" que establezca las
       peticiones que éste atiende. Por ejemplo:
        <web-app>
        ...
          <servlet>
            <servlet-name>action</servlet-name>
            <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
            <init-param>
               <param-name>application</param-name>
               <param-value>com.empresa.aplicacion.ApplicationResources</param-
        value>
            </init-param>
            <init-param>
               <param-name>config</param-name>
               <param-value>/WEB-INF/struts-config.xml</param-value>
            </init-param>
            <init-param>
               <param-name>debug</param-name>
               <param-value>2</param-value>
            </init-param>
            <init-param>
               <param-name>detail</param-name>
               <param-value>2</param-value>
            </init-param>
            <init-param>
               <param-name>validate</param-name>
               <param-value>true</param-value>
            </init-param>
            <load-on-startup>2</load-on-startup>
</servlet>
       ...
         <servlet-mapping>
           <servlet-name>action</servlet-name>
           <url-pattern>*.do</url-pattern>
         </servlet-mapping>
       ...
       </web-app>

       Nota: com.empresa.aplicacion.ApplicationResources es la localización del
       archivo ".properties" del idioma principal de la aplicación
    4. Modificar el WEB-INF/web.xml de la aplicación para incluir la definición de los
       TagLibraries. Por ejemplo:
       <web-app>
       ...
         <taglib>
           <taglib-uri>strutsBean</taglib-uri>
           <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
         </taglib>

         <taglib>
           <taglib-uri>strutsHtml</taglib-uri>
           <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
         </taglib>

         <taglib>
           <taglib-uri>strutsLogic </taglib-uri>
           <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
         </taglib>

         <display-name></display-name>

         <description></description>
       ...
       </web-app>

    5. Agregar la definición de las TagLibraries en las JSPs que se utilicen. Ejemplo:
       <%@ taglib uri="strutsBean" prefix="bean" %>
       <%@ taglib uri="strutsHtml" prefix="html" %>
       <%@ taglib uri="strutsLogic" prefix="logic" %>

    6. Crear un struts-config.xml donde se configure el Controller según se describió en las
       secciones anteriores.
Si bien están comenzando a surgir aplicaciones que gestionan la configuración de Struts en forma
visual (Camino, StrutsConsole, etc.) es muy recomendable familiarizarse primero con la
configuración manual antes de utilizar estas herramientas

Contenu connexe

Tendances

Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPYouness Boukouchi
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring bootAntoine Rey
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...ENSET, Université Hassan II Casablanca
 
ADP- Chapter 3 Implementing Inter-Servlet Communication
ADP- Chapter 3 Implementing Inter-Servlet CommunicationADP- Chapter 3 Implementing Inter-Servlet Communication
ADP- Chapter 3 Implementing Inter-Servlet CommunicationRiza Nurman
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyENSET, Université Hassan II Casablanca
 
Securing Java EE apps using WildFly Elytron
Securing Java EE apps using WildFly ElytronSecuring Java EE apps using WildFly Elytron
Securing Java EE apps using WildFly ElytronJan Kalina
 
Microsoft SQL Server Database Administration.pptx
Microsoft SQL Server Database Administration.pptxMicrosoft SQL Server Database Administration.pptx
Microsoft SQL Server Database Administration.pptxsamtakke1
 
Apache hadoop hue overview and introduction
Apache hadoop hue overview and introductionApache hadoop hue overview and introduction
Apache hadoop hue overview and introductionBigClasses Com
 
Servlet 3.1 Async I/O
Servlet 3.1 Async I/OServlet 3.1 Async I/O
Servlet 3.1 Async I/OSimone Bordet
 
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)ENSET, Université Hassan II Casablanca
 
프로그레시브 웹앱이란? - Progressive Web Apps
프로그레시브 웹앱이란? - Progressive Web Apps프로그레시브 웹앱이란? - Progressive Web Apps
프로그레시브 웹앱이란? - Progressive Web AppsGihyo Joshua Jang
 
Introduction to ASP.NET Core
Introduction to ASP.NET CoreIntroduction to ASP.NET Core
Introduction to ASP.NET CoreAvanade Nederland
 

Tendances (20)

Appalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSPAppalications JEE avec Servlet/JSP
Appalications JEE avec Servlet/JSP
 
Cours design pattern m youssfi partie 7 facade bridge flyweight
Cours design pattern m youssfi partie 7 facade bridge flyweightCours design pattern m youssfi partie 7 facade bridge flyweight
Cours design pattern m youssfi partie 7 facade bridge flyweight
 
Introduction à spring boot
Introduction à spring bootIntroduction à spring boot
Introduction à spring boot
 
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...Mohamed youssfi support architectures logicielles distribuées basées sue les ...
Mohamed youssfi support architectures logicielles distribuées basées sue les ...
 
Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)Support programmation orientée aspect mohamed youssfi (aop)
Support programmation orientée aspect mohamed youssfi (aop)
 
Initiation à Bootstrap
Initiation à BootstrapInitiation à Bootstrap
Initiation à Bootstrap
 
ADP- Chapter 3 Implementing Inter-Servlet Communication
ADP- Chapter 3 Implementing Inter-Servlet CommunicationADP- Chapter 3 Implementing Inter-Servlet Communication
ADP- Chapter 3 Implementing Inter-Servlet Communication
 
Cours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategyCours design pattern m youssfi partie 1 introduction et pattern strategy
Cours design pattern m youssfi partie 1 introduction et pattern strategy
 
Support JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.YoussfiSupport JEE Servlet Jsp MVC M.Youssfi
Support JEE Servlet Jsp MVC M.Youssfi
 
Securing Java EE apps using WildFly Elytron
Securing Java EE apps using WildFly ElytronSecuring Java EE apps using WildFly Elytron
Securing Java EE apps using WildFly Elytron
 
Spring Web MVC
Spring Web MVCSpring Web MVC
Spring Web MVC
 
Microsoft SQL Server Database Administration.pptx
Microsoft SQL Server Database Administration.pptxMicrosoft SQL Server Database Administration.pptx
Microsoft SQL Server Database Administration.pptx
 
Apache hadoop hue overview and introduction
Apache hadoop hue overview and introductionApache hadoop hue overview and introduction
Apache hadoop hue overview and introduction
 
Support de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec SpringSupport de Cours JSF2 Première partie Intégration avec Spring
Support de Cours JSF2 Première partie Intégration avec Spring
 
Spring mvc
Spring mvcSpring mvc
Spring mvc
 
Servlet 3.1 Async I/O
Servlet 3.1 Async I/OServlet 3.1 Async I/O
Servlet 3.1 Async I/O
 
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
Développement d'un site web jee de e commerce basé sur spring (m.youssfi)
 
프로그레시브 웹앱이란? - Progressive Web Apps
프로그레시브 웹앱이란? - Progressive Web Apps프로그레시브 웹앱이란? - Progressive Web Apps
프로그레시브 웹앱이란? - Progressive Web Apps
 
Développement d'un site web de E-Commerce avec PHP (Première Partie)
Développement d'un site web de E-Commerce avec PHP (Première Partie)Développement d'un site web de E-Commerce avec PHP (Première Partie)
Développement d'un site web de E-Commerce avec PHP (Première Partie)
 
Introduction to ASP.NET Core
Introduction to ASP.NET CoreIntroduction to ASP.NET Core
Introduction to ASP.NET Core
 

Similaire à Manual Basico De Struts

Similaire à Manual Basico De Struts (20)

Aplicaciones web con jakarta struts - Javier Oliver Fulguera
Aplicaciones web con jakarta struts  - Javier Oliver FulgueraAplicaciones web con jakarta struts  - Javier Oliver Fulguera
Aplicaciones web con jakarta struts - Javier Oliver Fulguera
 
FMK Capa de Presentacion
FMK Capa de PresentacionFMK Capa de Presentacion
FMK Capa de Presentacion
 
01 introducción
01 introducción01 introducción
01 introducción
 
Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3Aplicación abc. asp net mvc 3
Aplicación abc. asp net mvc 3
 
Documentacion struts2 laura.palma
Documentacion struts2 laura.palmaDocumentacion struts2 laura.palma
Documentacion struts2 laura.palma
 
Jsf Java Server Faces
Jsf   Java Server FacesJsf   Java Server Faces
Jsf Java Server Faces
 
Documentacion struts2
Documentacion struts2Documentacion struts2
Documentacion struts2
 
Struts en Java
Struts en JavaStruts en Java
Struts en Java
 
Documentacion struts 2
Documentacion struts 2Documentacion struts 2
Documentacion struts 2
 
Documentacionstruts2 luiggi
Documentacionstruts2 luiggiDocumentacionstruts2 luiggi
Documentacionstruts2 luiggi
 
Introduccion mvc
Introduccion mvcIntroduccion mvc
Introduccion mvc
 
10.desarrollowebconjava
10.desarrollowebconjava10.desarrollowebconjava
10.desarrollowebconjava
 
Framework
FrameworkFramework
Framework
 
Patron mvc struts
Patron mvc strutsPatron mvc struts
Patron mvc struts
 
Hands-on Spring 3: The next generation
Hands-on Spring 3: The next generationHands-on Spring 3: The next generation
Hands-on Spring 3: The next generation
 
Exposicion Akelos
Exposicion AkelosExposicion Akelos
Exposicion Akelos
 
[ES] Conectividad de java a base de datos(jdbc)
[ES] Conectividad de java a base  de datos(jdbc)[ES] Conectividad de java a base  de datos(jdbc)
[ES] Conectividad de java a base de datos(jdbc)
 
Org tutorial struts_2010
Org tutorial struts_2010Org tutorial struts_2010
Org tutorial struts_2010
 
Presentación1
Presentación1Presentación1
Presentación1
 
Struts2
Struts2Struts2
Struts2
 

Dernier

Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricKeyla Dolores Méndez
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIAWilbisVega
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx241521559
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudianteAndreaHuertas24
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITMaricarmen Sánchez Ruiz
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxRogerPrieto3
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxLolaBunny11
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfsoporteupcology
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)GDGSucre
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesFundación YOD YOD
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdfIsabellaMontaomurill
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan JosephBRAYANJOSEPHPEREZGOM
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíassuserf18419
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...silviayucra2
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveFagnerLisboa3
 

Dernier (15)

Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft FabricGlobal Azure Lima 2024 - Integración de Datos con Microsoft Fabric
Global Azure Lima 2024 - Integración de Datos con Microsoft Fabric
 
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE  DE TECNOLOGIA E INFORMATICA PRIMARIACLASE  DE TECNOLOGIA E INFORMATICA PRIMARIA
CLASE DE TECNOLOGIA E INFORMATICA PRIMARIA
 
Proyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptxProyecto integrador. Las TIC en la sociedad S4.pptx
Proyecto integrador. Las TIC en la sociedad S4.pptx
 
9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante9egb-lengua y Literatura.pdf_texto del estudiante
9egb-lengua y Literatura.pdf_texto del estudiante
 
pruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNITpruebas unitarias unitarias en java con JUNIT
pruebas unitarias unitarias en java con JUNIT
 
Herramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptxHerramientas de corte de alta velocidad.pptx
Herramientas de corte de alta velocidad.pptx
 
Presentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptxPresentación guía sencilla en Microsoft Excel.pptx
Presentación guía sencilla en Microsoft Excel.pptx
 
Redes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdfRedes direccionamiento y subredes ipv4 2024 .pdf
Redes direccionamiento y subredes ipv4 2024 .pdf
 
International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)International Women's Day Sucre 2024 (IWD)
International Women's Day Sucre 2024 (IWD)
 
KELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento ProtégelesKELA Presentacion Costa Rica 2024 - evento Protégeles
KELA Presentacion Costa Rica 2024 - evento Protégeles
 
trabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdftrabajotecologiaisabella-240424003133-8f126965.pdf
trabajotecologiaisabella-240424003133-8f126965.pdf
 
guía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Josephguía de registro de slideshare por Brayan Joseph
guía de registro de slideshare por Brayan Joseph
 
Trabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnologíaTrabajo Mas Completo De Excel en clase tecnología
Trabajo Mas Completo De Excel en clase tecnología
 
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
POWER POINT YUCRAElabore una PRESENTACIÓN CORTA sobre el video película: La C...
 
EPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial UninoveEPA-pdf resultado da prova presencial Uninove
EPA-pdf resultado da prova presencial Uninove
 

Manual Basico De Struts

  • 1. Manual Básico de Struts Autor: Javier Antoniucci • Introducción • ¿Qué es Struts? • ¿Cómo funciona esto en aplicaciones Web? • ¿Para qué sirve? • ¿Licencia? • ¿Y para qué este manual básico? • ¿Dónde encuentro más info? Introducción ¿Qué es Struts? Es un framework que implementa el patrón de arquitectura MVC en Java Un framework es la extensión de un lenguaje mediante una o más jerarquías de clases que implementan una funcionalidad y que (opcionalmente) pueden ser extendidas. El framework puede involucrar TagLibraries. El patrón de arquitectura MVC (Model-View-Controller) es un patrón que define la organización independiente del Model (Objetos de Negocio), la View (interfaz con el usuario u otro sistema) y el Controller (controlador del workflow de la aplicación: "si estoy aquí y me piden esto entonces hacer tal cosa, si sale bien mostrar esto y sino lo aquello otro").
  • 2. ¿Cómo funciona esto en aplicaciones Web? El navegador genera una solicitud que es atendida por el Controller (un Servlet especializado). El mismo se encarga de analizar la solicitud, seguir la configuración que se le ha programado en su XML y llamar al Action correspondiente pasándole los parámetros enviados. El Action instanciará y/o utilizará los objetos de negocio para concretar la tarea. Según el resultado que retorne el Action, el Controller derivará la generación de interfaz a una o más JSPs, las cuales podrán consultar los objetos del Model a fines de realizar su tarea. ¿Para qué sirve? Evidentemente, como todo framework intenta, simplifica notablemente la implementación de una arquitectura según el patrón MVC. El mismo separa muy bien lo que es la gestión del workflow de la aplicación, del modelo de objetos de negocio y de la generación de interfaz. El controlador ya se encuentra implementado por Struts, aunque si fuera necesario se puede heredar y ampliar o modificar, y el workflow de la aplicación se puede programar desde un archivo XML Las acciones que se ejecutarán sobre el modelo de objetos de negocio se implementan basándose en clases predefinidas por el framework y siguiendo el patrón Facade. Y la generación de interfaz se soporta mediante un conjunto de Tags predefinidos por Struts cuyo objetivo es evitar el uso de Scriplets (los trozos de código Java entre "<%" y "%>"), lo cual genera ventajas de mantenibilidad y de perfomance (pooling de Tags, caching, etc). Logísticamente, separa claramente el desarrollo de interfaz del workflow y lógica de negocio permitiendo desarrollar ambas en paralelo o con personal especializado. También es evidente que potencia la reutilización, soporte de múltiples interfaces de usuario (Html, sHtml, Wml, Desktop applications, etc.) y de múltiples idiomas, localismos, etc. ¿Licencia? Struts está disponible bajo la licencia "free-to-use-license" de la Apache Software Foundation (ver http://www.apache.org/LICENSE-1.1)
  • 3. ¿Y para qué este manual básico? Para simplificar el "first touch" y para explicar Struts desde el punto de vista del desarrollo de aplicaciones Web. No pretende ser un tutorial, una guía del usuario ni un manual de referencia. Ellos ya se han escrito y están disponibles en las direcciones que se mencionan en la sección "¿Dónde encuentro más info?" ¿Dónde encuentro más info? • http://jakarta.apache.org/struts • http://jakarta.apache.org/struts/userGuide • http://jakarta.apache.org/struts/api/index.html • http://jguru.com/faq/Struts • http://jguru.com/forums/Struts • http://jakarta.apache.org/struts/#Involved Búsquedas en www.google.com poniendo como primera palabra Struts.
  • 4. Manual Básico de Struts Autor: Javier Antoniucci • Model • Intro • Action Bean • System State Beans • BusinessLogic Beans • Accediendo a BD Model Intro El Model comprende todos los Objetos de Negocio donde se implementa la lógica de negocio (el "how it's done") y donde se debe soportar todos los requisitos funcionales del Sistema sin mezclarlo con partes correspondientes al workflow (el "what to do") que corresponden al Controller. Action Bean Generalmente, los Action Beans siempre realizan las siguientes acciones: 1. Obtener los valores necesarios del Action Form, JavaBean, request, session o de donde sea. 2. Llamar a los objetos de negocio del Model. 3. Analizar los resultados, y según los mismos retornar el ActionForward correspondiente. Veamos entonces un ejemplo de Action Bean: public final class LogonAction extends Action { public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException { // Obteniendo atributos Locale locale = getLocale(request); MessageResources messages = getResources(); User user = null; // Validando los parámetros ActionErrors errors = new ActionErrors(); String username = ((LogonForm) form).getUsername(); String password = ((LogonForm) form).getPassword(); try { DataSource dataSource = servlet.findDataSource(null); Connection myConnection = dataSource.getConnection(); } catch (SQLException e) { errors.add(ActionErrors.GLOBAL_ERROR, new
  • 5. ActionError("error.database.missing")); saveErrors(request, errors); return (new ActionForward(mapping.getInput())); } UserFactory userFactory = new UserFactory(database); user = userFactory.getUser(username, password); if (user == null) { errors.add(ActionErrors.GLOBAL_ERROR, new ActionError("error.password.mismatch")); saveErrors(request, errors); return (new ActionForward(mapping.getInput())); } // Guardando el usuario en la sesion HttpSession session = request.getSession(); session.setAttribute(Constants.USER_KEY, user); // Eliminando el form bean obsoleto if (mapping.getAttribute() != null) { if ("request".equals(mapping.getScope())) request.removeAttribute(mapping.getAttribute()); else session.removeAttribute(mapping.getAttribute()); } // Pasando el control a la siguiente página return (mapping.findForward("success")); } } System State Beans Los System State Beans son el conjunto de objetos de negocio que representan el estado actual del sistema, por ejemplo: el carrito de la compra que el usuario va modificando a lo largo de su interacción con la aplicación. Estos objetos de negocio serán típicamente JavaBeans o EJBs de los que se guardará referencia en la sesión del usuario, que serán modificados desde los Action y que serán consultados desde las JSPs. Esta clase de objetos no debiera tener ningún conocimiento de la View. BusinessLogic Beans Los objetos de negocio son los que implementan la lógica de negocio, el cómo hacer las cosas y su propia persistencia. Estos objetos de negocio no debiera tener ningún conocimiento de la View o el Controller de forma que debieran ser perfectamente reutilizables para implementar soporte a distintas interfaces y hasta para incluirse en nuevas aplicaciones. Accediendo a BD Con Struts se puede definir un datasource para una aplicación desde el struts-config.xml (más información en la sección "The Action Mappings Configuration File" del "Struts User Manual"). Este datasource nos permite obtener una connection desde un Action y desde allí utilizarlo o pasarlo al Model. Muy práctico. Este es un ejemplo de acceso a una conexión desde un Action:
  • 6. public ActionForward perform(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) { javax.sql.DataSource dataSource; java.sql.Connection myConnection; ... try { dataSource = servlet.findDataSource(null); myConnection = dataSource.getConnection(); ... } catch (SQLException sqle) { getServlet().log("Connection.process", sqle); } finally { ... try { myConnection.close(); } catch (SQLException e) { getServlet().log("Connection.close", e); } } }
  • 7. Manual Básico de Struts Autor: Javier Antoniucci • View • Intro • Internacionalización • Forms • Tags View Intro La View comprende las JSP (principalmente) y los servlets involucrados en la generación de la interfaz de usuario o con otros Sistemas. Struts provee soporte para construir aplicaciones multi- idioma, interacción con formularios y otras utilidades mediante la utilización de Tags especiales (TagLibraries). Internacionalización Lo podemos abreviar en la siguiente receta: 1. Crear un archivo de texto (ej: MiAplicacion.properties) en el directorio donde se encuentren las clases de la aplicación (ej: d:comempresaaplicacion) donde se contengan las claves y valores con el formato clave.subclave=texto de los textos que pertenezcan al idioma principal. Ejemplo: ... application.title= Demo de Struts en APLICACION index.header=Bienvenido a la Demo de Struts en APLICACION ... 2. Para cada idioma alternativo se creará un archivo nuevo que se llame igual pero que termine en "_xx.properties" siendo xx el código ISO de idioma (ej: MiAplicación_en.properties). 3. En struts-config.xml se debe configurar el Tag /servlet/init-param/param-name application y ponerle como param-value la localización del archivo con el idioma principal. Ejemplo: <servlet> <servlet-name>action</servlet-name> ... <init-param> <param-name>application</param-name> <param-value>com.empresa.aplicacion.MiAplicacion</param-value> </init-param> ... 4. En web.xml deberemos inclur: <web-app> ... <taglib> <taglib-uri>/WEB-INF/struts-bean.tld</taglib-uri>
  • 8. <taglib-location>/WEB-INF/struts-bean.tld</taglib-location> </taglib> ... </web-app> 5. En las JSPs donde utilicemos la internacionalización deberemos incluir al comienzo: ... <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> ... para declarar que utilizaremos la TagLibrary struts-bean con el prefijo bean y definida en /WEB-INF/struts-bean.tld 6. Y finalmente, utilizaremos el Tag <bean:message key="clave.subclave"/> donde clave y subclave corresponden al texto por el que se reemplazará según el idioma del usuario. Ejemplo ... <TITLE><bean:message key="application.title"/></TITLE> ... Por defecto Struts asigna a cada usuario el idioma principal de la aplicación. Si se utiliza el tag <html:html locale="true"> (reemplaza a "<html>" y debe cerrarse con "</html:html>") entonces se utilizará el primero de los idiomas soportados por la aplicación que se encuentre en el header "Accept-Language" enviado por su navegador. Pero si se desea proponerle al usuario una lista de idiomas entonces éste podrá cambiarse mediante session.setAttribute( Action.LOCALE_KEY, new java.util.Locale(country, language)) donde country y language serán el string del país e idioma a establecer. Además de texto podran incluirse variables (al igual que se hace en los println) y hasta formato de datos. Para más información ver la documentación oficial de Sun disponible en http://java.sun.com/j2se/1.3/docs/guide/intl/ Forms Una de las tareas que durante el desarrollo de una aplicación insume mucho trabajo (aunque en realidad no lo merezcan) es la interacción con formularios, ya sea para editar u obtener nueva información. Las comprobaciones, la gestión de errores, el volver a presentarle el mismo form al usuario con los valores que puso y los mensajes de error y un largo etcétera están soportadas por Struts a fines de hacernos la vida un poco más fácil. La idea es la siguiente: todo el trabajo de comprobaciones y generación de mensajes de error se implementa en los ActionForm y todo el trabajo de generación de interfaz en la/s JSP. Veamos la receta: 1. Crear el ActionForm (ver la sección Model / ActionForm Beans) 2. Crear la página JSP del formulario utilizando los Tags que provee Struts (ver la sección View / Tags). Ejemplo: ... <%@ taglib uri="/WEB-INF/struts-bean.tld" prefix="bean" %> <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %> ... <html:html> ... <html:form action="/logon" focus="username">
  • 9. ... <h1><bean:message key="logon.header"/></h1> <html:form action="/logon" focus="username"> <h5><html:errors/></h5> <h3><bean:message key="logon.mainText"/></h3> <p><bean:message key="logon.username"/> <html:text property="username" size="16" maxlength="16"/></p> <p><bean:message key="logon.password"/> <html:password property="password" size="16" maxlength="16" redisplay=false/></p> <p><html:submit property="submit" value="Submit"/></p> <p><html:reset/></p> ... </html:form> ... </html:html> 3. Declarar el ActionForm en struts-config.xml agregando en /struts-config/form-beans el tag <form-bean name="nombreForm" type="paquete.clase"/> y en la declaración del Action (ver la sección Controller / Action Beans) agregar los atributos name="nombreForm", scope="(request ó session)", e input="paginaForm.jsp". Ejemplo: <struts-config> ... <form-beans> ... <form-bean name="logonForm" type="com.empresa.aplicacion.LogonForm"/> ... </form-beans> ... <action-mappings> ... <action path="/logon" type="com.empresa.aplicacion.LogonAction" name="logonForm" scope="request" input="/logon.jsp"> ... </action> ... <action-mappings> ... </struts-config> Tags Básicamente, un Tag de JSP consiste en un Tag con formato <prefijoTagLib:nombreTag atributo=valor ... > que cuando la JSP se compila es sustituído por una llamada a la clase TagHandler que se encarga de resolver su funcionalidad. El TagHandler extiende BodyTagSupport o TagSupport (según si es un tag que tiene body), que implementa su funcionalidad en los métodos doStartTag(), doEndTag(),doInitBody(), doAfterBody() (los dos últimos sólo en las que extienden BodyTagSupport), además de los getters y setters correspondientes a sus atributos. Esta clase se define en un Tag Library Definition (archivo xml con extensión TLD donde se define el nombre del tag, la clase TagHandler que lo atiende, la definición de sus atributos, si tiene body, etc.) que a su vez se debe declarar en el web.xml (dentro de <web-app> se pone <taglib> <taglib-uri> nombreTagLib </taglib-uri> <taglib- location>/directorios/nombreArchivo.tld </taglib-location>
  • 10. </taglib>) y en la JSP donde se utilizará (<%@ taglib uri="nobreTagLib" prefix="prefijoTagLib" %>). Finalmente, el Tag que se usa en la JSP consiste en <prefijoTagLib:nombreTag atributo=valor ... >. Para más info, ver la página oficial de Sun sobre TagLibraries en http://java.sun.com/products/jsp/taglibraries.html. La funcionalidad de los Tags incluídos en Struts se encuentran documentados en: • html: http://jakarta.apache.org/struts/struts-html.html • bean: http://jakarta.apache.org/struts/struts-bean.html • logic: http://jakarta.apache.org/struts/struts-logic.html • nested: http://jakarta.apache.org/struts/struts-nested.html Las clases TagHandlers que implementan dicha funcionalidad están documentadas en: • html: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/html/package- summary.html • bean: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/bean/package- summary.html • logic: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/logic/package- summary.html • nested: http://jakarta.apache.org/struts/api/org/apache/struts/taglib/nested/package- summary.html
  • 11. Manual Básico de Struts Autor: Javier Antoniucci • Controller • Intro • ActionForm Beans Controller Intro El Controller comprende la funcionalidad involucrada desde que un usuario genera un estímulo (click en un link, envío de un formulario, etc.) hasta que se genera la interfaz de respuesta. Entre medio, llamará a los objetos de negocio del Model para que resuelvan funcionalidad propia de la lógica de negocio y según el resultado de la misma ejecutará la JSP que deba generar la interfaz resultante. Struts incluye un servlet que a partir de la configuración de struts-config.xml recibe las solicitudes del usuario, llama al Action Bean que corresponda y, según lo que éste retorne, ejecuta una JSP. Por consiguiente, las tareas que se deben realizar son: 1. Escribir una clase Action que extienda de org.apache.action.Action. Ver sección "Controller Action Bean". 2. Configurar el struts-config.xml para que incluya el nuevo action mapping y sus posibles forwards de salida. Por ejemplo: <struts-config> ... <action-mappings> ... <action path="/logoff" type="com.empresa.aplicacion.LogoffAction"> <forward name="success" path="/index.jsp"/> </action> ... </action-mappings> ... </struts-config> En este caso, cuando la solicitud sea "/logoff" el Controller llamará a LogoffAction y si esta retorna un ActionForward con valor success entonces ejecutará /index.jsp. Pero... ¿qué pasa si es una acción asociada a un formulario? La respuesta es un poco más compleja: se debe definir un Form Bean, un Action Mapping con el Form Bean asociado y el o los forwards necesarios. Por ejemplo: <struts-config> ... <form-beans> ... <form-bean name="logonForm" type="com.empresa.aplicacion.LogonForm"/> ... </form-beans> ... <global-forwards>
  • 12. ... <forward name="success" path="/mainMenu.do"/> ... </global-forwards> ... <action-mappings> ... <action path="/logon" type="com.empresa.aplicacion.LogonAction" name="logonForm" scope="request" input="/logon.jsp"> </action> ... </action-mappings> ... </struts-config> En este caso se ha definido un global-forward que, como su nombre lo indica, viene a ser un forward que se aplica a todos los action-mappings (excepto que se re-defina para alguno en particular). 3. Incluir los links (preferentemente utilizando <html:link>) o forms (necesariamente utilizando <html:form>) necesarios en las JSPs correspondientes. ActionForm Beans Los ActionForm Beans son clases que extienden ActionForm y que implementan métodos get y set para cada una de los inputs de un form de una página, y los métodos validate y reset. Cuando un usuario completa un formulario y lo envía, el Controller busca en el scope especificado el ActionForm Bean correspondiente (todo esto configurado en el struts-config.xml) y si no lo encuentra lo crea. Luego realiza un set por cada input del form y finalmente llama al método validate. Si éste retornara uno o más errores, el Controller llamaría a la JSP del formulario para que ésta lo volviera a generar (con los valores establecidos por el usuario) e incluyera el o los mensajes de error correspondientes. Si todo estuviese bien, llamaría al método perform del Action (también configurado en el struts-config.xml) pasándole el ActionForm Bean como parámetro para que sea utilizado para obtener los valores de los datos. Si bien el ActionForm tienen características que corresponden al Model, los ActionForm pertenecen a la View. Justamente uno de estos puntos comunes es la validación de datos y a fines de evitar la duplicación de funcionalidad, si un desde un ActionForm debe realizar controles de validación que se hubiesen implementado en un objeto de negocio entonces se debería utilizar una instancia de éste para efectuarlos. Ejemplo: public final class ClienteForm extends ActionForm { private String nombre = null; ActionErrors errors = null; Cliente cliente = null; ... public ClienteForm() { ... // Crear u obtener el objeto como sea... cliente = new Cliente(); errors = new ActionErrors; ... } public String getNombre() { return (this.nombre); }
  • 13. public void setNombre(String nombre) { try { cliente.setNombre(nombre); } catch (Exception e) { errors.add("nombre", new ActionError("error.nombre")); } this.nombre = nombre; } public void reset(ActionMapping mapping, HttpServletRequest request) { this.nombre = null; } public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) { ... return errors; } } Al momento de escribir un ActionForm debemos tener en mente los siguientes principios: • No debe tener nada que corresponda a la lógica de negocio • No debería tener más que implementaciones de getters y setters (obligatoriamente un par por cada input del form; si el input se llama nombre entonces tendremos getNombre() y setNombre(String nombre)), y de los métodos reset y validate • Debe ser un Firewall entre el usuario y el Action que detenga todo tipo de errores de incompletitud o inconsistencia • Si el formulario se desarrolla en varias páginas (por ejemplo, en las interfaces de tipo "Wizard"/"Asistentes") el ActionForm y el Action deberán ser los mismos, lo que permitirá, entre otras cosas, que los input se puedan reorganizar en distintas páginas sin cambiar los ActionForm ni los Action
  • 14. Manual Básico de Struts Autor: Javier Antoniucci • ¿Cómo pongo en funcionamiento Struts? ¿Cómo pongo en funcionamiento Struts? Como todo framework, Struts consiste en una librería de clases y una serie de configuraciones por lo que su instalación es muy similar en todos los servidores de aplicaciones que provean (o puedan agregársele) soporte de: • Java Development Kit (version 1.2 or posterior) • Servlet Container (version 2.2 or posterior) • JavaServer Pages (JSP) (version 1.1 o posterior) • XML Parser compatible con Java API for XML Parsing (JAXP) specification, 1.1 o posterior • JDBC 2.0 Optional Package Classes La instalación consiste en: 1. Obtener la distribución binaria desde http://jakarta.apache.org/struts/index.html#Acquiring y descomprimirla 2. Copiar lib/commons-*.jar (clases comunes de Jakarta), lib/struts.jar (JAR de las clases Struts) y lib/struts-*.tld (Tag Library Descriptors de los Tags de Struts) en el directorio WEB-INF/lib de la aplicación 3. Modificar el WEB-INF/web.xml de la aplicación para incluir un elemento "<servlet>" que define el Servlet del Controller y un "<servlet-mapping>" que establezca las peticiones que éste atiende. Por ejemplo: <web-app> ... <servlet> <servlet-name>action</servlet-name> <servlet-class>org.apache.struts.action.ActionServlet</servlet-class> <init-param> <param-name>application</param-name> <param-value>com.empresa.aplicacion.ApplicationResources</param- value> </init-param> <init-param> <param-name>config</param-name> <param-value>/WEB-INF/struts-config.xml</param-value> </init-param> <init-param> <param-name>debug</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>detail</param-name> <param-value>2</param-value> </init-param> <init-param> <param-name>validate</param-name> <param-value>true</param-value> </init-param> <load-on-startup>2</load-on-startup>
  • 15. </servlet> ... <servlet-mapping> <servlet-name>action</servlet-name> <url-pattern>*.do</url-pattern> </servlet-mapping> ... </web-app> Nota: com.empresa.aplicacion.ApplicationResources es la localización del archivo ".properties" del idioma principal de la aplicación 4. Modificar el WEB-INF/web.xml de la aplicación para incluir la definición de los TagLibraries. Por ejemplo: <web-app> ... <taglib> <taglib-uri>strutsBean</taglib-uri> <taglib-location>/WEB-INF/struts-bean.tld</taglib-location> </taglib> <taglib> <taglib-uri>strutsHtml</taglib-uri> <taglib-location>/WEB-INF/struts-html.tld</taglib-location> </taglib> <taglib> <taglib-uri>strutsLogic </taglib-uri> <taglib-location>/WEB-INF/struts-logic.tld</taglib-location> </taglib> <display-name></display-name> <description></description> ... </web-app> 5. Agregar la definición de las TagLibraries en las JSPs que se utilicen. Ejemplo: <%@ taglib uri="strutsBean" prefix="bean" %> <%@ taglib uri="strutsHtml" prefix="html" %> <%@ taglib uri="strutsLogic" prefix="logic" %> 6. Crear un struts-config.xml donde se configure el Controller según se describió en las secciones anteriores. Si bien están comenzando a surgir aplicaciones que gestionan la configuración de Struts en forma visual (Camino, StrutsConsole, etc.) es muy recomendable familiarizarse primero con la configuración manual antes de utilizar estas herramientas