之前写了一篇自定义标签的开发,现在再说说JSP2.0之后支持的简单标签的开发。其中还是有很大的区别的。
还是一样,先看一个例子,再分析吧。
JSP页面:
<%@taglib prefix="my" uri="/mytag"%> <html> <head> <title>simplehello</title> </head> <body> <my:simplehello name="chen">haha</my:simplehello> </body> </html>
hello chen
HAHA
也就是对属性和标签体进行了处理。
web.xml文件:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <init-param> <param-name>enablePooling</param-name> <param-value>false</param-value> </init-param> <jsp-config> <taglib> <taglib-uri>/mytag</taglib-uri> <taglib-location>/WEB-INF/mytags.tld</taglib-location> </taglib> </jsp-config> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
tld文件:
<?xml version="1.0" encoding="UTF-8"?> <taglib xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="3.0" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"> <tlib-version>1.0</tlib-version> <short-name>chen</short-name> <display-name>my tag</display-name> <description>this is from mr.chen</description> <tag> <name>simplehello</name> <tag-class>simple.HelloSimpleTag</tag-class> <body-content>scriptless</body-content> </tag> </taglib>
package simple; import java.io.IOException; import java.io.PrintWriter; import java.io.StringWriter; import javax.servlet.jsp.JspContext; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.JspTag; import javax.servlet.jsp.tagext.SimpleTag; public class HelloSimpleTag implements SimpleTag{ private JspTag parent; private JspFragment body; private JspContext context; private String name; public void setName(String s){ this.name = s; } @Override public void setParent(JspTag jt){ this.parent = jt; } @Override public JspTag getParent(){ return parent; } @Override public void setJspBody(JspFragment jf){ this.body = jf; } @Override public void setJspContext(JspContext pc){ this.context = pc; } @Override public void doTag(){ try { context.getOut().write("hello,"+name+"<br/>"); StringWriter out = new StringWriter(); body.invoke(out); String s = out.toString(); context.getOut().write(s.toUpperCase()); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (JspException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
接下来就是细细的分析了。
简单标签只有一个接口SimpleTag,不像传统标签有三个接口。SimpleTag定义了5个方法:
setJspContext(JspContext pc) JspContext是PageContext的父类
setParent(JspTag jt)如果没有父标签就不调用这个方法了,这是和传统标签不同的。
getParent()
setJspBody(JspFragment jf) 将标签体封装成JspFragment对象
doTage()完成所有的标签逻辑
其中,JspFragment类有两个方法:
getJspContext()
invoke(Writer out):这个方法是一个很奇妙的方法,在父标签类中调用该方法可以获得其子标签的输出。也就是说,在父标签类中通过获得参数out就可以得到子标签的输出了。
另外,SimpleTag同样有一个简单的实现,SimpleTagSupport类,只要继承该类可以省做很多的事。只要重写doTag()就可以了。