0% encontró este documento útil (0 votos)
187 vistas92 páginas

Java Struts 2.0 Avanzado.

El documento describe el uso avanzado de Struts 2.0, un framework para desarrollo web en Java. Explica los objetivos de crear archivos y controladores necesarios para el funcionamiento de Struts, y ser capaces de cambiar los resultados de las acciones. También describe los componentes clave de Struts como acciones, interceptores y vistas, y cómo implementa el patrón MVC.

Cargado por

AmadorSalami10
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
187 vistas92 páginas

Java Struts 2.0 Avanzado.

El documento describe el uso avanzado de Struts 2.0, un framework para desarrollo web en Java. Explica los objetivos de crear archivos y controladores necesarios para el funcionamiento de Struts, y ser capaces de cambiar los resultados de las acciones. También describe los componentes clave de Struts como acciones, interceptores y vistas, y cómo implementa el patrón MVC.

Cargado por

AmadorSalami10
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 92

[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS

DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Introducción

En este tema veremos controladores y beneficios de utilizar STRUTS y poder implementarlo así

como ahondaremos en los distintos tipos de controladores con Servlet o cómo crear librerías Struts y

crear Vista.

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
1 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Objetivos

Crear ficheros y controladores necesarios para funcionamiento de STRUTS.

Ser capaces de cambiar resultados de las acciones.

es
2.
ca
lifi
ua
l.c
ua
i rt
sv
pu
m
ca

campusvirtual.cualifica2.es
2 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Mapa Conceptual

[[[Elemento Multimedia]]]

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
3 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Introducción a Struts 2.

[[[Elemento Multimedia]]]
[[[Elemento Multimedia]]]
Struts 2 surgió de la combinación entre Struts 1 y otro framework creado por otros desarrolladores

llamado WebWork. Esto se hizo ya que cada framework poseía unas características diferentes, cada

uno con sus ventajas y desventajas.

Struts 2 se basa en la estructura formada por XML y JAVA de forma conjunta en clases. Como

es
principal característica, la utilización de acciones, las cuales ejecutan funciones tan importantes

2.
como aislar los servicios para ejecutarlos de forma que el procesamiento y las tareas queden aparte.

ca
Las acciones también se encargan de la manipulación de las consultas con sus peticiones y

lifi
resultados. Estas acciones implementan objetos JavaBeans, de forma que mediante el envío de

parámetros se devuelva un conjunto de resultados que Struts analizará y seleccionará el más


ua
adecuado.
l.c

Struts 2 se basa en la estructura formada por XML y JAVA de forma conjunta en


ua

clases. Como principal característica, la utilización de acciones, las cuales


ejecutan funciones tan importantes como aislar los servicios para ejecutarlos de
rt

forma que el procesamiento y las tareas queden aparte.


i
sv

Verdadero.
pu

Falso.
m
ca

campusvirtual.cualifica2.es
4 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Patrón MVC y Beneficios.

Struts 2 se basa en el modelo MVC para una ejecución más potente, con gran accesibilidad y una

resolución de los problemas de diseño que ocurrían antes de comenzar a utilizarlo.

Como características podemos destacar:

Gran funcionalidad con las etiquetas.

es
Buena depuración.

Compatibilidad con AJAX.

2.
Extensa biblioteca de complementos y extensiones.

ca
Validación de formularios bien implementada y fácil de manejar.

lifi
Las principales ventajas que posee el MVC en Struts 2 son poder agrupar todas las acciones de este
ua
en paquetes y dominios, de forma que la organización está muy consolidada. Además también
l.c

permite agrupar las clases de acción en XML.


ua

El patrón Modelo-Vista-Controlador en Struts 2 es llevado a cabo con estos cinco componentes:


rt

Actions: clases que contienen la lógica de negocio.


i

Interceptors: revisan una petición o los datos de respuesta de un Action.


sv

Value Stack / OGNL: permiten la integración entre el resto de componentes.


pu

Results / Result types: encargados de renderizar la respuesta a partir del resultado de un

Action.
m

View technologies: una serie de tecnologías encargadas de generar vistas como por ejemplo
ca

motores de plantillas como Freemarker.

campusvirtual.cualifica2.es
5 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

es
2.
ca
lifi
ua
l.c
ua
i rt

Ciclo de vida de una petición


sv

Basándose en el anterior diagrama podemos explicar el proceso por el que pasa una petición de
pu

usuario en Struts 2:
m

Un usuario envía una petición al servidor solicitando un determinado recurso, como por
ca

ejemplo una página en html.

El FilterDispatcher revisa la petición y entonces determina que Action es el adecuado.

Se ejecutan una serie de interceptores que revisan o modifican la petición, como por ejemplo

para fines de validación o seguridad.

El Action seleccionado procesa la petición.

De nuevo, algunos interceptores aplican un post-procesado al resultado del Action.

Finalmene la vista genera el recurso y este es enviado al usuario.

campusvirtual.cualifica2.es
6 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Introducción a las Acciones.

Las acciones de Struts son clases Java que contienen la lógica de negocio y la llevaran a cabo a

partir de las peticiones realizadas a estas. Estos controlan la interacción entre el usuario, el modelo

y la vista.

Las clases que implementan las acciones deben descender desde “org.apache.struts.action.Action”,

para de esta forma poder acceder a sus métodos.

es
Como respuesta a una acción de un usuario Struts 2 creará una instancia de una clase heredera

2.
de Action que hayamos definido como por ejemplo "HelloWorldAction" y llamará a un método

ca
llamado execute(). Al finalizar el código definido por la lógica de negocio deberá devolverse un

String indicando el tipo de resultado. De manera más simple, para cada URL debes implementar una

lifi
clase Action y puedes utilizar el nombre de la clase como nombre de la acción o definirle otro
ua
nombre a través del fichero struts.xml como se muestra a continuación:
l.c

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE struts PUBLIC
ua

"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"


"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
rt

<constant name="struts.devMode" value="true" />


<package name="helloworld" extends="struts-default">
i
sv

<action name="hello"
class="com.lms.HelloWorldAction"
pu

method="execute">
<result name="success">/HelloWorld.jsp</result>
</action>
m

</package>
</struts>
ca

Acciones de Struts 1 y 2

El código de una acción de Struts 1.x tiene fuertes dependencias del API de Struts y del API de

servlets. A continuación tenemos un ejemplo de Struts 1, donde se destacan en negrita las

dependencias:

campusvirtual.cualifica2.es
7 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

es
2.
ca
Estas dependencias son una "molestia" a la hora de hacer pruebas unitarias. Para probar nuestra

lifi
acción necesitamos tener Struts y el contenedor de servlets en marcha. Además dificultan la

portabilidad de nuestro código a otro framework MVC distinto de Struts.


ua
La tendencia actual en JavaEE es el uso de APIs "no invasivos", que no necesitan de dependencias
l.c

explícitas en el código. Siguiendo esta filosofía, en Struts 2 una acción es una clase java

convencional, que no es necesario que herede de ninguna clase especial:


ua
i rt
sv
pu
m
ca

Nótese que las dependencias de APIs externos al código se han reducido a cero (luego veremos

cómo obtener los parámetros HTTP y otra información de contexto). Así, nuestra acción se puede

probar fácilmente y portarla a otro framework MVC es también mucho más sencillo.

campusvirtual.cualifica2.es
8 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Por supuesto, sigue siendo necesario mapear una determinada URL con la acción y asociar los

resultados con la vista a mostrar. Esto se hace en el struts.xml (o de manera alternativa con

anotaciones):

es
2.
ca
lifi
ua
l.c

Por defecto, la acción se asocia con una URL igual a su nombre seguido del sufijo ".action". En este

caso "login.action" sería el que dispara la acción.


ua

Por conveniencia Struts 2 ofrece una clase llamada ActionSupport de la que pueden heredar
rt

nuestras acciones. Una de las ventajas de usar ActionSupport es disponer de una serie de constantes
i
sv

predefinidas con posibles resultados de la acción, en lugar de usar Strings arbitrarios como en el

ejemplo anterior.
pu
m
ca

campusvirtual.cualifica2.es
9 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Como respuesta a una acción de un usuario Struts 2 creará una instancia de una
clase heredera de Action que hayamos definido como por ejemplo
"HelloWorldAction" y llamará a un método llamado execute(). Al finalizar el
código definido por la lógica de negocio deberá devolverse un String indicando el
tipo de resultado.

Verdadero.

Falso.

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
10 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Controlador con Servlet (Crear Vista.

En Struts un Action es responsable de llevar a cabo la lógica de negocio. El siguiente paso es la

representación de los datos resultantes a través de un Result.

A menudo hay reglas de navegación asociadas a los Results, Por ejemplo, si la responsabilidad del

action es autenticar un usuario, puede haber tres posibles resultados. 1 - Login con éxito; 2 -

Credenciales erróneas; 3 - Usuario bloqueado. Para estos tres posibles resultados tendríamos

es
tres distintas vistas.

2.
Generalmente para las vistas se utiliza JSP pero por otro lado Struts 2 no te obliga a usarlo, ya que

ca
el objetivo del patron MVC es mantener los distintos componentes independientes. Por ejemplo si

quieres devolver un resultado en JSON podrías definir tu propio tipo de result para llevarlo a cabo.

lifi
Además Struts 2 te permite utilizar otros motores de plantillas como Velocity y Freemaker.
ua
Como tipo de result por defecto si no se ha especificado uno tenemos dispatcher, con este result se
l.c

redirige hacia un Servlet, JSP, HTML etc.


ua

<!-- Esta es una version "resumida" -->


<result name="success">
rt

/HelloWorld.jsp
</result>
i

<!-- Tambien podemos podemos poner la ruta al jsp usando la etiqueta param -->
sv

<result name="success" type="dispatcher">


<param name="location">
/HelloWorld.jsp
pu

</param >
</result>
m

<!-- Aqui mostramos un result con su action asociado -->


<!-- En este caso tenemos un ejemplo que multiples results -->
ca

<action name="hello"
class="com.tutorialspoint.struts2.HelloWorldAction"
method="execute">
<result name="success" type="dispatcher">
<param name="location">
/HelloWorld.jsp
</param >
</result>
<result name="error" type="dispatcher">
<param name="location">
/Error.jsp
</param >
</result>
</action>

campusvirtual.cualifica2.es
11 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

A continuación tenemos un simple ejemplo del JSP que funciona con action con el parámetro name:

<%@ page contentType="text/html; charset=UTF-8" %>


<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Hello World</title>
</head>
<body>
Hello World, <s:property value="name"/>
</body>

es
</html>

2.
La directiva taglib indica al contenedor de servlets que esta página usará etiquetas de Struts 2 y

que serán precedidas por s. La etiqueta <s:property> muestra el valor de la propiedad name de

ca
una clase Action, recordemos que no accede directamente a la propiedad sino por un método get,

lifi
en este caso getName(). ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
12 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Controlador con Servlet (Crear Acción.

Para crear una acción simple, como único requisito es que tan solo tenemos que crear un método

sin argumentos que devuelva un string o resultado. Por ejemplo:

es
2.
ca
Esta puede interactuar con variables ya definidas en la clase, no solo con las que la acción ha

generado por ejemplo.

lifi
En nuestra clase podemos indicar que esta será utilizada por Struts para que sea tratada por una
ua
acción mediante:
l.c

@Action(value="formulario",results={@Result(name="enviado",location="/formulario.jsp")})
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
13 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Controlador con Servlet (Crear Servlet.

Antes de nada para utilizar un servlet en conjunto con Struts 2 debemos excluir su ruta del filtro de

Struts, para eso nos dirigirnos a struts.xml y definimos.

En este caso estamos utilizando una característica de Struts orientada a ignorar contenido estático.

es
También es necesario definir el servlet en el archivo web.xml junto con las características que le

2.
queremos dar.

ca
lifi
ua
l.c
ua
rt

Por último nos quedaría implementar el servlet como uno cualquiera en la ruta correspondiente a su
i

paquete y extender de HttpServlet.


sv
pu

import org.json.JSONObject;
/**
* Ejemplo simple para devolver un JSON en un servlet
m

*/
ca

public class ServletTaskList extends HttpServlet {


//.......................
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws
ServletException, IOException {

response.setContentType("application/json");
response.setHeader("Cache-Control", "nocache");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();

JSONObject json = new JSONObject();


json.put("Tarea 1", "Implementar servicios web");
json.put("Tarea 2", "Irte a casa");

out.print(json.toString());
}

campusvirtual.cualifica2.es
14 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
15 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Controlador con Filtro (Crear FilterDispatcher.

En Struts 2 FilterDispatcher forma parte de la API de Servlet. FilterDispatcher es el que se encarga

de redirigir las peticiones a los Action e Interceptors de Struts.

El FilterDispatcher se declara en el fichero web.xml de esta forma:

<filter>
<filter-name>struts2</filter-name>

es
<filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>
</filter>

2.
<filter-mapping>
<filter-name>struts2</filter-name>

ca
<url-pattern>/*</url-pattern>
</filter-mapping>

lifi
Mediante filter-mapping se indica que urls capta el filtro de Struts 2, en este caso y normalmente
ua
cualquier url empezando por la raíz ( / ).
l.c
ua
i rt
sv
pu
m
ca

campusvirtual.cualifica2.es
16 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Fichero Struts.xml.

El framework Struts 2 usa un fichero de configuración llamado struts.xml para inicializar sus
propios recursos. Estos recursos incluyen:

Interceptors que pueden realizar operaciones de pre-procesado y pos-procesado de las

peticiones.

Clases Action con la lógica de negocio.

Results que pueden crear vistas usando entre otros: JavaServer Pages (JSP), Velocity y

es
plantillas FreeMarker.

2.
En tiempo de ejecución, solo existe una configuración para la aplicación. Previamente, la

ca
configuración es definida a partir de uno o max ficheros XML, incluyendo el fichero por defecto
struts.xml. Existen diversos elementos que pueden ser configurados incluyendo packages,

lifi
namespaces, includes, actions, results, interceptors y exceptions.
Este fichero es esencial para la configuración de Struts 2 y debe estar en el classpath de la
ua
aplicacion web, "WEB-INF/classes".
l.c
ua
i rt
sv
pu
m
ca

La primera cosa que se aprecia es el DOCTYPE. Todo fichero de configuración necesita tener

definido el DOCTYPE correctamente como se muestra en el ejemplo. Es la etiqueta raíz desde la que

declaramos diferentes paquetes usando la etiqueta <package>. <package> nos ayuda a dividir y

modularizar la configuración. Es realmente útil cuando tenemos un gran proyecto que está dividido

en distintos módulos.

campusvirtual.cualifica2.es
17 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Atributo Descripción
name (obligatorio) Identificador único para el paquete.
extends Indica de que paquete extiende. Por defecto el paquete base es struts-default.
abstract Si es true, el paquete no está disponible para su utilización por el usuario final.
namespace Espacio de nombres unico para las actions.

También tenemos las etiquetas <action>, con ella indicamos que URL queremos acceder y

definimos que clase action será usada cada vez que se acceda a dicha URL.

Los Results determinan que se devuelve al navegador después de ejecutar un action. El String

es
devuelto debe coincidir con el nombre de un result. En el struts.xml los results pueden configurarse

2.
por cada action o como globales, por lo que podrán ser usados por todo action en el paquete. Results

ca
poseen unos atributos nombre y tipo opcionales, el nombre por defecto es "success". El struts.xml

puede crecer con el tiempo, por ello dividirlo en paquetes es una forma de modularizarlo, pero

lifi
también es posible dividirlo en ficheros xml diferentes e incluir dichas partes gracias a la etiqueta
ua
<include> junto al atributo file.
l.c

<?xml version="1.0" encoding="UTF-8"?>


<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
ua

"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
rt

<include file="struts1.xml"/>
<include file="struts2.xml"/>
</struts>
i
sv
pu
m

En tiempo de ejecución, solo existe una configuración para la aplicación.


Previamente, la configuración es definida a partir de uno o max ficheros XML,
ca

incluyendo el fichero por defecto struts.xml. Existen diversos elementos que


pueden ser configurados incluyendo packages, namespaces, includes, actions,
results, interceptors y exceptions.

Verdadero.

Falso.

campusvirtual.cualifica2.es
18 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Añadir Librerías Struts y crear Vista.

Generalmente la estructura de una aplicación web en Java sigue el siguiente esquema:

/ejemplo/ (ficheros públicos)

/ejemplo/META-INF/

/ejemplo/WEB-INF/

/ejemplo/WEB-INF/classes/ (Las clases compiladas de nuestra aplicación)

es
/ejemplo/WEB-INF/lib/ (Bibliotecas, aquí vendrían las de Struts)

/ejemplo/WEB-INF/web.xml (Fichero de configuración de nuestra aplicación, es usada por

2.
contenedores como Tomcat )

ca
Para trabajar con Struts como mínimo necesitamos las siguientes bibliotecas empaquetadas en

lifi
.jar: struts2-core.jar, xwork.jar, ognl.jar, javassist.jar, freemarker.jar, commons-
ua
logging.jar, commons-fileupload.jar, commons-io.jar, commons-lang3.jar y añadir un fichero de

configuración propio de Struts denominado struts.xml y que estará en el directorio /ejemplo/WEB-


l.c

INF/classes/.
ua

Para añadir las librerías de Struts en nuestro proyecto, desde nuestro IDE seleccionamos la opción
rt

correspondiente a la adición de librerías normales. Por ejemplo en Netbeans nos vamos a la carpeta
i

libraries y con el segundo botón pinchamos en “Add JAR/Folder”. Ahora en la carpeta donde
sv

descomprimimos Struts 2 habrá un directorio llamado “lib”, dentro del cual se encuentran los
pu

ficheros JAR que podremos utilizar.


m

En Struts las vistas son archivos de formato .JSP que permiten la interacción con el usuario, pero
ca

son llamados results.

Para la creación de results nos dirigimos al archivo struts.xml y añadiremos el nombre de los results

según la respuesta de las acciones. Por ejemplo si queremos que se vea una vista cuando sea

correcto y otra cuando se sea incorrecto.

< result >vista/correcto.jsp< /result >

< result name="”incorrecto”">vista/incorrecto.jsp< /result >

campusvirtual.cualifica2.es
19 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Crear Acción y fichero Struts.xml.

Para crear una acción simple, como único requisito es que tan solo tenemos que crear un método

sin argumentos que devuelva un string o resultado. Por ejemplo:

es
2.
ca
Esta puede interactuar con variables ya definidas en la clase, no solo con las que la acción ha

generado por ejemplo.

lifi
En nuestra clase podemos indicar que esta será utilizada por Struts para que sea tratada por una
ua
acción mediante:
l.c

@Action(value="formulario",results={@Result(name="enviado",location="/formulario.jsp")})
ua

El fichero Struts.xml es el que contiene las acciones del framework. Para que entren en el rol de
rt

funcionales las acciones deben estar declaradas en este fichero.


i
sv

Además de las acciones, en este fichero se declaran los parámetros generales de configuración y los

interceptores.
pu
m
ca

campusvirtual.cualifica2.es
20 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

es
2.
ca
lifi
Este es un ejemplo del fichero.
ua
l.c
ua
i rt
sv
pu
m
ca

campusvirtual.cualifica2.es
21 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Añadir Resultado a la Acción.

Podemos agregar un tipo de variable a la acción cuando esta es ejecutada de forma que cuando se

ejecuta esta devuelva ese resultado.

Esto hace que las acciones tengan comunicación con los demás elementos del proyecto, de esta

forma existe una correlación entre acciones y métodos.

También se pueden definir acciones que no devuelvan nada por si no es necesario y evitar la carga

es
de variables.

2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
22 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Clase ActionSupport.

Esta clase proporciona de forma predeterminada la implementación a las acciones más comunes

del proyecto. Es decir es la base de las clases Action. Con ella podemos ahorrarnos tiempo en

escribir código en muchas ocasiones, aportando los métodos y funciones que se pueden usar de

forma directa.

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
23 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Creación de la Acción con ActionSupport.

Las clases Action actúan como el controlador en el patrón MVC. Estas clases responden a una

acción de usuario, ejecutando la lógica de negocio, y luego devuelven un resultado que indica a

Struts qué vista renderizar.

Las clases de acción de Struts 2 suelen extender la clase ActionSupport, que es proporcionada por

Struts 2. La clase ActionSupport proporciona implementaciones predeterminadas para los métodos

es
más comunes (por ejemplo execution o input) y también implementa varias interfaces útiles. Una

clase que extienda a ActionSupport, puede sobrescribir los métodos predeterminados o heredarlas.

2.
ca
Este ejemplo muestra cómo se crearía una clase extendiendo de ActionSupport.

package com.ejemplo.welcome;

lifi
ua
import com.opensymphony.xwork2.ActionSupport;

public class HelloWorld extends ActionSupport{


l.c

private String message;


//................
public String execute(){
ua

message="Hello World!!!";
return SUCCESS;//Tenemos ERROR, INPUT, LOGIN, NONE, SUCCESS
}
rt

public getMessage(){
return message;
i
sv

}
public setMessage(String m){
message = m;
pu

}
//...................
}
m

Como vemos sobrescribimos el método execute() que es el necesario para que la acción se ejecute.
ca

campusvirtual.cualifica2.es
24 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Implementación de Interfaces de Contexto.

En Struts 2 nosotros no tenemos ningún objeto específico para http por defecto como en los

servlets. Si queremos algún objeto relacionado con HTTP en nuestra clase Action necesitamos

implementar alguna de las interfaces definidas en Struts 2 y que son denominadas "Aware

Interfaces".

Veremos 5 Aware Interfaces de Struts:

es
ApplicationAware

2.
SessionAware

ca
ServletRequestAware

lifi
ServletResponseAware

ParameterAware
ua
Cada una de las anteriores interfaces define un método setter, así que si implementamos dicho
l.c

método, en tiempo de ejecución será llamado automáticamente para inyectar el objeto requerido.
ua
rt

ApplicationAware
i
sv

Implementando la función setApplication obtenemos un objeto con el compartir información a través

de todos los componentes de nuestra aplicación.


pu

El código del Action:


m
ca

package com.ejemplo.welcome;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor;

public class HelloWorld extends ActionSupport implements ApplicationAware{


private Map<String,Object> appContext;
@Override
public void setApplication(Map m) {
this.appContext = m;
}

//................
@Override
public String execute(){
this.appContext.put("message", "Hello World!!!");

campusvirtual.cualifica2.es
25 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

return SUCCESS;//Tenemos ERROR, INPUT, LOGIN, NONE, SUCCESS


}
//...................
}

En la vista podemos acceder a dicho objeto mediante #application:

<%@ taglib prefix="s" uri="/struts-tags" %>

Mensaje <s:property value="#application.message" />

es
SessionAware

2.
Si implementamos el método setSession() de SessionAware obtendremos un objeto que es similar

al Session de servlets. Los atributos que se añadan a este objeto serán accesibles en las próximas

ca
peticiones del cliente.

package com.ejemplo.welcome;
lifi
ua
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor.SessionAware;
l.c

public class SessionAwareAction extends ActionSupport implements SessionAware {


String username,pass;
Map sessionContext;
ua

//...........................
//Setters y getters
rt

//............................
i

@Override
sv

public void setSession(Map m) {


this.sessionContext=m;
}
pu

@Override
public String execute() throws Exception {
m

sessionContext.put("username", username);
sessionContext.put("pass", pass);
ca

return SUCCESS;
}
}

La vista en JSP:

campusvirtual.cualifica2.es
26 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

es
2.
ca
lifi
ServletRequestAware
ua
Todos los Actions que necesiten acceso al objeto de la petición del servlet (HttpServletRequest)

deben implementar esta interfaz. Solo es relevante si es usada en un entorno servlet. Tenga en
l.c

cuenta que utilizar esta interfaz ata el Action al entorno de un servlet, por lo que debe ser evitado si

es posible ya que dificultara algunas cosas como pruebas unitarias.


ua
rt

package com.ejemplo.welcome;
import javax.servlet.http.HttpServletRequest;
i

import org.apache.struts2.interceptor.ServletRequestAware;
sv

public class TestAction implements ServletRequestAware{


pu

HttpServletRequest request;

public String execute() {


m

String param = getServletRequest().getParameter("param");


return "SUCCESS";
}
ca

public void setServletRequest(HttpServletRequest request) {


this.request = request;
}
}

ServletResponseAware

Similar a ServletRequestAware pero para el objeto respuesta, su setter es

setServletResponse(javax.servlet.http.HttpServletResponse response);

campusvirtual.cualifica2.es
27 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

ParameterAware

Esta interfaz ofrece a los Action una manera alternativa de recibir parámetros de entrada. El objeto

Map contendrá todos los parámetros como entradas nombre/valor. Nótese que todos los valores para

un parámetro serán devueltos, así que el tipo de los objetos (valor) en el Map son

java.lang.String[].

package com.ejemplo.welcome;
import javax.servlet.http.HttpServletRequest;

es
import org.apache.struts2.interceptor.ParameterAware;

public class ParameterAwareAction extends ActionSupport implements ParameterAware {

2.
String uname,pwd;
Map m;

ca
//.............................
//Setters y getters
//.............................

lifi
@Override
public void setParameters (Map m) {
this.m=m;
ua
}

@Override
l.c

public String execute() throws Exception {


m.put("uname", uname);
ua

m.put("pwd", pwd);
return SUCCESS;
}
rt

}
i
sv
pu

Implementando la función setApplication obtenemos un objeto con el compartir


información a través de todos los componentes de nuestra aplicación.
m
ca

Verdadero.

Falso.

campusvirtual.cualifica2.es
28 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Resultados de las Acciones

Cada vez que un Action finaliza su ejecución (execute()) devuelve un String que indica el estado del

resultado, utilizamos dicho String para decidir que vista debe renderizar el resultado guardado como

propiedades del Action. A esto lo denominamos un Result. Cada Result debe tener un nombre único

para un Action. La clase ActionSupport dispone de varias constantes con los nombres de results

más comunes: SUCCESS, NONE, ERROR, INPUT y LOGIN.

es
No es obligatorio devolver algunas de estas cadenas en la función execute(), se puede utilizar la

cadena de texto que se considere más apropiada para elegir la vista.

2.
ca
Struts 2 permite utilizar otras tecnologías a parte de jsp para representar las vistas como Velocity y

Freemaker:

lifi
ua
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
l.c

"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
ua

<constant name="struts.devMode" value="true" />


<package name="helloworld" extends="struts-default">
<action name="hello"
rt

class="com.test.example.HelloWorldAction"
method="execute">
i

<result name="success" type="dispatcher">


sv

<param name="location"> /helloWorld.jsp </param>


</result>
pu

<result name="error" type="freemaker">


<param name="location"> /error.fm </param>
</result>
m

</action>
</package>
ca

</struts>

Como se puede ver para la accion hello, hay dos posibles resultados, success y error, esta ultima

utiliza Freemaker.

campusvirtual.cualifica2.es
29 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Cambiar resultados de las acciones

Los resultados de las acciones, una vez obtenidos, pueden ser modificados al antojo del

desarrollador. De esta manera se puede lograr una gran versatilidad de acciones que compartan

una misma variable y se vaya cambiando conforme va pasando por estos.

Una variable puede ser cambiada mediante métodos de Struts como ActionMapping que nos

permite obtener una variable de una acción para después poder cambiarla según convenga y

es
trabajar con ella.

2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
30 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Struts Tags.

Struts 2 ofrece un conjunto de etiquetas para ser utilizadas en las vistas.

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


pageEncoding="ISO-8859-1"%>
<%@ taglib prefix="s" uri="/struts-tags" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
"http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>

es
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
<title>Ejemplo básico de las etiquetas de Struts</title>

2.
</head>
<body>
<h1>¡Bienvenido!</h1>

ca
<p><a href="<s:url action='hello'/>">Hello World</a></p>
<p>Te he dicho hola <s:property value="helloCount" /> veces!</p>

lifi
</body>
</html> ua
Como podemos ver hemos definido el conjunto de tags de Struts con el prefijo s. La función principal

de la etiqueta <s:url> es crear enlaces a actions, especialmente a otros recursos de la aplicación


l.c

local. Mientras que <s:property> permite acceder a propiedades del action. En la documentación
ua

de Struts 2 se puede encontrar un listado completo de las etiquetas disponibles.


i rt
sv
pu
m
ca

campusvirtual.cualifica2.es
31 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Object Graph Navigation Language (OGNL).

Es un lenguaje de expresiones utilizado generalmente para poder editar o fijar los valores de las

propiedades seleccionadas. Si por ejemplo tenemos un formulario del cual obtenemos una

expresión, después podemos utilizar las funciones de este lenguaje para cambiar alguna propiedad

del formulario y que este cambie su funcionalidad también.

Podemos decir que es una versión más simple en cuanto a expresiones se refiere que el lenguaje

es
original Java dado que el número de estas es mucho menor aunque de funcionalidad muy potente.

2.
En Struts nos permite acceder al contexto de un Action (ActionContext). Por ejemplo tenemos el

ca
siguiente Action con un array de muestra:

lifi
package com.test.ejemplo; ua
public class TestAction {

private String[] sampleArray;


l.c

{
sampleArray = new String[]{"1","2","5"};
}
ua

public String execute()


{
return "success";
rt

}
public String[] getSampleArray() {
i
sv

return sampleArray;
}
public void setSampleArray(String[] sampleArray) {
pu

this.sampleArray = sampleArray;
}
}
m

Y tenemos el siguiente fragmento de vista que accede a dicho array, en el que utilizamos
ca

expresiones OGNL de la siguiente manera:

<b>sampleArray :</b> <s:property value="sampleArray"/> <br>


<b>sampleArray.length :</b> <s:property value="sampleArray.length"/> <br>
<b>sampleArray[0] :</b> <s:property value="sampleArray[0]"/> <br>
<b>[0].sampleArray :</b> <s:property value="[0].sampleArray"/> <br>
<b>top.sampleArray :</b> <s:property value="top.sampleArray"/> <br>

campusvirtual.cualifica2.es
32 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Crear Formulario con Form Tags.

Para comenzar con la creación de formularios, lo primero es declarar que vamos a insertar un

form en nuestro HTML y después iremos introduciendo campos y elementos.

Con la etiqueta s:form indicamos que vamos a introducir un formulario.

es
Después vamos incluyendo los elementos que queramos dentro de las etiquetas de este form.

2.
ca
lifi
ua
l.c

Después solo tenemos que crear el Action que gestione la funcionalidad del form, que veremos más

adelante.
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
33 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Crear Acciones.

Para crear una acción simple, como único requisito es que tan solo tenemos que crear un método sin

argumentos que devuelva un string o resultado. Por ejemplo:

es
2.
ca
Esta puede interactuar con variables ya definidas en la clase, no solo con las que la acción ha

generado por ejemplo.

lifi
En nuestra clase podemos indicar que esta será utilizada por Struts para que sea tratada por una
ua
acción mediante:
l.c

@Action(value="formulario",results={@Result(name="enviado",location="/formulario.jsp")})
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
34 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Acceder a la Pila de Valores.

La pila de valores consiste en un almacén donde pueden guardarse todo tipo de variables de

forma que tengamos un acceso desde cualquier parte de nuestra aplicación a todas las

variables que se encuentren en su interior.

Esto ayuda a solucionar algunos problemas de herencia y facilita la obtención de variables en

cualquier punto. Si por ejemplo tememos una vista que necesita del uso de las variables que se

es
encuentran en un controlador, estas se pueden obtener de la pila mediante el uso del lenguaje OGNL

visto anteriormente.

2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
35 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Creación de Acciones para Form Tags.

Una vez tengamos nuestro formulario listo, podemos proceder con las acciones. Para ello como

hemos visto anteriormente nos tenemos que crear la clase que llevará estas acciones, en mi caso la

llamaré formularioAction. Además esta extenderá de ActionSupport para que tengamos los métodos

propios

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu

Ya tenemos nuestras acciones listas para ser usadas por la aplicación. Después podemos proceder a

mostrar los datos recibidos por el cliente por ejemplo o trabajar dentro de la aplicación con ellos.
m
ca

campusvirtual.cualifica2.es
36 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Atributos List, ListKey y ListValue.

Con Struts podemos realizar una lista de elementos mediante la etiqueta <select> a la cual se le

puede agregar una lista de opciones que son seleccionables por el usuario. Esta etiqueta posee,

entre varios, los atributos List, Listkey y ListValue.

List nos permite seleccionar el conjunto de opciones de una lista predeterminada para agregarlas a

nuestro select.

es
ListKey. Propiedad de la lista de objetos para obtener el valor del campo.

2.
ListValue. Indica la propiedad de la lista de opciones para obtener el contenido del campo.

ca
Por ejemplo:

lifi
ua
<s:select key="person.residency" list="states" listKey="stateId" listValue="stateName" />

En este caso se llamará a un método getStates() del Action correspondiente para obtener un listado
l.c

de objetos que representan estados, cada objeto State tendrá un método getStateId() y
ua

getStateName().
i rt
sv
pu
m
ca

campusvirtual.cualifica2.es
37 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Generic Tags.

Las etiquetas genéricas se utilizan para controlar el flujo de ejecución cuando las páginas se

renderizan. Estas también se utilizan para la extracción de datos provenientes de las acciones o

desde la pila de valores.

Las etiquetas de control, pertenecientes a las genéricas, que proporcionan un flujo de control

mediante el uso de If y Else o iteradores. También están las etiquetas de datos las cuales permiten la

es
manipulación de datos o creación de conjunto de objetos entre otros.

2.
Siguiendo un esquema podemos ver los dos grupos:

ca
Control

lifi
- if
ua
- else
l.c

- elseif
ua

- append
rt

- generator
i
sv

- iterator
pu

- merge
m

- sort
ca

Datos

-a

- action

- bean

- date

campusvirtual.cualifica2.es
38 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

- debug

- include

- param

- property

- set

es
- text

2.
- url

ca
lifi
Las etiquetas genéricas se utilizan para controlar el flujo de ejecución cuando las
páginas se renderizan. Estas también se utilizan para la extracción de datos
ua
provenientes de las acciones o desde la pila de valores.
l.c

Verdadero.
ua

Falso.
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
39 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Crear Acción para Listado.

También existen acciones que podemos crear para gestionar nuestra lista. Los métodos más básicos

son para rellenarla y obtenerla para utilizarla. Este sería un ejemplo de la clase listado.

es
2.
ca
lifi
ua
l.c
ua
rt

Posteriormente, en nuestro XML definimos la acción para la lista.


i
sv
pu
m
ca

Existen muchas más funciones que dependiendo de las necesidades a la hora de trabajar con listas

podamos necesitar.

campusvirtual.cualifica2.es
40 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Utilizar Generic Tags.

Vamos a ver un ejemplo con las etiquetas de control, más concretamente con if, else y elseif.

es
2.
ca
De esta manera podemos controlar las partes de código HTML que se ejecutarán y las partes que no.

lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
41 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Programar Ordenación.

Existen varias maneras de ordenar dependiendo del tipo de dato y de la finalidad a la que se les

adjudica. Si por ejemplo tenemos un array con diferentes valores enteros y queremos ordenarlos de

mayor a menor, podemos utilizar varias técnicas.

Una de ellas puede ser la utilización de varios arrays para ir recogiendo los valores e ir

guardándolos en estos arrays auxiliares dependiendo de si es menor que el anterior que lo vaya

es
insertando.

2.
Cuando los elementos son de tipo String, existen funciones para arrays de ordenación ya

ca
predefinidas, que podemos utilizar desde Struts.

lifi
ua
l.c
ua
i rt
sv
pu
m
ca

campusvirtual.cualifica2.es
42 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Validación de Entrada.

Las validaciones de entrada nos permiten filtrar los campos que el usuario tiene que introducir

para que no existan errores en la ejecución. Si por ejemplo tenemos un campo nombre, contraseña

y otro edad, solo necesitamos obligatoriamente que inserte los dos primeros.

Por ello con la validación podemos indicar que debe insertar esos dos y el tercero por si quiere el

usuario.

es
La realización de validaciones en Struts es bastante simple respecto a otros lenguajes, ya que posee

2.
varias formas de validación y podemos elegir la que mejor nos convenga. Estas son:

ca
Mediante un archivo XML.

lifi
Mediante manuales. ua
Con anotaciones.
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
43 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Crear el formulario.

Para comenzar con la creación de formularios, lo primero es declarar que vamos a insertar un

form en nuestro HTML y después iremos introduciendo campos y elementos.

Con la etiqueta s:form indicamos que vamos a introducir un formulario.

es
Después vamos incluyendo los elementos que queramos dentro de las etiquetas de este form.

2.
ca
lifi
ua
l.c

Después solo tenemos que crear el Action que gestione la funcionalidad del form, que veremos más

adelante.
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
44 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Crear primeras validaciones.

Vamos a crear un formulario que solicite al usuario los datos obligatorios. Nos quedará algo así:

es
2.
Ahora le agregamos los campos que serán obligatorios con el atributo required.

ca
lifi
ua
l.c

Una vez tengamos el formulario vamos ver cómo crear nuestro validador mediante XML.
ua

Creamos el archivo XML y le llamamos “validacionFormulario.xml”. Dentro de este las validaciones


rt

se encuentran entre las etiquetas < validators >.


i
sv
pu
m
ca

Como vemos dentro de estas etiquetas nos encontramos con las que nos determinan el elemento al

que queremos validar, estas son < field > con el atributo name y el nombre del campo. < / field >

campusvirtual.cualifica2.es
45 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Dentro de esta introducimos la etiqueta < field-validator >, la cual establece una validación según el

tipo que necesitemos. En este caso como queremos que se introduzcan algún string, será del tipo

“requiredstring”. < / field-validator >

Por último, podemos ver como con le indicamos las propiedades mínimas y con < message > se

mostrará un mensaje por si falla la validación. < / message >

es
2.
ca
lifi
ua
l.c
ua
i rt
sv
pu
m
ca

campusvirtual.cualifica2.es
46 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Tipos de validación.

Podemos definir las validaciones en varios tipos. La lista de validaciones se representa como:

Required. Revisa que el campo no esté vacío.

Requiredstring. Igual que el anterior pero el string debe ser mayor de 0.

Stringlength. Verifica que la cadena tenga una longitud fijada por el desarrollador.

Int, double, long y short. Revisa que estos números estén entre los valores fijados.

es
Email. Verifica que el formato introducido pertenezca a un email.

2.
url. Verifica que el formato introducido pertenezca a una url.

ca
visitor. Permite enviar los datos introducidos al Action de forma que este sea el que los

verifique.

lifi
Fieldexpression. Verifica si cumple las reglas del lenguaje OGNL
ua
conversion. Verifica si se produce algún problema de conversión.
l.c
ua
i rt
sv
pu
m
ca

campusvirtual.cualifica2.es
47 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Etiquetas Set y Push.

Las etiquetas Set y Push permiten la inclusión de propiedades en un elemento. Por ejemplo si

queremos que un input tenga un nuevo atributo name y no lo hemos definido antes, podemos utilizar

Push.

es
Si por otro lado queremos cambiar el valor de ese atributo, mediante Set podemos fijar el nuevo

2.
valor de forma muy rápida. Esto es muy útil cuando una expresión es muy compleja y no deseas

ca
tener que buscarla perdiendo más tiempo del necesario.

lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
48 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Validación Personalizada.

La validación en Struts 2 es configurada a través de XML o anotaciones. La validación manual

en los Action también es posible, y puede ser combinada con validación por XML o con

anotaciones. La validación también depende de los interceptores de validación y flujo de trabajo

(ambos incluidos en el stack de interceptores por defecto). El interceptor de validación realiza la

validación por sí mismo y crea una lista de errores específicos para cada campo. El interceptor del

flujo de trabajo comprueba la presencia de errores de validación, si alguno es encontrado se

es
devuelve el resultado "input" (por defecto), devolviendo al usuario el formulario que contiene los

2.
errores de validación.

ca
Antes de comenzar con la validacion en los Action mostraremos un ejemplo de validación en xml. La

lifi
convención para nombrar ficheros de validación XML es <nombre clase Action>-Validation.xml,

ejemplo simple de validación (Login-Validation.xml):


ua
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//EN"
l.c

"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
ua

<validators>
<field name="userName">
<field-validator type="requiredstring">
rt

<message>User Name is required.</message>


</field-validator>
i

</field>
sv

<field name="password">
<field-validator type="requiredstring">
pu

<message key="password.required" />


</field-validator>
</field>
m

</validators>
ca

<field> contiene el nombre del parámetro a validar y <field-validator> el tipo de validación a

llevar a cabo. En el ejemplo podemos ver que con la contraseña indicamos un parámetro en lugar de

escribir el mensaje, es recomendable guardar los mensajes de error en un fichero de propiedades.

Si estamos usando la configuración por defecto y nuestro Action no tiene el resultado input

definido y se da lugar validación de errores, obtendremos un mensaje de error informando de ello.

En struts.xml el Action quedaría así:

<struts>

campusvirtual.cualifica2.es
49 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

<package name="default" extends="struts-default">


<action name="Login" class="com.test.Login">
<result name="input">/login.jsp</result>
<result name="success">/success.jsp</result>
</action>
</package>
</struts>

Como hemos comentado el interceptor de flujo de trabajo (workflow interceptor) comprueba si el

Action implementa la interfaz Validateable, si es así, se llamará al método validate() que

implementa dicha clase. El método validate() no devuelve errores sino que son almacenados con la

es
ayuda de la interfaz ValidationAware.

2.
Una vez finalizado el método validate() el interceptor comprobará si se han generado errores de

ca
validación, si ha sido así se detendrá el procesamiento de la petición y se transferirá el control a la

página input con los mensajes de error apropiados. Para cada campo los mensajes de error pueden

lifi
ser añadidos usando el método addFieldError(). Los mensajes de error pueden ser añadidos
ua
directamente o especificados en un fichero propiedades separado.
l.c

La clase ActionSupport ya implementa la interfaz Validateable y ValidationAware, solo requeriría

sobrescribir la función validate() para llevar a cabo una validación:


ua

package com.test.ejemplo;
rt

import com.opensymphony.xwork2.ActionSupport;
i
sv

public class NewUserAction extends ActionSupport{


//................................
pu

//Codigo

public void validate(){


m

if (nombre == null || nombre.trim().equals("")){


addFieldError("nombre","El nombre es obligatorio");
ca

}
}
}

La convención para nombrar ficheros de validación XML es -Validation.xml

campusvirtual.cualifica2.es
50 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Verdadero.

Falso.

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
51 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Añadir lógica de validación.

Otro método de validación se lleva a cabo creando ficheros xml en el mismo directorio que las

clases. La validación por XML de Struts2 provee opciones predefinidas de validación como

validación de email, rango de enteros, campos de formularios, validación con expresiones regulares,

longitud de texto etc.

Los ficheros xml deben llamarse <nombre clase>-validation.xml. Como por ejemplo Employee-

es
validation.xml con el siguiente contenido:

2.
<!DOCTYPE validators PUBLIC

ca
"-//OpenSymphony Group//XWork Validator 1.0.2//EN"
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
<validators>

lifi
<field name="name">
<field-validator type="required">
<message>
ua
El nombre es obligatorio
</message>
</field-validator>
l.c

</field>

<field name="age">
ua

<field-validator type="int">
<param name="min">29</param>
rt

<param name="max">64</param>
<message>La edad debe estar comprendida entre 28 y 65</message>
i

</field-validator>
sv

</field>
<!-- Podemos definir multiples validadores por campo -->
<field name="email_address">
pu

<field-validator type="required">
<message>El email es obligatorio.</message>
</field-validator>
m

<field-validator type="email">
<message>El email introducido no es valido.</message>
ca

</field-validator>
</field>

<field name="contract_date">
<field-validator type="date">
<param name="min">1/1/2016</param>
<param name="max">1/1/2017</param>
<message>
Fecha de contrato fuera de plazo
</message>
</field-validator>
</field>
</validators>

Como podemos ver ser puede incluir varios validadores para un mismo parámetro.

campusvirtual.cualifica2.es
52 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
53 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Interceptores y Conversión de tipos.

Los interceptores pueden ejecutar código antes y después de que una acción sea llamada. Este es

un elemento que suele incluirse en la mayoría de los frameworks debido a la gran versatilidad que

presenta, pero en Struts tiene una relevancia muy importante ya que se utiliza en las principales

funcionalidades del mismo framework.

Dentro de los interceptores podemos encontrar funciones como la doble seguridad en formularios,

es
es decir que se realiza la comprobación dos veces, una antes de invocar a la acción y otra después

por si se produce algún error.

2.
ca
Otra es la de conversión de tipos, la cual se realiza antes de enviar cualquier campo rellenado, y

también la validación se puede realizar mediante interceptores además de otras muchas funciones.

lifi
Imagen obtenida por la página oficial de Struts, https://struts.apache.org.
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
54 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Crear el formulario.

A la hora de crear el formulario, para indicar el interceptor dentro de este lo hacemos en el archivo

struts.xml, de tal forma que se ejecute antes de la Acción.

es
2.
ca
lifi
ua
Este interceptor se ejecutará de forma automática y dependiendo de su resultado seguirá hasta la

acción o no. Si el desarrollador quiere que se ejecute la acción dependiendo de distintos resultados
l.c

que pueda devolver el interceptor, deberá ser programado.


ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
55 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Crear conversor personalizado.

Podemos crear conversores de forma que con una clase que extienda de StrutsTypeConverter,

nos permita fijar la conversión según necesitemos.

Veamos un ejemplo de cómo quedaría la clase para pasar de un objeto a un String y viceversa.

es
2.
ca
lifi
Para añadir el conversor a una determinada acción, podemos hacerlo mediante un fichero
ua
properties.
l.c

Debemos de nombrar a este de manera que la estructura quede: “NombreClaseAcción-


ua

conversion.properties”. Ahora podremos definir en este archivo el nuevo conversor que hemos

creado y que la acción pueda utilizarlo.


irt
sv
pu
m
ca

campusvirtual.cualifica2.es
56 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Interceptores ModelDriven y Prepare.

El interceptor de ModelDriven hace que los modelos de otros objetos pasen a ser los modelos por

defecto y podamos acceder a ellos de forma muy versátil, mediante la utilización de métodos como

pueden ser getModel().

Para su utilización, necesitamos incluir el interceptor en la acción a la que queremos asociarlo.

es
2.
ca
lifi
El interceptor Prepare es muy útil para cualquier situación donde necesitas asegurar que algunas

operaciones se ejecuten antes que otros métodos. Un ejemplo es por ejemplo cuando una operación
ua
es fijar los parámetros de un objeto que se encuentra en una base de datos. Si no existe el objeto
l.c

porque aún no se ha rescatado de la base, es imposible fijar los parámetros por lo que se produciría

un error.
ua

Por ello los interceptores Prepare son tan útiles en determinadas ocasiones. También es necesario
rt

que la clase a la que se apliquen implementen la interfaz Preparable.


i
sv
pu
m
ca

campusvirtual.cualifica2.es
57 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Implementación de ModelDriven.

Con la implementación de ModelDriven, la clase en cuestión obtiene la capacidad de transferir

datos dentro del objeto de forma automática. Esto es debido a que cuando se realiza una petición los

parámetros recibidos son guardados en un modelo. La validación posterior se realizará en este

modelo.

es
2.
ca
lifi
ua
Este es un ejemplo de la clase que implementa ModelDriven, la cual implementa la interfaz propia y

el método getModel().
l.c

Después creamos el objeto Persona() con los campos que necesitemos para por último pasar al
ua

archivo JSP y crear un nuevo objeto persona mediante el uso de un formulario.


irt
sv
pu
m
ca

campusvirtual.cualifica2.es
58 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Implementación de Prepare - Acción.

Necesitamos crear la clase que implemente la interfaz Preaprable.

es
2.
ca
lifi
ua
l.c
ua
irt
sv

Si lo ejecutamos podemos ver como primero se ejecuta prepare y después execute. De esta manera

se nos permite ejecutar determinadas acciones antes de que se realice el envío del formulario.
pu
m
ca

campusvirtual.cualifica2.es
59 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Implementación de Prepare - Struts.xml.

Para la declaración del interceptor Prepare, tan solo tenemos que crear un action que referencie a

este. El código sería:

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
60 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Autorización y Autenciación.

La autorización se produce mediante un servlet, el cual pertenece a la clase RequestProcessor.

Este analiza las peticiones provenientes de los navegadores y dependiendo de las características de

cada uno y de las acciones a realizar se permitirá el acceso a algunos usuarios u otros.

Esta parte más específica de los usuarios y roles es realizada por el método proccessRoles, el cuál

rescata los roles de los usuarios provenientes del navegador y determina si tienen acceso a algunas

es
acciones o no.

2.
Struts es un framework que necesita de un buen control de usuarios y permisos mediante la

ca
utilización de JAAS, o el control de usuarios de Java.

lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
61 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Roles y Usuarios.

Para poder fijar por nuestra cuenta los roles existentes en Struts, debemos modificar el archivo

web.xml, de tal manera que indiquemos un rol para cada acción que queramos que la ejecute. Por

ejemplo:

es
2.
Si algún usuario que no pertenezca a este rol intenta realizar el envío del formulario, este recibirá

una excepción por ser no autorizado.

ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
62 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Restringir Acceso.

Para restringir el acceso a determinador roles, podemos declararlos como no inseguros para así

indicar a Struts que no pueden acceder a esa acción. El ejemplo sería:

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
63 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Definir autenticación.

Como hemos visto anteriormente, podemos declarar una acción para que no se ejecute cuando un

usuario no pertenezca a un rol. La mejor manera de mantener total seguridad en nuestra aplicación

web es hacer que el usuario tenga que navegar por menús bastante generales y de esta manera

poder filtrar las opciones.

Esta forma es algo más lenta de programar y desarrollar pero hace que un usuario que no tenga casi

es
permisos este “encerrado” en un grupo de opciones y no llegue a ver si quiera todas las opciones

que existen.

2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
64 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Autenticación por formularios.

Se puede realizar una autenticación en formularios de tal forma que cuando un usuario rellene

los campos se comprueben los datos de este. Una vez obtenidos se podrá actuar en efecto de lo

que se necesite.

Por ejemplo, si un usuario rellena un formulario y no tiene permiso para acceder a más ofertas de

productos, el formulario le enviará a una página sin estas, pero si por el contrario su rol expone que

es
este usuario si debe visitar ofertas la acción será enviarle a una página con ellas.

2.
ca
lifi
ua
l.c
ua
i rt
sv
pu
m
ca

campusvirtual.cualifica2.es
65 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Mensajes e Internacionalización.

Cuando se produce algún error o problema a la hora de utilizar la aplicación es necesario indicar al

cliente de donde provienen estos y que soluciones pueden existir.

Por ejemplo seguimos con el caso de los formularios, si el usuario no ha introducido un nombre

correcto, deberemos decirle que lo cambie para poder realizar el envío de formularios.

Si queremos que se muestren mensajes personalizados, la manera más rápida sería indicarlos con el

es
atributo errors.

2.
errors.required=debes indicar un nombre

ca
Esto se incluye dentro del fichero properties.

lifi
La internacionalización se basa en la creación de aplicaciones que no tengan fronteras lingüísticas.
ua
Esto se facilita en gran medida mediante las opciones que nos da Java para crear una aplicación que
l.c

dependiendo del usuario, automáticamente se pueda versionar en su idioma.


ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
66 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Crear el formulario.

Para comenzar con la creación de formularios, lo primero es declarar que vamos a insertar un

form en nuestro HTML y después iremos introduciendo campos y elementos.

Con la etiqueta s:form indicamos que vamos a introducir un formulario.

es
Después vamos incluyendo los elementos que queramos dentro de las etiquetas de este form.

2.
ca
lifi
ua
l.c

Después solo tenemos que crear el Action que gestione la funcionalidad del form, que veremos más

adelante.
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
67 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Añadir mensajes e internacionalización.

Una web es accesible en todo el mundo por lo que adaptarse a múltiples idiomas es algo

esencial. Aunque una aplicación web no este pensada originalmente para ser usada fuera de un país

como todo en la vida este hecho puede cambiar y frameworks como Spring nos ofrecen desde un

principio herramientas para poder mostrar mensajes y textos en los idiomas que soportemos,

aunque en principio solo sea uno veremos que en el futuro será más sencillo añadir nuevos idiomas o

cambiar nuestros textos sin revisar a mano nuestras vistas o código.

es
A continuación un ejemplo de un Controller que utiliza la clase Locale:

2.
ca
package com.test.ejemplo;

lifi
import java.util.Locale;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
ua
//...otros import
@Controller
public class HomeController {
l.c

private static final Logger logger = LoggerFactory.getLogger(HomeController.class);

@RequestMapping(value = "/", method = RequestMethod.GET)


ua

public String home(Locale locale, Model model) {


logger.info("Pagina de bienvenida: el locale del cliente es {}.", locale);
return "home";
rt

}
}
i
sv

La vista en JSP:
pu

<%@taglib uri="http://www.springframework.org/tags" prefix="spring"%>


m

<%@ page session="false"%>


<html>
ca

<head>
<title><spring:message code="label.title" /></title>
</head>
<body>
<form method="post" action="login">
<table>
<tr>
<td><label> <strong><spring:message
code="label.firstName" /></strong>
</label></td>
<td><input name="firstName" /></td>
</tr>
<tr>
<td><label> <strong><spring:message
code="label.lastName" /></strong>

campusvirtual.cualifica2.es
68 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

</label></td>
<td><input name="lastName" /></td>
</tr>
<tr>
<spring:message code="label.submit" var="labelSubmit"></spring:message>
<td colspan="2"><input type="submit" value="${labelSubmit}" /></td>
</tr>
</table>
</form>
</body>
</html>

Podemos observar que se utiliza la etiqueta <spring:message> (spring: es el prefijo definido en la

es
primera línea) para recuperar un mensaje a partir de un código que lo identifica.

2.
Para poder utilizar las funciones de internacionalización la configuración quedaría de esta manera:

ca
lifi
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
ua
xmlns:mvc="http://www.springframework.org/schema/mvc"
xsi:schemaLocation="http://www.springframework.org/schema/beans
http://www.springframework.org/schema/beans/spring-beans.xsd
l.c

http://www.springframework.org/schema/mvc
http://www.springframework.org/schema/mvc/spring-mvc.xsd
http://www.springframework.org/schema/context
ua

http://www.springframework.org/schema/context/spring-context.xsd ">

<mvc:annotation-driven />
rt

<context:component-scan base-package="com.memorynotfound" />


i
sv

<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages"/>
pu

<property name="defaultEncoding" value="UTF-8"/>


</bean>
m

<bean id="cookieResolver" class="org.springframework.web.servlet.i18n.CookieLocaleResolver">


<property name="defaultLocale" value="en"/>
ca

<property name="cookieName" value="locale-cookie"/>


<property name="cookieMaxAge" value="3600"/>
</bean>

<mvc:interceptors>
<bean class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="lang"/>
</bean>
</mvc:interceptors>

<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
<property name="prefix" value="/WEB-INF/views/" />
<property name="suffix" value=".jsp" />
</bean>

campusvirtual.cualifica2.es
69 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

</beans>

Los mensajes son guardados en ficheros de propiedades con el formato

messages_<idioma>.properties en el classpath de esta forma (messages_en.properties):

label.title=Login Page

label.firstName=First Name

label.lastName=Last Name

label.submit=Login

es
label.welcome_with_name=Hello, {0}

2.
Como se puede observar en la última propiedad se utiliza un parámetro en el mensaje.

ca
Cuando se produce algún error o problema a la hora de utilizar la aplicación es necesario indicar al

lifi
cliente de dónde provienen estos y que soluciones pueden existir.
ua
Por ejemplo seguimos con el caso de los formularios, si el usuario no ha introducido un nombre
l.c

correcto, deberemos decirle que lo cambie para poder realizar el envío de formularios.
ua

Si queremos mostrar mensajes de error los mejor sería definirlos en un fichero properties aparte,

por ejemplo con el nombre errors_<idioma>.properties e indicándolo en la configuración de esta


rt

manera:
i
sv

<property name="basename" value="classpath:errors"></property>


pu

y en el fichero:
m

errors.required=debes indicar un nombre


ca

Esto se incluye dentro del fichero properties.

La internacionalización se basa en la creación de aplicaciones que no tengan fronteras lingüísticas.

Esto se facilita en gran medida mediante las opciones que nos da Java para crear una aplicación que

dependiendo del usuario, automáticamente se pueda mostrar en su idioma.

campusvirtual.cualifica2.es
70 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Capa de Persistencia.

Aunque estemos trabajando en el contexto de un framework como Struts2 nada nos impide utilizar

otras tecnologías como las orientadas a la persistencia de objetos. En este caso veremos la

integración de Struts2 con Hibernate. Hibernate es una biblioteca ORM (Object Relational

Mapping) que ofrece una capa de abstracción sobre las conexiones y consultas a las bases de datos

además de mapear propiedades de los objetos a atributos de una tabla. Más adelante veremos con

más detalle Hibernate.

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
71 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Preparar enlace a datos.

Necesitamos definir un fichero de configuración donde definimos la información para establecer una

conexión a la base de datos, el fichero debe estar disponible en el classpath y debe llamarse

hibernate.cfg.xml:

<?xml version='1.0' encoding='utf-8'?>


<!DOCTYPE hibernate-configuration PUBLIC
"-//Hibernate/Hibernate Configuration DTD//EN"

es
"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd">

<hibernate-configuration>

2.
<session-factory>
<property name="hibernate.connection.driver_class">c

ca
om.mysql.jdbc.Driver
</property>

lifi
<property name="hibernate.connection.url">
jdbc:mysql://www.test.com/struts
</property>
ua
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password"></property>
<property name="hibernate.connection.pool_size">10</property>
l.c

<property name="show_sql">true</property>
<property name="dialect">
org.hibernate.dialect.MySQLDialect
ua

</property>
<property name="hibernate.hbm2ddl.auto">update</property>
<mapping class="com.test.hibernate.Student" />
rt

</session-factory>
</hibernate-configuration>
i
sv

Como podemos ver hemos definido el "dialecto" que utilizara Hibernate para llevar a cabo las
pu

consultas. Ademas de los datos de acceso y definir la clase en la que realizar el mapeo a una tabla.
m
ca

campusvirtual.cualifica2.es
72 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Implementación de la capa de persistencia.

A continuación definimos una clase que representara un objeto almacenado en la base de datos. Con

Hibernate no influye qué base de datos utilizamos ya que se encarga de traducir las consultas y los

tipos de datos.

package com.test.hibernate;

import javax.persistence.Column;

es
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.Id;

2.
import javax.persistence.Table;

ca
@Entity
@Table(name="student")

lifi
public class Student {

@Id
ua
@GeneratedValue
private int id;
@Column(name="last_name")
l.c

private String lastName;


@Column(name="first_name")
private String firstName;
ua

private int marks;


public int getId() {
return id;
rt

}
public void setId(int id) {
i

this.id = id;
sv

}
public String getLastName() {
pu

return lastName;
}
public void setLastName(String lastName) {
m

this.lastName = lastName;
}
ca

public String getFirstName() {


return firstName;
}
public void setFirstName(String firstName) {
this.firstName = firstName;
}
public int getMarks() {
return marks;
}
public void setMarks(int marks) {
this.marks = marks;
}
}

campusvirtual.cualifica2.es
73 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Implementación del patrón DAO.

En el patrón DAO (Data Access Object), se define una interfaz que recoge los métodos que se

pueden realizar sobre un modelo, como obtener un listado o guardar un modelo concreto. En este

caso definimos una clase que hace la función de DAO:

Esta clase DAO nos permitirá realizar un par de acciones con el modelo:

es
package com.tutorialspoint.hibernate;

import java.util.ArrayList;

2.
import java.util.List;

ca
import org.hibernate.Session;
import org.hibernate.Transaction;

lifi
import com.googlecode.s2hibernate.struts2.plugin.\
annotations.SessionTarget;
import com.googlecode.s2hibernate.struts2.plugin.\
ua
annotations.TransactionTarget;
l.c

public class StudentDAO {

@SessionTarget
ua

Session session;

@TransactionTarget
rt

Transaction transaction;
i

@SuppressWarnings("unchecked")
sv

public List<Student> getStudents()


{
pu

List<Student> students = new ArrayList<Student>();


try
{
m

students = session.createQuery("from Student").list();


}
catch(Exception e)
ca

{
e.printStackTrace();
}
return students;
}

public void addStudent(Student student)


{
session.save(student);
}
}

Aquí mostramos una clase Action que utiliza el modelo y el DAO:

campusvirtual.cualifica2.es
74 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

package com.test.hibernate;

import java.util.ArrayList;
import java.util.List;

import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
import com.tutorialspoint.hibernate.Student;
import com.tutorialspoint.hibernate.StudentDAO;

public class AddStudentAction extends ActionSupport


implements ModelDriven<Student>{

es
Student student = new Student();
List<Student> students = new ArrayList<Student>();
StudentDAO dao = new StudentDAO();

2.
@Override
public Student getModel() {

ca
return student;
}

lifi
public String execute()
{
ua
dao.addStudent(student);
return "success";
}
l.c

public String listStudents()


{
ua

students = dao.getStudents();
return "success";
}
rt

public Student getStudent() {


i

return student;
sv

}
pu

public void setStudent(Student student) {


this.student = student;
}
m

public List<Student> getStudents() {


ca

return students;
}

public void setStudents(List<Student> students) {


this.students = students;
}

Podemos observar que la clase implementa la interfaz ModelDriven. Esta es usada cuando una clase

trata con un modelo concreto como Student. Esta interfaz obliga a implementar un método que

devuelve el modelo.

campusvirtual.cualifica2.es
75 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

En la vista accederemos entre otras a la propiedad student (getStudent) de AddStudentAction. Esta

vista toma el nombre, apellido y las puntuaciones. Como AddStudentAction implementa ModelDriven

se creará automáticamente un bean Student con los valores de nombre, apellido y puntuaciones:

<%@ page contentType="text/html; charset=UTF-8"%>


<%@ taglib prefix="s" uri="/struts-tags"%>
<html>
<head>
<title>Hello World</title>
<s:head />

es
</head>
<body>
<s:form action="addStudent">

2.
<s:textfield name="firstName" label="First Name"/>
<s:textfield name="lastName" label="Last Name"/>

ca
<s:textfield name="marks" label="Marks"/>
<s:submit/>
<hr/>

lifi
<table>
<tr>
<td>First Name</td>
ua
<td>Last Name</td>
<td>Marks</td>
</tr>
l.c

<s:iterator value="students">
<tr>
ua

<td><s:property value="firstName"/></td>
<td><s:property value="lastName"/></td>
<td><s:property value="marks"/></td>
rt

</tr>
</s:iterator>
i

</table>
sv

</s:form>
</body>
</html>
pu
m
ca

En el patrón DAO (Data Access Object), se define una interfaz que recoge los
métodos que se pueden realizar sobre un modelo, como obtener un listado o
guardar un modelo concreto.

Verdadero.

Falso.

campusvirtual.cualifica2.es
76 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Subida/Descarga de Ficheros.

Struts permite la subida y bajada de archivos mediante el uso de formularios, estos podemos

desarrollarlos de forma que se puedan incluir uno o más archivos y todo de una forma mucho más

simple de lo que otros lenguajes permiten.

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
77 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Subida de Ficheros.

En primer lugar y para proceder con la subida tenemos que definir un archivo de tipo File.

es
2.
ca
lifi
ua
l.c
ua
irt
sv

Ahora en nuestro formulario vamos a crear un campo en el cual se procederá a recoger el fichero

que el usuario quiera subir.


pu
m
ca

La configuración del Action sería la siguiente, fíjese en el elemento <interceptor-ref>:

campusvirtual.cualifica2.es
78 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Por último tenemos que configurar el interceptor para realizar la subida antes de procesar la

solicitud.

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
79 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Subida múltiple de Ficheros.

El código no cambia mucho respecto al apartado anterior, solo que en vez de declarar un archivo

File, debemos declarar una lista de archivos y recorrerla a la hora de subirla, repitiendo el proceso

tantas veces como archivos hay en la lista.

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
80 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Descarga de ficheros.

Struts permite la descarga de un fichero gracias a un flujo o stream implementado que vuelve

bastante simple este proceso que puede llegar a ser algo tedioso en muchas ocasiones.

Primero recogemos desde nuestro formulario el archivo que el usuario va a descargar, mediante la

inicialización de un objeto File.

es
2.
ca
lifi
ua
l.c
ua
i rt
sv

Con toByteArray() pasamos los bytes del archivo a un Array para tenerlos disponibles. Luego

escribimos los bytes en un archivo de forma que ya tengamos el archivo en nuestra aplicación.
pu

Después le damos el formato que queremos y con write escribimos el archivo terminado.
m

Después hacemos los mismos pasos que en la subida, declaramos el Action que realizará la descarga
ca

y definimos < result > para que obtenga el archivo.

campusvirtual.cualifica2.es
81 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Medidores de progreso.

Los medidores de progreso nos ayudan a determinar cuánto tiempo necesita la aplicación para

realizar un proceso. Estos solo sirven de información al usuario, pero son muy útiles para hacer que

este tenga conciencia del tiempo que tendrá que esperar hasta que acabe.

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
82 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Añadir medidor a un proceso.

Para representar el proceso gráficamente podemos utilizar el lenguaje javascript en nuestro

archivo jsp, de forma que javascript se encargue automáticamente de controlarlo.

es
2.
ca
lifi
ua
l.c

Este código realizará una comprobación del proceso cada 100 milisegundos, mientras no estén todos

los bytes del archivo subidos, no terminará. Y una vez que termine se realizará el submit del form
ua

desde javascript.
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
83 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

AJAX

Ajax es un acrónimo de las siglas “asynchronous JavaScript and XML” en español “JavaScript y XML

asíncronos”, aunque en su nombre se hace referencia a las tecnologías JavaScript y XML, son

muchas más las que lo componen. El termino general Ajax se usa para describir varias tecnologías

Web para convertir el lento y tedioso comportamiento de las aplicaciones en lotes en una

capacidad de respuesta más rápida, cercana a la capacidad de las aplicaciones de escritorio. No

obstante está mejora en la respuesta de las aplicaciones Web conlleva un precio: aumento

es
significativo en la complejidad de la programación, mayor ocupación de la red, nuevos diseños web

2.
para mejorar la experiencia del usuario, etc…

ca
Las tecnologías que forman AJAX son:

lifi
XHTML y CSS, para crear una presentación estándar.
ua
DOM, para la manipulación dinámica de la presentación.
l.c

XML, XSLT y JSON, para el intercambio de información.

XMLHttpRequest, para el intercambio asíncrono de información.


ua

Un lenguaje de servidor como PHP o ASP.NET para procesar las peticiones en el servidor y

enviar las respuestas.


rt

JavaScript, para unir todas las demás tecnologías.


i
sv
pu
m
ca

campusvirtual.cualifica2.es
84 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Formulario con AJAX.

Con Ajax, podemos realizar el submit de los forms. Esta utilidad nos permite poder realizar el envío

de los datos del formulario sin tener que recargar la página.

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
85 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Formulario con AJAX 2.

Además de la ejecución del envío de formularios con AJAX, podemos realizar más funciones

referidas a estos con AJAX. Por ejemplo podemos realizar llamadas a web services o validaciones de

los formularios de forma dinámica, sin tener que crear interceptores o validadores aparte.

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
86 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Freemarker, Velocity y Profiling.

Freemarker es un motor basado en el lenguaje Java que se utiliza para las situaciones en las que

una acción debe ser utilizada pero se encuentra fuera del contenedor de un Servlet.

Por ejemplo si quieres utilizar en tus aplicaciones algunas acciones de un plugin, puede que quieras

utilizar Freemarker para poder alcanzar sus clases y vistas.

Velocity es similar a freemarker en cuanto a finalidad se refiere. Ya que ayuda a alcanzar las

es
acciones que se encuentran fuera del ámbito del Servlet.

2.
Profiling se puede definir como el análisis de rendimiento de las aplicaciones en un sistema. Este

ca
puede ser utilizado en el código fuente o sobre un binario ejecutable mediante la herramienta

lifi
profiler. ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
87 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Integración con Spring e Hibernate.

La integración de Spring supone un gran avance para corregir los fallos que Struts presenta en su

funcionamiento. Se pueden nombrar algunas ventajas bastante importantes:

La visión entre el modelo, la vista y el controlador es mucho más clara.

Spring no necesita de heredar de tantas clases como Struts para realizar

determinadas acciones, como por ejemplo al utilizar los formularios.

es
Spring no está basado únicamente en el uso del formato JSP.

2.
ca
Hibernate es un servicio de persistencia en objetos relacionales de alto rendimiento cuya licencia

está bajo GNU y es totalmente gratuito. Este nos permite gestionar las conexiones con base de datos

lifi
desde Struts de forma organizada y muy segura. ua
Para proceder con la integración debemos de configurar hibernate de forma que pueda ser utilizado

en nuestra base de datos y obtenga todos los objetos y registros sin ningún tipo de incompatibilidad.
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
88 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Migración desde versiones anteriores.

Struts permite un sistema de versiones totalmente retro-compatible. Esto quiere decir que sea cual

sea la versión en la que te encuentres siempre vas a poder pasar a la última sin ningún tipo de

problema.

Pero aunque esto sea así, siempre se recomienda realizar la desinstalación de la versión anterior y

descargar de nuevo la versión totalmente nueva del software.

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
89 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Recuerda

[[[Elemento Multimedia]]]

es
2.
ca
lifi
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
90 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Autoevaluación

Struts 2 surgió de la combinación entre Struts 1 y otro framework creado por


otros desarrolladores llamado...

ServerSite.

es
WebWork.

2.
ca
Chrome.

lifi
Indica si el siguiente enunciado es verdadero o falso: Las acciones no se
ua
encargan de la manipulación de las consultas con sus peticiones y resultados.
l.c

Falso.
ua
rt

Verdadero.
i
sv

Indica si el siguiente enunciado es verdadero o falso: Struts 2 se basa en el


pu

modelo MVC para una ejecución más potente.


m

Falso.
ca

Verdadero.

Indica si el siguiente enunciado es verdadero o falso: Para crear una acción


simple, como único requisito es que tan solo tenemos que crear un método sin
argumentos que devuelva un string o resultado.

campusvirtual.cualifica2.es
91 / 92
[AFO022366] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA (SECTOR: EMPRESAS DE CONSULTORÍA Y ESTUDIOS
DE ME(...)
[MOD016525] IFCT034PO DESARROLLO DE APLICACIONES CON JAVA
[UDI096116] JAVA STRUTS 2.0 AVANZADO.

Falso.

Verdadero.

La subida de ficheros la gestiona el interceptor...

es
FileUpload.

2.
FileRequest.

ca
lifi
Ninguna de las anteriores.
ua
l.c
ua
irt
sv
pu
m
ca

campusvirtual.cualifica2.es
92 / 92

También podría gustarte