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