【自定义标签开发】01-标签简介和开发第一个标签

来源:互联网 发布:数据库课程设计mysql 编辑:程序博客网 时间:2024/05/16 08:16
自定义标签简介
自定义标签主要用于移除Jsp页面中的java代码。

要使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤:
1.编写一个实现Tag接口的java类,把页面java代码移到这个java类中(标签处理器类)。
2.编写标签库描述(tld)文件,在tld文件中把标签处理器类描述成一个标签。

我们接下来写一个小例子来对自定义标签的开发做一个入门了解
快速入门:使用标签输出客户机IP

我们在MyEclipse中创建一个名为JspTest的Web project,然后改写它的index.jsp,来实现输出客户机IP。

如果我们不使用标签的话,我们免不了使用脚本代码来实现我们的功能:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>My JSP 'index.jsp' starting page</title>  </head>    <body>    您的ip为:    <%    String ip = request.getRemoteAddr();    out.print(ip);     %>  </body></html>

将JspTest工程部署到tomcat运行之后效果:


但是这里直接写了java代码,不符合我们的mvc规范,所以我们要移除java代码,用简单的标签来替代它。

我们上面说了开发自定义标签库的步骤,我们按照那个步骤来开发一个显示用户ip的标签。

jsp技术中有一个tag接口,下面有如下的方法:

doEndTag()执行开始标签执行的方法(如<c:foreach>)


doStartTag()执行结束标签执行的方法(如</c:foreach>)


getParent()得到标签的父标签(包裹本标签的上一级标签)


release()释放资源的方法,标签结束时执行,会释放标签运行的时候所占用的资源。


setPageContext(PageContext pc)把页面的PageContext传递过来(最重要的方法,它会把页面的所有数据传递过来,包括Servlet的八大隐式对象,这样我们就可以做我们想处理的任何事)


setParent(Tag t)设置标签的父标签(包裹本标签的上一级标签)

以上就是整个tag接口的说明文档。

我们开发标签的主要逻辑就要写在doStartTag()和doEndTag()方法。
但是如果我们实现了tag接口,就不单单要实现doStartTag()和doEndTag()方法,其它的方法也要去实现,那么这个时候我们不想改变原有方法的内容,这个时候sun公司给我们提供了tag默认的实现类供我们使用,有以下方法:
BodtTagSupport/TagAdapter/TagSupport
我们下面常用的就是TagSupport

我们接下来做开发, 来移除我们刚刚写的获取用户ip的代码。

我们创建一个类,去集成实现了Tag接口的TagSupport类:

package org.zyg.web.tag;import javax.servlet.jsp.tagext.TagSupport;public class ViewIPTag extends TagSupport {}

然后我们实现其中的doStartTag()方法,然后将显示用户ip的逻辑写进去:
package org.zyg.web.tag;import java.io.IOException;import javax.servlet.http.HttpServletRequest;import javax.servlet.jsp.JspException;import javax.servlet.jsp.JspWriter;import javax.servlet.jsp.tagext.TagSupport;public class ViewIPTag extends TagSupport {@Overridepublic int doStartTag() throws JspException {//Tag接口的setPageContext方法已经将PageContext从页面拿过来//我们在这里获取PageContextHttpServletRequest request=(HttpServletRequest)this.pageContext.getRequest();//获取JspWriter对象JspWriter out=this.pageContext.getOut();String ip = request.getRemoteAddr();    try {out.print(ip);} catch (IOException e) {throw new RuntimeException(e);}return super.doStartTag();}}

现在我们就已经成功的页面的java代码成功的移到一个标签处理类中了,jsp类中就不需要出现这段java代码了。

接下来就是我们要为这个标签处理类定义一个标签名了。
我们要创建一个tld文件,我们在WEB-INF/lib下新建一个zyg.tld文件。

内容我们不知道怎么写?可以查看tomcat给我们的规范,在tomcat的apache-tomcat-6.0.24\webapps\examples\WEB-INF\jsp2文件夹下,有一个jsp2-example-taglib.tld文件,我们将它的头和尾抄过来:
<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">    </taglib>

接下来我们将我们的标签处理类包装成一个标签:
<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">        <description>A tag library exercising SimpleTag handlers.</description>    <tlib-version>1.0</tlib-version>    <short-name>zyg</short-name>    <uri>http://blog.csdn.net/acmman</uri>        <tag>        <name>viewIP</name><!-- 标签名 --><tag-class>org.zyg.web.tag.ViewIPTag</tag-class><body-content>empty</body-content><!-- 有无标签体(单标签还是成对标签) -->    </tag>    </taglib>

接下来我们在页面使用这个标签,在使用标签前,首先在jsp页面中导入标签:

<%@taglib uri="http://blog.csdn.net/acmman" prefix="zyg" %>

其中uri就是我们在tld文件中设置的绑定路径,prefix就是标签的前缀,代表我们使用了zyg.tld标签库的标签。

然后我们写一个“<zyg”,按一下Alt+/就可以看到自动提示,这个时候我们的标签成功引入了:

代码:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%><%@taglib uri="http://blog.csdn.net/acmman" prefix="zyg" %><!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"><html>  <head>    <title>My JSP 'index.jsp' starting page</title>  </head>    <body>    您的ip为:    <zyg:viewIP/>  </body></html>

我们重新发布一下web工程,在浏览器中访问:

我们虽然看到和以前一样的效果,但是内部的技术全都换了。至此我们阐述了一个简单的自定义标签的开发过程。

转载请注明出处:http://blog.csdn.net/acmman/article/details/51065439

0 0
原创粉丝点击