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