1.编写完成标签功能的Java类(标签处理器)
2.编写标签库描述文件(tld文件),在其中对该标签进行描述
3.在JSP页面导入并使用该标签
其实它就是一个Java类,只是实现了某个接口或者继承了某一个类。可以实现javax.servlet.jsp.tagext.SimpleTag接口或者
继承SimpleTagSupport该类。
若实现接口,需要实现它的若干个方法:doTag(),setParent(JspTag parent);getParent(); setJspContext(JspContext pc);setJspBody(JspFragment jspBody).其中最重要的是doTag()方法。看方法名就知道,咱们需要把该标签需要实现的功能的代码写在该方法里面。setJspContext(JspContext pc)也很重要,它把代表JSP引擎的pageContext传给标签处理类,它先于doTag()方法。
private PageContext pageContext; @Override public void setJspContext(JspContext pc) { // TODO Auto-generated method stub this.pageContext=(PageContext) pc; }有了pageContext就可以得到页面的其他8个隐含对象,如out,response,request等等,咱们就可以利用这些隐含对象去实现咱们想让它实现的功能。所以JSP页面能做的,标签都能做。
若是选择用继承SimpleTagSupport类的方法,则咱们需要重写doTag()方法。那pageContext对象去哪得到呢?翻开API,看到有个getJspContext()方法,得到JspContext对象,然后强制转型为pageContext对象即可。
比如咱们现在只需要简单的在浏览器界面上输出“hello".
doTag()方法:
public void doTag() throws JspException, IOException { System.out.println("doTag"); HttpServletRequest request =(HttpServletRequest) pageContext.getRequest(); pageContext.getOut().println("Hello"+request.getParameter("name")); }
<?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> <!-- 描述TLD文件 --> <description>MyTag 1.0 core library</description> <display-name>MyTag core</display-name> <tlib-version>1.0</tlib-version> <!-- 建议在JSP页面上使用的标签前缀--> <short-name>mytag</short-name> <!-- 作为tld文件的id,用来唯一标识当前的tld 文件,多个tld文件的Uri不能重复。通过 JSP页面的taglib 标签的Uri属性 来引用--> <uri>http://www.mytag.com/mytag/core</uri> <!-- 描述自定义的helloSimpleTag 标签 --> <tag> <!-- 标签名 ,在JSP 页面上使用标签时的名字--> <name>hello</name> <!-- 标签所在的全类名 --> <tag-class>tag.HelloSimpleTag</tag-class> <!-- 标签体的类型 --> <body-content>empty</body-content> <!-- 描述当前标签的属性--> <attribute> <!-- 属性名 --> <name>value</name> <!-- 该属性是否为必须 --> <required>false</required> <!-- runtime expression value 当前属性是否可以接受运行时表达式的动态值 --> <rtexprvalue>false</rtexprvalue> </attribute> <attribute> <!-- 属性名 --> <name>count</name> <!-- 该属性是否为必须 --> <required>false</required> <!-- runtime expression value 当前属性是否可以接受运行时表达式的动态值 --> <rtexprvalue>false</rtexprvalue> </attribute> </tag> </taglib>
<myTag:hello/>hello和tld文件中的标签名要一致。一个tld文件中可以有多个标签和标签名。所以在导入使用的时候也要注意点。
通过以上步骤,就完成了一个简单自定义标签的开发。
那么自定义标签中的属性又是干嘛的呢?也许在咱们的tld文件中需要传入几个参数,这时就需要属性了。要想使用属性,首先需要在Java类中声明这些属性以及相应的set()方法.
private String value; private String count; public void setValue(String valueString) { this.value = valueString; } public void setCount(String count) { this.count = count; }同时,也需要在tld文件中对这些属性进行描述。最后,在咱们导入使用的时候,写上这些参数名和值即可
<mytag: value="myTag" count="10"/>
public void doTag() throws JspException, IOException { System.out.println("doTag"); HttpServletRequest request =(HttpServletRequest) pageContext.getRequest(); System.out.println("value:"+value+"count:"+count); pageContext.getOut().println("Hello"+request.getParameter("name")); }
原文地址:http://blog.csdn.net/foolishandstupid/article/details/45348175