`

tag

    博客分类:
  • Java
阅读更多
>“山高人为峰”,这句话也可以用在技术的研究上。

   jsp规范里,标签具有比javabean更丰富的运行时协议。它可以非常机密的和jsp的表示逻辑联系在一起,同时,又具有javabean相同业务处理能力。所以,标签的学习成为迫切的需要,但为了满足实际项目的开发,自定义标签的学习是不容错过的。

   过实现接口或者继承现有的类,我们就可以开发自定义的标签。

   用的接口有:             JspTag

                       Tag       SimpleTag<----SimpleTagSupport

               IterationTag <----TagSupport           

                    BodyTag<----BodyTagSupport

   定义标签的开发包括两个部分的开发:

(1)、开发标签的处理程序(java类)

(2)、标签描述文件(.tld文件)

   定义标签的种类有许多,可以根据实际项目的需要进行编写。但为了不重复的开发轮子,jsp标准推出JSTL(标准标签库)。

   始我们的旅行吧,只要是快乐的,谁都想干,做的好与不好就另当别论了。

(1)从Hello World开始吧,自定义一个类它实现Tag接口,Tag接口主要定义的是标签声明周期的方法,比如:doStartTag(),doEndTag()等,通过PageContext对象来访问Jsp页面的上下文:

package com.xmddl.tag.demo;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.tagext.Tag;

public class HelloTag implements Tag {
 private PageContext context;
 private Tag parent;
 public void setPageContext(PageContext ctx) {
  this.context=ctx;

 }

 public void setParent(Tag tag) {
  this.parent=tag;

 }

 public Tag getParent() {
  return this.parent;
 }

 public int doStartTag() throws JspException {
  System.out.println("doStartTag");
  return Tag.SKIP_BODY;
 }

 public int doEndTag() throws JspException {
  System.out.println("doStartTag");
  try {
   this.context.getOut().write("Hello World");
  } catch (Exception e) {
   e.printStackTrace();
  }
  return Tag.EVAL_PAGE;
 }

 public void release() {
  // TODO Auto-generated method stub
 }

}

 Tag接口中静态常量:

Tag.SKIP_BODY

Tag.EVAL_PAGE

Tag.EVAL_BODY_INCLUDE

Tag.SKIP_PAGE

(2)编写标签描述文件(.tld):

<?xml version="1.0" encoding="UTF-8" ?>
<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>xmddl 1.1 hello library</description>
  <display-name>xmddl hello</display-name>
  <tlib-version>1.1</tlib-version>
  <short-name>hello</short-name>
  <uri>http://www.xmddl.com/tag</uri>
 
  <tag>
    <description>我的Hello World</description>
    <name>hello</name>
    <tag-class>com.xmddl.tag.demo.HelloTag</tag-class>
    <body-content>empty</body-content>
  </tag>

</taglib>

(3)、在web.xml中对标签的引用:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" " http://java.sun.com/dtd/web-app_2_3.dtd ">
<web-app>
 <taglib>
   <taglib-uri>http://www.xmddl.com/tag</taglib-uri>
  <taglib-location>/WEB-INF/mytag.tld</taglib-location>
 </taglib>
</web-app>

(4)、编写测试页面:

<%@ page language="java" pageEncoding="UTF-8" import="java.util.*"%>
<%@ taglib uri="http://www.xmddl.com/tag" prefix="lu"%>
<html>
  <head>
    <title>MyJsp.jsp</title>
    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">   
    <meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
    <meta http-equiv="description" content="This is my page">
  </head>
 
  <body>
    <h1>This is a test tag page for person.</h1> <br>
   <lu:hello/>
  </body>
</html>
下面看看标签中的属性是如何使用的,我们直接继承TagSupport类来编写:

 package com.xmddl.tag.demo;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.Tag;
import javax.servlet.jsp.tagext.TagSupport;

public class HelloSupport extends TagSupport {
 private String value;
 private static final long serialVersionUID = 1L;
 public HelloSupport(){
  super();
 }
 public int doStartTag() throws JspException {
  System.out.println("doStartTag");
  return TagSupport.EVAL_BODY_INCLUDE;
 }

 public int doEndTag() throws JspException {
  System.out.println("doEndTag");
  try {
   this.pageContext.getOut().write("标签的属性值:"+this.value);
  } catch (Exception e) {
   e.printStackTrace();
  }
  return Tag.EVAL_PAGE;
 }
 public int doAfterBody() throws JspException{
  System.out.println("doAfterBody");
  try {
   this.pageContext.getOut().write("<br>以上为标签的内容<br>");
  } catch (Exception e) {
   e.printStackTrace();
  }
  return TagSupport.EVAL_BODY_INCLUDE;
  
 }
 public String getValue() {
  return value;
 }
 public void setValue(String value) {
  this.value = value;
 }
}
======================

...

<tag>
    <name>hellosupport</name>
    <tag-class>com.xmddl.tag.demo.HelloSupport</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>value</name>
        <required>true</required>
        <rtexprvalue>false</rtexprvalue>
    </attribute>
  </tag>

...

=======================

<%@ page language="java" pageEncoding="gb2312" import="java.util.*"%>
<%@ taglib prefix="lu" uri=" http://www.xmddl.com/tag " %>
<html>
  <head>
  </head>
  <body>

    <h1>This is a test tag page for person.</h1> <br>
  <lu:hellosupport value="red">xmddl</lu:hellosupport>
  </body>
</html>

 利用TagSupport带来很大的方便,只要重写其中的部分方法即可实现一个标签处理程序,以上开发的标签程序和JSTL1.1标签库一起使用时出现一些疑问,原来标签的uri=" http://java.sun.com/jsp/jstl/core ",但是,在如下的测试中会发现c:out中的值输不出来,所以,只能改为uri=" http://java.sun.com/jstl/core ",

<%@ page language="java" pageEncoding="gb2312" import="java.util.*"%>
<%@ taglib prefix="lu" uri=" http://www.xmddl.com/tag " %>
<%@ taglib prefix="c" uri=" http://java.sun.com/jstl/core " %>

<html>
  <head>
  </head>
  <body>

    <h1>This is a test tag page for person.</h1> <br>
    <%request.setAttribute("name","xmddl"); %>
    <%session.setAttribute("names","xmddls"); %>
   
  <lu:hellosupport value="red">xmddl</lu:hellosupport><hr>
  <c:forEach begin="1" end="5" step="1">
   name=<c:out value="${name}"></c:out>
   names=<c:out value="${names}"></c:out><br>
  </c:forEach>
  </body>
</html>
输出如下:

This is a test tag page for person.
xmddl
以上为标签的内容
标签的属性值:red


name=xmddl names=xmddls
name=xmddl names=xmddls
name=xmddl names=xmddls
name=xmddl names=xmddls
name=xmddl names=xmddls

接着看看迭代标签的开发,首先,我们关注的是接口IterationTag,还有它的实现类TagSupport,接口BodyTag对IterationTag的扩展,还有BodyTag的实现类BodyTagSupport。

package com.xmddl.tag.demo;

import java.io.IOException;

import javax.servlet.jsp.JspException;
import javax.servlet.jsp.tagext.BodyTagSupport;
public class MyIteratorSupport extends BodyTagSupport {
 private static final long serialVersionUID = 1L;
 public String count;
 public String strColor;
 private int cou;
 
 public void setCount(String count) {
  this.count = count;
  cou=Integer.parseInt(count);
 }
 
 public int doAfterBody() throws JspException {
  try {
   this.pageContext.getOut().write("<br>");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  if(cou>1){
   cou--;
   return MyIteratorTag.EVAL_BODY_AGAIN;
  }else{
   return MyIteratorTag.SKIP_BODY;
  }
 }
 public int doStartTag() throws JspException {
  try {
   this.pageContext.getOut().write("<font color='"+this.strColor+"'>");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return MyIteratorTag.EVAL_BODY_INCLUDE;
 }

 public int doEndTag() throws JspException {
  try {
   this.pageContext.getOut().write("</font>");
  } catch (IOException e) {
   // TODO Auto-generated catch block
   e.printStackTrace();
  }
  return MyIteratorTag.EVAL_PAGE;
 }

 public int getCou() {
  return cou;
 }

 public void setCou(int cou) {
  this.cou = cou;
 }

 public String getCount() {
  return count;
 }

 public String getStrColor() {
  return strColor;
 }

 public void setStrColor(String strColor) {
  this.strColor = strColor;
 }

}
==============

。。。

<tag>
    <description>对颜色的设置</description>
    <name>myColor</name>
    <tag-class>com.xmddl.tag.demo.MyIteratorSupport</tag-class>
    <body-content>JSP</body-content>
    <attribute>
        <name>count</name>
        <required>true</required>
    </attribute>
    <attribute>
        <name>strColor</name>
        <required>false</required>
    </attribute>
   </tag>

。。。

==============

<%@ page language="java" pageEncoding="gb2312" import="java.util.*"%>
<%@ taglib prefix="lu" uri="http://www.xmddl.com/tag" %>
<html>
  <head>
  </head>
  <body>

    <h1>This is a test tag page for person.</h1> <br>
    <lu:myColor count="3" strColor="blue">xmddl</lu:myColor>
  </body>
</html>

输出如下

This is a test tag page for person.


xmddl
xmddl
xmddl

分享到:
评论

相关推荐

    libid3tag MP3 TAG库

    **libid3tag MP3 TAG库** libid3tag是一个开源的C库,专门用于处理MP3文件的ID3标签。ID3标签是存储在音频文件(尤其是MP3)中的元数据,它包含了歌曲的标题、艺术家、专辑、年份等信息。libid3tag库提供了读取、...

    apriltag 标签 tag36h11

    《apriltag标签技术详解——聚焦tag36h11》 在计算机视觉领域,apriltag是一种广泛应用的二维图像识别技术,它以其鲁棒性和高效性被广泛应用于机器人导航、无人机定位、自动化物流等领域。其中,tag36h11是apriltag...

    用过的tag用过的tag 用过的tag

    用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用过的tag用...

    Apriltag_python-master.zip_3ZE5_AprilTags python_AprilTag编译_Apri

    【标题】中的"Apriltag_python-master.zip_3ZE5_AprilTags python_AprilTag编译_Apri"指的是一个包含Apriltag Python库的压缩文件,版本号可能是3ZE5,它提供了免编译的AprilTag识别功能。AprilTag是一种开源的视觉...

    apriltag-c-linux

    **apriltag-c-linux** 是一个专为Linux操作系统设计的C语言实现的开源库,用于检测和识别Apriltag二维码。Apriltag是一种强大的视觉定位技术,尤其在机器人学、无人机(UAV)导航和自动化领域有着广泛的应用。这个库...

    高分辨率tag36h11

    其中,Apriltag是这类标记系统的一个著名实现,由美国麻省理工学院(MIT)的Robot Locomotion Group开发。Apriltag是一种强大的二维图像识别系统,尤其适用于户外环境和远距离识别。 本文主要围绕"高分辨率tag36h11...

    自动提取TAG 资源

    在IT行业中,"自动提取TAG"是一个重要的技术领域,它主要涉及到自然语言处理(NLP)和信息检索(IR)的结合。这个过程通常用于内容分析、数据挖掘和搜索引擎优化等多个场景,目的是从大量文本数据中自动识别出具有...

    帝国cms TAG静态化插件.zip

    "帝国cms TAG静态化插件"是专门为这个系统设计的一款扩展插件,它的主要目标是实现TAG标签的静态化处理,以提升网站的加载速度和SEO优化。 在网站运营中,TAG标签是一种常用的内容组织方式,它能够将具有相似主题的...

    自己收藏的精美 tag 标签样式

    在IT领域,尤其是在网页设计和开发中,"tag 标签样式"是一个重要的概念,它涉及到用户界面(UI)的设计美学以及用户体验(UX)的优化。Tag标签通常用于分类、标记或者过滤内容,例如博客文章的关键词或者产品分类。...

    antd-input-tag.zip

    "antd-input-tag"是一个Antd中的组件,专门用于将用户在input框中输入的内容转化为可操作的tags,这种功能常见于标签管理系统或者输入筛选条件的场景。 Antd Input Tag组件的核心功能是将用户的连续输入截断成单独...

    apriltag_ros包

    "apriltag_ros"包是ROS (Robot Operating System)生态系统中的一个重要组件,它主要用于目标检测和追踪,特别是针对Apriltag标记的识别。Apriltag是一种开源的视觉定位系统,由麻省理工学院的Robotics Group开发,...

    AprilTag高清二维码矢量图(全)

    AprilTag是一种广泛应用于机器人视觉定位、无人机导航和自动化检测等领域的二维码系统。它是由美国麻省理工学院(MIT)的Robot Locomotion Group开发的一种高精度、鲁棒性强的二维码技术。与传统的条形码或二维码相比...

    apriltag-master.zip

    《Apriltag技术详解》 Apriltag是一个广泛应用于机器人定位、目标检测和跟踪的开源视觉标记系统。它由美国麻省理工学院的AprilLab研发,以其高效、鲁棒和易于实现的特点在学术界和工业界得到了广泛应用。本文将深入...

    apriltag-windows专用安装包

    《apriltag在Windows环境下的安装与应用详解》 apriltag是一款开源的视觉目标检测库,主要用于识别图像中的特定标记。它以其高效、鲁棒的特性被广泛应用于机器人导航、增强现实等领域。然而,对于Windows用户来说,...

    Android NFC Tag ID 读取

    Android NFC Tag ID 读取 Android NFC(Near Field Communication,近距离通信)技术是一种短距离无线通信技术,允许设备之间在近距离内进行数据交换。Android NFC Tag ID 读取是指在 Android 设备中读取 NFC 标签...

    pb权限控制(tag法)

    PB权限控制(Tag法)是一种在PowerBuilder应用中实现精细化权限管理的方法,尤其适用于需要控制大量权限项的系统。在PB环境下,权限控制通常涉及到不同用户对系统内多个子系统、菜单项、按钮等操作的权限分配。Tag法...

    C# Dicom文件解析获取Tag数据

    本教程将深入讲解如何使用C#语言解析DICOM文件,并提取其中的Tag数据。Tag是DICOM文件结构的核心,包含了关于图像的各种元信息,如患者信息、设备信息、序列参数等。 首先,理解DICOM Tag的概念至关重要。Tag是由两...

    layui实现input框添加tag

    本文将详细介绍如何使用Layui实现input框添加tag功能。 首先,我们需要理解tag输入框的基本概念。Tag输入框是一种常见的用户界面元素,它允许用户在输入文本的同时,将其转化为标签形式展示,常用于关键词输入、...

    利用tag防止路由环路和次优路径.docx

    本文档详细介绍了如何利用Tag技术来解决这些问题,主要针对Cisco CCNP的相关知识,具体步骤如下: 首先,问题的核心在于双向重分发(Redistribution)导致的路由循环和次优路径。例如,在R2和R3之间,由于OSPF和RIP...

    帝国cms-TAG高级管理插件.zip

    帝国CMS 7.2 7.5 TAG插件 TAG高级管理工具tags插件SEO利器 一、TAG展示新增功能 TAG伪静态可设置以TAG拼音或TAGID形式,更利于SEO 自带TAG首页功能,方便展示全部TAg 自定义列表排序 二、TAG管理新增功能 批量增加...

Global site tag (gtag.js) - Google Analytics