jueves, 9 de mayo de 2013

Como hacer un Component en Struts 2

Un component en Struts 2 no es más que la propia API con la que cuentan ellos para la creación de taglibs. Esto nos servirá para poder hacer cierta lógica en las JSP evitando el uso de scriptlets.

Este ejemplo sencillo pintará 'checked' o '' según el valor de una variable booleana pasada.

Para empezar creamos la clase que heredará de Component. En esta clase realizaremos la lógica dentro del método start y con el objeto Writer mandaremos a la capa de vista los valores deseados.

package es.home.example.component;

import java.io.IOException;
import java.io.Writer;
import org.apache.struts2.components.Component;
import es.home.example.constants.GeneralConstants;
import com.opensymphony.xwork2.util.ValueStack;

public class CheckField extends Component {
    protected String value;

    public CheckField(final ValueStack stack) {
 super(stack);
    }
    public boolean end(final Writer writer) {
 return true;
    }
    public final String getValue() {
 return value;
    }
    public final void setValue(final String value) {
 this.value = value;
    }
    @Override
    public boolean start(final Writer writer) {
 try {
     if (Boolean.TRUE.toString().equals(value)) {
  writer.write(GeneralConstants.CHECKED);
     } else {
  writer.write(GeneralConstants.BLANK);
     }
 } catch (IOException except) {
     except.printStackTrace();
 }
 return true;
    }
    @Override
    public boolean usesBody() {
 return false;
    }
}

Por otro lado creamos una clase que extienda de ComponentTagSupport, esto nos permitirá usar la lógica antes indicada como taglib. Los dos métodos esenciales a implementar son getBean y populateParams.

package es.home.example.component.tag;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.struts2.components.Component;
import org.apache.struts2.views.jsp.ComponentTagSupport;

import es.home.example.component.CheckField;
import com.opensymphony.xwork2.util.ValueStack;

public class CheckFieldTag extends ComponentTagSupport {

    private static final long serialVersionUID = 1L;
    protected String value;

    @Override
    public Component getBean(final ValueStack stack, final HttpServletRequest req, final HttpServletResponse res) {
 return new CheckField(stack);
    }
    public final String getValue() {
 return value;
    }
    @Override
    protected void populateParams() {
 super.populateParams();
 ((CheckField) component).setValue(value);
    }
    public final void setValue(final String value) {
 this.value = value;
    }
}

Si queremos usar el taglib necesitamos crear su fichero tld específico. Este fichero debe ser incluido dentro de la carpeta META-INF/ para que sea reconocido automáticamente por la aplicación.


    2.2.3
    1.2
    customComponent
    es/home/example/customComponent
    Custom Components
    <![CDATA["cc"]]>
    
        checkField
        es.home.example.component.tag.CheckFieldTag
        JSP
        <![CDATA[Render a checked string]]>
        
            value
            true
            true
            
                <![CDATA[Value of the field]]>
        
    


Por último ya solo queda utilizarlo en nuestra página JSP, tal y como vemos en el ejemplo

<%@taglib prefix="cc" uri="es/home/example/customComponent" %>

No hay comentarios:

Publicar un comentario