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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294698.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

三联《少年》创刊,各领域佼佼者畅言新知,帮少年建立思维素养体系!

▲点击查看很多中国小孩的成长是断层的。10岁前被视作可爱稚子&#xff0c;被大人护着走&#xff1b;18岁猛然被定义为成年人&#xff0c;要选择大学、专业&#xff0c;开始面对感情。中间的人生呢&#xff1f;“你是个学生&#xff0c;学习是本职&#xff0c;现在谈什么人生&a…

mysql utf8 bin设置_[mysql]修改collation为utf8_bin

mysql默认字段值区分大小写&#xff1a;character-set-serverutf8collation-serverutf8_bininit-connectSET NAMES utf8;SELECT DEFAULT_CHARACTER_SET_NAME charset, DEFAULT_COLLATION_NAME collationFROM information_schema.SCHEMATA WHERE SCHEMA_NAME billing01;SELECT …

C# WPF MVVM开发框架Caliburn.Micro自定义引导程序④

01—自定义引导程序在上一部分中&#xff0c;我们讨论了Caliburn.Micro WPF应用程序的最基本配置&#xff0c;并演示了与操作和约定相关的两个简单功能。在这一部分中&#xff0c;我想进一步探讨Bootstrapper类。让我们首先将应用程序配置为使用IoC容器。本例中我们将使用内置容…

Android 使用XmlPullParser解析xml

这里我们假设要解析的xml文件名为&#xff1a;test.xml&#xff0c;我们将其放在assets路径中。 xml文件内容为&#xff1a; <?xml version1.0 encodingutf-8 standaloneyes ?> <books><book id"1"><name>Java编程思想</name><pr…

链表之打印两个有序链表的公共部分

题目:打印两个有序链表的公共部分 package com.chenyu.zuo.linkedList; /*** 打印有序链表的公共部分* @author 陈喻*题目:给定两个有序链表的头指针head1和head2,打印出两个链表的公共部分*思路:因为有序*如果head1的值小于head2,则head1往下移动*如果head2的值小于head1,…

批处理for命令详解

批处理for命令详解批处理for命令详解 2008-03-07 11:00 FOR这条命令基本上都被用来处理文本,但还有其他一些好用的功能! 看看他的基本格式(这里我引用的是批处理中的格式,直接在命令行只需要一个%号) FOR 参数 %%变量名 IN (相关文件或命令) DO 执行的命令 参数…

趁爸妈不在家约男朋友回家吃饭,然而......

1 有没有男主很脆弱的电影&#xff1f;&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 成长期-成熟期-完全体-究极体▼3 千万别在家乱放星巴克的袋子&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼4 发生了很奇怪的事情▼5 只有你想不到&#xff0c;没…

java泛型不是计算运行时的数据类型

2019独角兽企业重金招聘Python工程师标准>>> package com.ada.data.entity;import java.io.Serializable;import javax.persistence.GeneratedValue; import javax.persistence.GenerationType; import javax.persistence.Id; import javax.persistence.MappedSuper…

spark 连接mysql 命令_spark-submit命令包括mysql连接器

我有一个scala对象文件&#xff0c;它在内部查询mysql表做一个连接并将数据写入s3&#xff0c;在本地测试我的代码它运行得很好 . 但是当我将它提交到集群时&#xff0c;它会抛出以下错误&#xff1a;线程“main”java.sql.SQLException中的异常&#xff1a;在org.apache.spark…

C#内建接口:IComparable

这节开一个新的系列&#xff1a;C#内建接口。主要给大家讲一下C#内部给我们定义的一些常用的接口&#xff0c;以及它们是怎么使用的。基本上一节讲一个吧&#xff0c;本节先从IComparable开始。01了解IComparable一般的&#xff0c;值类型的数据比较大小&#xff0c;就是看它俩…

链表之删除单链表倒数第K个节点

删除单链表倒数第K个节点 题目: 删除单链表中倒数第K个节点, 思路: 给我们一个单链表,我们需要删除倒数第K个节点,比如链表每个节点值是1、2、3、4、5、6 K值是2,链表的总长度是6,要得倒数第二个数的值,前面就有6-2=4个的值,如果头结点往下移,移到…

script的defer和async

我们常用的script标签&#xff0c;有两个和性能、js文件下载执行相关的属性&#xff1a;defer和async defer的含义【摘自https://developer.mozilla.org/En/HTML/Element/Script】 This Boolean attribute is set to indicate to a browser that the script is meant to be exe…

WWDC 2013 Session笔记 - Xcode5和ObjC新特性

这是我的WWDC2013系列笔记中的一篇&#xff0c;完整的笔记列表请参看这篇总览。本文仅作为个人记录使用&#xff0c;也欢迎在许可协议范围内转载或使用&#xff0c;但是还烦请保留原文链接&#xff0c;谢谢您的理解合作。如果您觉得本站对您能有帮助&#xff0c;您可以使用RSS或…

难以摸透的直男脑回路......

1 你年纪不小了&#xff0c;该结婚了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼2 泰国小哥低成本Cos赛博朋克2077 ▼3 郑爷爷也太会了吧▼4 奇奇怪怪的知识又增加了&#xff08;素材来源网络&#xff0c;侵删&#xff09;▼5 酸奶今天7.1折&#xff08;via.…

数论概论(Joseph H.Silverman) 习题 39.1 $\sqrt{3}$和$\sqrt{5}$的连分数展开中的重复现象...

计算$\sqrt{3}$和$\sqrt{5}$的连分数中的前10项. 解:\begin{align*} \sqrt{3}1\dfrac{1}{\dfrac{1}{\sqrt{3}-1}}\end{align*}\begin{align*} \sqrt{3}1\dfrac{1}{1\dfrac{1}{\dfrac{1}{\dfrac{\sqrt{3}-1}{2}}}}\end{align*}\begin{align*} \sqrt{3}1\dfrac{1}{1\dfrac{1}{2\d…

ansible备份mysql_ansible做mysql备份和安全加固

2019独角兽企业重金招聘Python工程师标准>>>1. mysql备份A patch adding nameall was added to the mysql_db module on May 12, 2015, so the recommended way to dump all databases is:# Dumps all databases to hostname.sql- mysql_db: statedump nameall target…

链表之删除双链表倒数第K个节点

链表之删除双链表倒数第K个节点 题目: 链表之删除双链表倒数第K个节点 思路: 之前写过 http://blog.csdn.net/u011068702/article/details/50280099(链表之删除单链表倒数第K个节点),思路是一样的,如果不知道,你可以参考下 代码实现: package com.chenyu.zuo.link…

如何让代码段只运行在 Debug 模式下 ?

咨询区 Ronnie Overby我的 asp.net core 项目需要访问一个站外的 api 接口&#xff0c;双方协商通过api参数来约定当前请求是 测试 还是 正式, 目前的做法就是在测试环境中放开测试代码&#xff0c;在发布环境再注释掉这段代码&#xff0c;作为极客&#xff0c;我想知道有什么极…

ICMP

ICMP是网络层协议 能反馈和解决网络层的问题 ping traceroute 转载于:https://www.cnblogs.com/YDDMAX/p/5361165.html

(转)svn检出的时候报 Unable to connect to a repository at URL错误

背景&#xff1a;1. SVN服务器&#xff1a;VisualSVN-Server-2.5.5&#xff1b;2. SVN客户端&#xff1a;TortoiseSVN-1.7.6.22632-x64-svn-1.7.4.msi&#xff1b; 在SVN服务器上&#xff0c;新建一个数据仓库aaa&#xff0c;用户ABC拥有读写权限。现象&#xff1a;1.…