开发者社区> 光仔december> 正文
阿里云
为了无法计算的价值
打开APP
阿里云APP内打开

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

简介:
+关注继续查看
自定义标签简介
自定义标签主要用于移除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 {

	@Override
	public int doStartTag() throws JspException {
		
		//Tag接口的setPageContext方法已经将PageContext从页面拿过来
		//我们在这里获取PageContext
		HttpServletRequest 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

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
我的第一个页面及其标签简介|学习笔记
快速学习我的第一个页面及其标签简介
38 0
自定义标签之带有属性的标签 | 学习笔记
快速学习自定义标签之带有属性的标签
19 0
自定义标签入门 | 学习笔记
快速学习自定义标签入门
38 0
自定义镜像迁移方案
近日,有同学问到如果控制台不支持自定义镜像导出的情况下,该怎么进行自定义镜像的迁移。所以就开始着手写了这个文档,希望能够帮到有类似需求的同学。
1398 0
自定义 Lint 规则简介
上个月,笔者在巴黎 Droidcon 的 BarCamp 研讨会上聆听了 Matthew Compton 关于编写自己的 Lint 规则的讲话。深受启发之后,笔者想就此话题做进一步的探索。
2961 0
快速索引 (对View的自定义)
快速索引 (对View的自定义) 快速索引应用场景: 微信好友列表, 联系人通讯录, 应用管理, 文件管理等。 快速索引7步曲: *1. A-Z索引的绘制. * 2. 处理Touch事件. * 3. 提供使用监听\回调 * 4. 汉字转换成拼音. * 5. 进行排序展示. * 6. 进行分组. * 7. 将自定义控件和ListView合体. 1.
838 0
自定义标签基础知识
          8.1 自定义标签基础知识   自定义标签基础知识 1.自定义标签(Custom Tag)概述 (1)用户自定义的一种jsp标记。
620 0
+关注
光仔december
目前致力于JavaEE(struts/hibernate/spring/MyBatis等框架)、数据库(Mysql/oracle)、静态页面(Html/Css)技术和脚本(JavaSript/JQuery/Ajax)等技术方面的研究
497
文章
0
问答
文章排行榜
最热
最新
相关电子书
更多
低代码开发师(初级)实战教程
立即下载
阿里巴巴DevOps 最佳实践手册
立即下载
冬季实战营第三期:MySQL数据库进阶实战
立即下载