自定义标签:
引入标签库:
<%@tablib uri=''''' prefix="it"%>
使用标签库中的标签:
实现类:
/**
* 1、继承SimpleTagSupport类
*
*/
public class ShowIpTag extends SimpleTagSupport{
private JspContext context;
public void setJspContext(JspContext pc){
this.context = pc;
}
/**
* 覆盖doTag方法
*/
public void doTag() throws JspException,IoException(){
pageContext pageContext = (PageContext)context;
HttpServletRequest request =(HttpServletRequest)pageContext.getRequest;
String ip = request.getRemoteHost();
JspWriter out = pageContext.getOut();
out.write("使用自定义标签输出客户Ip的地址:" + ip);
}
}
tld文件
<!-- 标签库版本 -->
<tlib-version>1.1</tlib-version>
标签库前缀
<short-name>it</short-name>
tld文件的唯一标记
<uri>http://gz.it.cn</uri>
声明标签
<tag>
标签名字
<name>showIp</name>
实现类路径
<tag-class>gz.it.showIpTag</tag-class>
内容格式
<body-content>scriptless</body-content>
</tag>
开发步骤:
1、编写一个普通的java类,继承SimpleTagSupport类,叫标签处理器类
2、在Web项目的WEB-INF目录下家里tld文件,标签库的声明文件,(参考核心标签库)
3、在jsp页面头部导入自定义标签库
4、在jsp使用自定义标签
自定义标签的执行过程:
1、访问jsp资源
2、tomcat 把jsp翻译成java文件,编辑成class,构造类对象,执行类的方法
3、检查jsp文件的tablib指令,是否存在名为。。。的tld文件
4、已经读取到tld文件
5、读到<itcase:showIp>到tld文件中查找是否存在<name>为showIp的tag标签
6、找到对应的<tag>标签,取<tag-class>内容
7、构造对象,调用类的方法
自定义标签处理器类的生命周期:
SimpleTag接口:
1、setJspContest(JspContextpc) 设置pageContext对象,传入pageContext
2、setParent(JspTagparent) 设置父标签对象,如果没有父标签,则不调用此方法,通过getParent 得到父标签
3、setJspBody(JspFragmentjspBody) 设置标签体内容,标签体内容封装到JspFragment对象中,然后传入JspFragment对象,通过getJspBodey方法获取内容
4、doTag() 执行标签时调用的方法
API :
//获取标签体内容
JspFragment jspBody = this.getJspBody();
// 输出到游览器
jspWrter out = this.getJspContext().getOut();
jspBody.invoke(out); // 参数为null,默认输出到游览器
// 控制标签余下的内容是否输出
throw new SkipPageExcepption();
// 改变标签体内容
StringWriter sw = new StringWriter();
jspBody.invoke(sw);
String content = sw.toString();
content = content.toLowerCase();
this.getJspContext().getOut().write(content);
// 获取父标签
ChooseTag parent =(ChooseTag)this.getParent;
实例;
<tag>
<name>demoTag</name>
<tag-class>gz.a_tag.DemoTag</tag-class>
<body-content>scriptless</body-content>
<!-- 属性声明 -->
<attribute>
<!-- 属性名称 -->
<name>num</name>
<!-- 是否必填 -->
<required>true</required>
<!-- 是否支持EL表达式 -->
<rtexprvalue>false</rtexprvalue>
</attribute>
</tag>
注: http://blog.csdn.net/aaa1117a8w5s6d/article/details/8157212
<xsd:enumerationvalue="tagdependent"/>
<xsd:enumerationvalue="JSP"/>
<xsd:enumerationvalue="empty"/>
<xsd:enumerationvalue="scriptless"/>
tagdependent:标签体内容直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释,
如下:
<test:myList>
select name,age fromusers
</test:myList>
JSP:接受所有JSP语法,如定制的或内部的tag、scripts、静态HTML、脚本元素、JSP指令和动作。如:
<my:test>
<%=request.getProtocol()%> // ②
</my:test>
具体可参考后面附源码。
empty:空标记,即起始标记和结束标记之间没有内容。
下面几种写法都是有效的,
<test:mytag />
<test:mytaguname="Tom" />
<test:mytag></test:mytag>
scriptless:接受文本、EL和JSP动作。如上述②使用<body-content> scriptless</body-content>则报错,具体可参考后面附源码。