|
related to this example is Tag Check.
Simple Taglib. Shows options inside a SELECT html component.
Jakarta Struts has already a tag that represents a SELECT tag. This is similar but simpler.
Listing 1: SelectOptionsTag.java
package tags;
import java.awt.Point;
import java.lang.reflect.Method;
import java.text.MessageFormat;
import java.util.Iterator;
import java.util.List;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.TagSupport;
/**
* SelectOptionsTag
* para usarlo debe definirse un archivo TLD
*
*
* Y usarlo en el .JSP
* <pre>
* <%@ taglib uri="/WEB-INF/tags.tld" prefix="usertags" %>
* ...
* <usertags:options
* list="<%=(java.util.List) %>"
* value="property"
* name="property"
* select="default_value"/>
* </pre>
*
* Si no se usa value o property se asume el valor contenido en la lista.
* @author csilva
* @version
*/
public class SelectOptionsTag extends TagSupport {
/// Lista de datos a usar como opciones
List list;
/// Propiedad usada para mostrar el Nombre (texto) de la opcion
String name;
/// Propiedad usada para mostrar el Nombre (texto) de la opcion
String value;
/// marcar seleccionado un valor por omision
String select;
static final boolean DEBUG=false;
void log(String s){
if (DEBUG) {
System.out.print("SelectOptionsTag: ");
System.out.println(s);
}
}
/**
* @param list
*/
public void setList(List list) {
this.list = list;
}
/**
* @param string
*/
public void setName(String string) {
name = "get" + string.substring(0, 1).toUpperCase() + string.substring(1);
}
/**
* @param string
*/
public void setSelect(String string) {
select = string;
}
/**
* @param string
*/
public void setValue(String string) {
value = "get" + string.substring(0, 1).toUpperCase() + string.substring(1);
}
/**
*
* @see javax.servlet.jsp.tagext.Tag#doEndTag()
*/
public int doEndTag() throws JspException {
try {
String pattern = "<option value="{0}" {2}>{1}</option>rn";
Method getValue = null;
Method getName = null;
Object[] noValues = new Object[0];
Class[] noArgs = new Class[0];
for (Iterator i = list.iterator(); i.hasNext();) {
Object b = i.next();
String val = null, nam = null, sel = "";
if (b != null) {
log("option: ("+b.getClass().getName()+") "+b);
if (name != null) {
if (getName == null) {
getName = b.getClass().getMethod(name, noArgs);
log(name+"(): "+getName.getReturnType());
}
Object o = getName.invoke(b, noValues);
log("name: ("+o.getClass().getName()+") "+o);
nam = o.toString();
} else
nam = String.valueOf(b);
if (value != null) {
if (getValue == null) {
getValue = b.getClass().getMethod(value, noArgs);
log(value+"(): "+getValue.getReturnType());
}
Object o = getValue.invoke(b, noValues);
log("value: ("+o.getClass().getName()+") "+o);
val = o.toString();
} else
val = String.valueOf(b);
} else {
nam = val = "";
}
if (val.equals(select))
sel = "selected";
String html = MessageFormat.format(pattern, new Object[] { val, nam, sel });
pageContext.getOut().print(html);
}
} catch (Exception ioe) {
throw new JspException("Error al escribir en la pagina:" + ioe.getMessage());
}
return super.doEndTag();
}
}
Listado 2: tags.tld
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE taglib PUBLIC
"-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.2</tlib-version>
<jsp-version>1.2</jsp-version>
<short-name>SelectOptions Tags</short-name>
<tag>
<name>options</name>
<tag-class>tags.SelectOptionsTag</tag-class>
<body-content>JSP</body-content>
<attribute>
<name>list</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>name</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>value</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
<attribute>
<name>select</name>
<required>false</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
Listado 3: test.jsp
<%@ taglib uri="/WEB-INF/tags.tld" prefix="usertags" %>
<%
java.util.Vector v = new java.util.Vector();
v.add(new java.awt.Point(1,11));
v.add(new java.awt.Point(2,21));
v.add(new java.awt.Point(3,31));
%>
<select name="test">
<usertags:options list="<%=v%>" value="x" name="y" select="2.0"/>
</select>
Nota: se usa select=2.0 debido a que la funcion getX() de java.awt.Point retorna un double (no un int como el campo x).
|