miércoles, 30 de diciembre de 2009

interceptors en struts2



Los interceptores en struts2 son procedimientos que se ejecutan
antes o despues que se invoque una accion, existen algunos
definidos que podemos utilizar directamente o crear nuevas e
implementarlas, estos dos esquemas que tenemos nos sirve
para entender mejor los famosos interceptor de struts2.

Pero que mejor que un ejemplo para entender mejor este
concepto.

vamos a desarrollar un programa que pasa una palabra de una
pagina a otra y que el momento de hacer la solicitud de cambio
de pagina nos muestre un mensaje que se ejecuta
automaticamente mediante un interceptor.

1.- primiero vamos a crear nuestra pagina inicio, como siempre
la pagina index.jsp


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

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

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

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>struts2</title>

</head>

<body>

<h1>traspasar la siguiente palabra</h1>

<s:form action="proceso">

<s:textfield name="palabra" label="palabra"/>

<s:submit/>

</s:form>

</body>

</html>


2.- creamos las siguientes clases

import com.opensymphony.xwork2.ActionSupport;

public class parametro extends ActionSupport {

private String palabra;

// @Override
public String execute() {
System.out.println("entro a axecute");
return SUCCESS;
}

public String getPalabra() {
return palabra;
}

public void setPalabra(String palabra) {
this.palabra = palabra;
}
}

-------------------------------------------
esta clase es el interceptor, como cosas claves
podemos decir que implementa de la interfaz
Interceptor y el metodo invoke() es el que nos
delimita los procesos antes o despues de la accion.

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor;

public class PruebaInterceptor implements Interceptor{

public String intercept(ActionInvocation next) throws Exception {


String s= next.invoke();
System.out.println("intercept");

return s;
}

public void init() {
}
public void destroy() {
}
}

si colocamos el System.out.println("intercept"); antes de
String s= next.invoke(); se mostrara el mensaje antes de
System.out.println("entro a axecute"); encontrado en la
clase parametro

3.- creamos la pagina respuesta, que es la asociada a la accion
parametro.


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

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

parametro <s:property value="palabra"/>

</body>
</html>

4.- ahora vamos a lo mas importante que seria
nuestro archivo strust.xml, el que tiene toda nuestra
configuracion.


<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>

<!-- Configuration for the default package. -->
<package name="default" extends="struts-default">

<interceptors>
<interceptor name="tiempo_servidor" class="PruebaInterceptor"/>

</interceptors>

<action name="proceso" class="parametro">

<interceptor-ref name="tiempo_servidor"/>
<interceptor-ref name="defaultStack" />

<result name="success" >/resultado.jsp</result>
</action>

</package>
</struts>

de este codigo podemos decir que es importante que este
interceptor-ref name="defaultStack" en nuestra accion, puesto
que si no esta el parametro palabra no llega a nuestra pagina
respuesta.jsp

ahora al momento de ejecutar nuestro codigo, podemos
apreciar que a simple vista podemos ver que se pasa
el parametro desde una pagina a la otra, pero si vemos
nuestra consola podemos ver que se muestra lo siguiente.

entro a axecute
intercept

bueno trate de hacer un ejemplo lo mas sencillo, para
entender e iniciar los conocimientos de este framework,
creo que lo mas recomendable es leer mucho y tratar
de entender como funciona para evitar estar pegado en
problemas de configuracion, principalmente en el
archivo struts.xml

3 comentarios:

Anónimo dijo...

muy buen ejemplo, si señor, claro y conciso, lo más simple posible para un buen entendimiento. Mis felicitaciones al autor. Ahora nos toca a los demás ir complicándolo.
Muchas gracias

Roberto Lezama dijo...

Sería bueno dejar de usar un filtro de jsp y en su lugar usar un interceptor para validar si hay una sesion iniciada en la aplicación?

Anónimo dijo...

Muy buen ejemplo. Pero tengo una consulta, yo estoy trabajando con Struts2 pero con annotations, no con xml.
Puedo declarar el link entre el interceptor y el action con @InterceptorRefs o @InterceptorRef.
Pero, quiero saber si es factible declarar un interceptor con annotations y evitar en mi struts.xml
Gracias. Saludos