【自定义标签开发】01-标签简介和开发第一个标签-阿里云开发者社区

开发者社区> 开发与运维> 正文

【自定义标签开发】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

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

分享:
开发与运维
使用钉钉扫一扫加入圈子
+ 订阅

集结各类场景实战经验,助你开发运维畅行无忧

其他文章