Java Struts 2.0 Avanzado.
Java Struts 2.0 Avanzado.
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
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
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
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.
Struts 2 se basa en el modelo MVC para una ejecución más potente, con gran accesibilidad y una
es
Buena depuración.
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
Action.
m
View technologies: una serie de tecnologías encargadas de generar vistas como por ejemplo
ca
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
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
Se ejecutan una serie de interceptores que revisan o modifican la petición, como por ejemplo
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.
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”,
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
<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
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
explícitas en el código. Siguiendo esta filosofía, en Struts 2 una acción es una clase java
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
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.
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
/HelloWorld.jsp
</result>
i
<!-- Tambien podemos podemos poner la ruta al jsp usando la etiqueta param -->
sv
</param >
</result>
m
<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:
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.
Para crear una acción simple, como único requisito es que tan solo tenemos que crear un método
es
2.
ca
Esta puede interactuar con variables ya definidas en la clase, no solo con las que la acción ha
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.
Antes de nada para utilizar un servlet en conjunto con Struts 2 debemos excluir su ruta del filtro de
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
import org.json.JSONObject;
/**
* Ejemplo simple para devolver un JSON en un servlet
m
*/
ca
response.setContentType("application/json");
response.setHeader("Cache-Control", "nocache");
response.setCharacterEncoding("utf-8");
PrintWriter out = response.getWriter();
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.
<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:
peticiones.
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
"http://struts.apache.org/dtds/struts-2.0.dtd">
<struts>
rt
<include file="struts1.xml"/>
<include file="struts2.xml"/>
</struts>
i
sv
pu
m
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.
/ejemplo/META-INF/
/ejemplo/WEB-INF/
es
/ejemplo/WEB-INF/lib/ (Bibliotecas, aquí vendrían las de Struts)
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
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
En Struts las vistas son archivos de formato .JSP que permiten la interacción con el usuario, pero
ca
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
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.
Para crear una acción simple, como único requisito es que tan solo tenemos que crear un método
es
2.
ca
Esta puede interactuar con variables ya definidas en la clase, no solo con las que la acción ha
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
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.
Podemos agregar un tipo de variable a la acción cuando esta es ejecutada de forma que cuando se
Esto hace que las acciones tengan comunicación con los demás elementos del proyecto, de esta
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.
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
Las clases de acción de Struts 2 suelen extender la clase ActionSupport, que es proporcionada por
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;
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.
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".
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
package com.ejemplo.welcome;
import com.opensymphony.xwork2.ActionSupport;
import org.apache.struts2.interceptor;
//................
@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.
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
//...........................
//Setters y getters
rt
//............................
i
@Override
sv
@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
package com.ejemplo.welcome;
import javax.servlet.http.HttpServletRequest;
i
import org.apache.struts2.interceptor.ServletRequestAware;
sv
HttpServletRequest request;
ServletResponseAware
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;
2.
String uname,pwd;
Map m;
ca
//.............................
//Setters y getters
//.............................
lifi
@Override
public void setParameters (Map m) {
this.m=m;
ua
}
@Override
l.c
m.put("pwd", pwd);
return SUCCESS;
}
rt
}
i
sv
pu
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.
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
es
No es obligatorio devolver algunas de estas cadenas en la función execute(), se puede utilizar la
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
class="com.test.example.HelloWorldAction"
method="execute">
i
</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.
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 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.
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
local. Mientras que <s:property> permite acceder a propiedades del action. En la documentación
ua
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.
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
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 {
{
sampleArray = new String[]{"1","2","5"};
}
ua
}
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
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.
Para comenzar con la creación de formularios, lo primero es declarar que vamos a insertar un
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
es
2.
ca
Esta puede interactuar con variables ya definidas en la clase, no solo con las que la acción ha
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.
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
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.
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.
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,
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
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.
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
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.
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
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
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.
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
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
Por último, podemos ver como con le indicamos las propiedades mínimas y con < message > se
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:
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.
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.
en los Action también es posible, y puede ser combinada con validación por XML o con
validación por sí mismo y crea una lista de errores específicos para cada campo. El interceptor del
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,
"http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
ua
<validators>
<field name="userName">
<field-validator type="requiredstring">
rt
</field>
sv
<field name="password">
<field-validator type="requiredstring">
pu
</validators>
ca
llevar a cabo. En el ejemplo podemos ver que con la contraseña indicamos un parámetro en lugar de
Si estamos usando la configuración por defecto y nuestro Action no tiene el resultado input
<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.
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
package com.test.ejemplo;
rt
import com.opensymphony.xwork2.ActionSupport;
i
sv
//Codigo
}
}
}
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.
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,
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.
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
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
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
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
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.
Podemos crear conversores de forma que con una clase que extienda de StrutsTypeConverter,
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
conversion.properties”. Ahora podremos definir en este archivo el nuevo conversor que hemos
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.
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
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
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.
datos dentro del objeto de forma automática. Esto es debido a que cuando se realiza una petición los
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
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.
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.
Para la declaración del interceptor Prepare, tan solo tenemos que crear un action que referencie 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.
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á
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í
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
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.
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
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
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
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.
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
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
}
}
i
sv
La vista en JSP:
pu
<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>
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
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages"/>
pu
<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>
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,
manera:
i
sv
y en el fichero:
m
Esto se facilita en gran medida mediante las opciones que nos da Java para crear una aplicación que
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
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.
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:
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.
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
}
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
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.
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
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
@SessionTarget
ua
Session session;
@TransactionTarget
rt
Transaction transaction;
i
@SuppressWarnings("unchecked")
sv
{
e.printStackTrace();
}
return students;
}
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;
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
students = dao.getStudents();
return "success";
}
rt
return student;
sv
}
pu
return 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.
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:
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
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
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.
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
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
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
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.
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
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
Un lenguaje de servidor como PHP o ASP.NET para procesar las peticiones en el servidor y
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.
Con Ajax, podemos realizar el submit de los forms. Esta utilidad nos permite poder realizar el envío
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.
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 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
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.
La integración de Spring supone un gran avance para corregir los fallos que Struts presenta en su
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.
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
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
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
Falso.
ca
Verdadero.
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.
es
FileUpload.
2.
FileRequest.
ca
lifi
Ninguna de las anteriores.
ua
l.c
ua
irt
sv
pu
m
ca
campusvirtual.cualifica2.es
92 / 92