JSP自定义标签

自定义标签:

 

引入标签库:

 

<%@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资源

 

2tomcat jsp翻译成java文件,编辑成class,构造类对象,执行类的方法

 

3、检查jsp文件的tablib指令,是否存在名为。。。的tld文件

 

4、已经读取到tld文件

 

5、读到<itcase:showIp>tld文件中查找是否存在<name>showIptag标签

 

6、找到对应的<tag>标签,取<tag-class>内容

 

7、构造对象,调用类的方法

 

 

自定义标签处理器类的生命周期:

 

SimpleTag接口:

 

1setJspContest(JspContextpc)  设置pageContext对象,传入pageContext

 

2setParent(JspTagparent)   设置父标签对象,如果没有父标签,则不调用此方法,通过getParent 得到父标签

 

3setJspBody(JspFragmentjspBody  设置标签体内容,标签体内容封装到JspFragment对象中,然后传入JspFragment对象,通过getJspBodey方法获取内容

 

4doTag()                        执行标签时调用的方法

 

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语法,如定制的或内部的tagscripts、静态HTML、脚本元素、JSP指令和动作。如:

 

<my:test>

    <%=request.getProtocol()%>      //

</my:test>


具体可参考后面附源码。

empty:空标记,即起始标记和结束标记之间没有内容。


下面几种写法都是有效的,

<test:mytag />

<test:mytaguname="Tom" />

<test:mytag></test:mytag>

 

scriptless:接受文本、ELJSP作。如上述②使<body-content> scriptless</body-content>则报错,具体可参考后面附源码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值