Hello,
I am developing tags which can generate Javascript at runtime.With classic tags i have done it succesfully but with simple tags one problem is coming
I have my jsp page like this:
Code:
<%@ taglib uri = "formtld.tld" prefix = "htm"%>
<html>
<title>Form Tag Built Using Simple Tag</title>
<body>
<htm:form name="empForm" >
Name: <input type="text" name="username">
<htm:validateField name="username" />
</htm:form>
</body>
</html>
Now in this jsp page my custom <form> tag handler functions fine but the nested tag doesn't work.What i want is a <form> tag is generated in the html's body tag & after that as a footer the script tag gets appended to the form tag in body ie of the sort:
html
body
form form attributes
close form
script tag
close script tag
close body
close html
KINDLY HELP ME OUT TO FIND OUT THE PROBLEM IN MY CODE:
The tag handler for outer tag 'form' is :
Code:
package simple;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.*;
public class SimpleTagForm extends SimpleTagSupport
{
private String name;
private String footer;
private String onsubmit;
private MyLogger logger = MyLogger.getInstance();
public SimpleTagForm()
{
name = null;
footer = null;
onsubmit = null;
}
public void setName(String name)
{
logger.log(" SimpleTagForm --> Inside setName()");
this.name = name;
}
public String getName()
{
return name;
}
public void setFooter(String footer)
{
logger.log(" SimpleTagForm --> Inside setFooter()");
this.footer = footer;
}
public String getFooter()
{
return footer;
}
public void setOnSubmit(String onsubmit)
{
logger.log(" SimpleTagForm -->Inside setOnSubmit()");
this.onsubmit = onsubmit;
}
public String getOnSubmit()
{
return onsubmit;
}
public void doTag() throws JspException,IOException
{
logger.log(" SimpleTagForm --> doTag()");
Writer out = getJspContext().getOut();
JspFragment fragment = getJspBody();
String formTag = createFormTag();
out.write(formTag);
fragment.invoke(out);
}
public String createFormTag()
{
logger.log("SimpleTagForm --> createFormTag()\n");
StringBuffer sbf = new StringBuffer("");
sbf.append("<form");
if(name != null)
{
logger.log("SimpleTagForm --> createFormTag()-->name not null\n");
sbf.append(" name=\"").append(name).append("\" ");
}
if(onsubmit != null)
{
logger.log("SimpleTagForm --> createFormTag()--> onsubmit not null");
sbf.append(" onsubmit=\"").append(onsubmit).append("\"");
}
sbf.append(">");
sbf.append("\n</form>\n");
if(footer != null)
{
logger.log("SimpleTagForm --> createFormTag()-->footer not null\n");
sbf.append(footer);
}
return (sbf.toString());
}
}
& the nested tag handler FOR VALIDATE TAG is :
Code:
package simple;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import java.io.*;
public class SimpleTagValidate extends SimpleTagSupport
{
private String name;
private MyLogger logger = MyLogger.getInstance();
public SimpleTagValidate()
{
name = null;
}
public void setName(String name)
{
this.name = name;
}
public String getName()
{
return name;
}
public void doTag() throws JspException,IOException
{
logger.log("Inside doTag() of SimpleTagValidate");
SimpleTagForm simpleFormTag = (SimpleTagForm)findAncestorWithClass(this,simple.SimpleTagForm.class);
String onsubmit = simpleFormTag.getOnSubmit();
String formName = simpleFormTag.getName();
String footer = simpleFormTag.getFooter();
if(onsubmit == null)
{
logger.log("SimpleTagValidate : Inside if onsubmit is null");
onsubmit = "return ";
onsubmit = onsubmit + formName + "_fieldsReq(this)" ;
footer = "<script type=\"text/javascript\">\n";
footer = footer + "function ";
footer = footer + formName + "_fieldsReq(theForm)\n{\n";
footer = footer + getVerified();
footer = footer + "}\n";
footer = footer + "</script>\n";
}
simpleFormTag.setOnSubmit(onsubmit);
simpleFormTag.setFooter(footer);
}
public String getVerified()
{
logger.log("SimpleTagValidate : Inside getVerified()");
StringBuffer sbf = new StringBuffer("");
sbf.append("\t if (!theForm.").append(name).append(")\n");
sbf.append("\t { \n");
sbf.append("\t \t alert('Could not get field ").append(name).append("'); \n");
sbf.append("\t \t return false;\n");
sbf.append("\t }\n");
sbf.append("\t if(theForm.").append(name).append(".value == '')\n");
sbf.append("\t { \n");
sbf.append("\t \t alert('").append("Please enter value for the field "+name).append("');\n").append("\t \t return false;\n");
sbf.append("\t }\n");
return (sbf.toString());
}
}
& the tld for the same is:
Code:
<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib
PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN"
"http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd">
<taglib>
<tlibversion>1.0</tlibversion>
<jspversion>1.1</jspversion>
<shortname>SimpleTagFormTag</shortname>
<uri>formtld</uri>
<tag>
<name>form</name>
<tagclass>simple.SimpleTagForm</tagclass>
<bodycontent>scriptless</bodycontent>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
<tag>
<name>validateField</name>
<tagclass>simple.SimpleTagValidate</tagclass>
<bodycontent>empty</bodycontent>
<attribute>
<name>name</name>
<required>true</required>
<rtexprvalue>true</rtexprvalue>
</attribute>
</tag>
</taglib>
So please help me out.
Thanks
Jignesh