I've developped an ArgumentTag that allow to set attributes of the direct
parent tag.
so, with little evolution in MessageTag code (move "doStartTag" to
"doEndTag" and inherit BodyTagSupport) + in struts-bean.tld (set bodycontent
to "JSP" instead of "empty"), I can set bean:message arguments with a
bean:write tag
<bean:message key="welcome">
<bean:argument arg="arg0">
<bean:write name="user" property="name"/>
</bean:argument>
</bean:message>
I think it could be used for other tags where attribute value could be
dynamically setted without scriptlet notation.
Here is the code from my argument tag :
import java.io.IOException;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.*;
import java.lang.reflect.*;
/**
* Custom tag that sets attributes of it's parent tag
* to allow use of bean:write tag to set attribute value.
*
* @author Nicolas De Loof
*/
public class ArgumentTag extends BodyTagSupport {
// -------------------------------------------- Properties
protected String arg = null;
public String getArg() {
return (this.arg);
}
public void setArg(String arg) {
this.arg = arg;
}
// -------------------------------------------- Public Methods
/**
* Process the start tag.
*
*/
public int doStartTag() {
// Process the body of this tag
return (EVAL_BODY_TAG);
}
/**
* Process the end tag.
*
*/
public int doEndTag() throws JspException {
// Set argument to parent tag
Tag parentTag = getParent();
if (arg == null) {
JspException e = new JspException
("arg is a mandatory attribute");
}
String setterName = "set"
+ arg.substring(0,1).toUpperCase()
+ arg.substring(1);
try {
System.out.println("setterName "+setterName);
Method setter = parentTag.getClass().getMethod(
setterName, new Class[] { String.class } );
setter.invoke(parentTag,
new Object[] {getBodyContent().getString()} );
}
catch (NoSuchMethodException nsme) {
JspException e = new JspException
("incorrect argument name");
}
catch (IllegalAccessException iae) {
JspException e = new JspException
("java.lang.reflect exception");
}
catch (InvocationTargetException ite) {
JspException e = new JspException
("incorrect parent tag or argument name");
}
return (EVAL_PAGE);
}
/**
* Release any acquired resources.
*/
public void release() {
super.release();
arg = null;
}
}
--
To unsubscribe, e-mail: <mailto:[EMAIL PROTECTED]>
For additional commands, e-mail: <mailto:[EMAIL PROTECTED]>