作用:自定义标签主要用于移除 jsp 页面中的 java 代码。

实现:需要完成以下两个步骤:

  1. 编写一个实现 Tag 接口的 Java 类,把页面 java 代码移到这个 java 类中。(标签处理类)
  2. 编写标签库描述符 (tld)文件,在 tld 文件中把标签处理器类描述成一个标签。

代码:新建一个  day11 项目,在 src 目录下新建 cn.itcast.web.tag 包,ViewIPTag Java文件

package cn.itcast.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 {
HttpServletRequest request = (HttpServletRequest) this.pageContext.getRequest();
JspWriter out = this.pageContext.getOut(); String ip = request.getRemoteAddr();
try {
out.print(ip);
} catch (IOException e) {
throw new RuntimeException(e);
} return super.doStartTag();
}
}

再在 WebRoot\WEB-INF 目录下新建 itcast.tld

<?xml version="1.0" encoding="UTF-8" ?>
<!-- 本代码部分内容来自:
X:\apache-tomcat-7.0.77-src\webapps\examples\WEB-INF\jsp2\jsp2-example-taglib.tld
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
--> <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>itcast</short-name>
<uri>http://www.itcast.cn</uri> <tag>
<description>输出客户端IP</description>
<name>viewIP</name>
<tag-class>cn.itcast.web.tag.ViewIPTag</tag-class>
<body-content>empty</body-content>
</tag> </taglib>

这时候就可以在任意 jsp 文件中使用此标签

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib uri="http://www.itcast.cn" prefix="itcast" %> <!doctype html>
<html>
<head>
<title>starting page</title>
</head>
<body>
This is my JSP page. <br>
来自客户端的IP是:<itcast:viewIP/>
</body>
</html>

标签调用流程:

1. 浏览器给 Web 服务器发送 jsp页面请求

2. Web 服务器开始解释 jsp 页面

3. 遇到自定义标签,首先实例化标签对应的标签处理器类

4. 调用 setPageContext 方法,把页面的 pageContext 对象传递给标签处理器类

5. 看标签是否有父标签,如果有父标签,把父标签作为一个对象,调用 setParent 方法传递给标签处理器类,如果没有,传递一个 null

6. 完成以上标签的初始化工作后,服务器就开始执行标签。这时遇到 标签的开始标签,就调用 doStartTag 方法

7. 如果标签有标签体,这时服务器一般会执行标签体

8. 服务器遇到 jsp页面结束标签,则调用标签处理器类的 doEndTag 方法

9. 整个标签执行完后,服务器一般情况下会调用 release 方法释放标签工作时所占用的资源

Method Summary => setPageContext(PageContext pc) getParent() setParent() doStartTag() doEndTag() release()

在 ViewIPTag.java 类中,doStartTag 方法默认是 return super.doStartTag();

如果改写为 return Tag.EVAL_BODY_INCLUDE 则输出标签体

如果改写为 return Tag.SKIP_BODY 则不输出标签体

doEndTag 方法默认是 return super.doEndTag();

如果改写为 return Tag.EVAL_PAGE 则输出

如果改写为 return Tag.SKIP_PAGE 则停止输出

假如需要标签体执行 5 次,在 doAfterBody 方法里写:

@Override
public int doStartTag() throws JspException {
return Tag.EVAL_BODY_INCLUDE;
} @Override
public int doAfterBody() throws JspException {
int x=5;
x--;
if(x>0){
return IterationTag.EVAL_BODY_AGAIN;
}else{
return IterationTag.SKIP_BODY;
}
}
// 修改标签体
public class TagDemo4 extends BodyTagSupport {
@Override
public int doStartTag() throws JspException {
return BodyTag.EVAL_BODY_BUFFERED;
} @Override
public int doEndTag() throws JspException {
BodyContent bc = this.getBodyContent();
String content = bc.getString();
content = content.toUpperCase(); try {
this.pageContext.getOut().write(content);
} catch (IOException e) {
throw new RuntimeException(e);
} return Tag.EVAL_PAGE;
}
}

[转][Java]自定义标签简介的更多相关文章

  1. java自定义标签 权限

    <?xml version="1.0" encoding="UTF-8" ?> <taglib xmlns="http://java ...

  2. java 自定义标签 传值

    <?xml version="1.0" encoding="UTF-8" ?>   <taglib xmlns="http://ja ...

  3. Java ---自定义标签

         本篇文章介绍自定义标签,可能在工作中很少涉及到自己来定义一个标签库,因为我们基本上都是使用的大神写的标签库,基本上直接使用即可,但是从自身的发展来看,通往高级程序员的道路上,开发框架就需要大 ...

  4. Java ---自定义标签(二)

    上篇文章的最后,我们自定义了一个带属性的标签,并使用它完成了一个简单的案例.其实到这我们已经可以看出来,前端jsp页面只需要写一个类似html语法的标签,就可以完成将集合中的数据取出来并展示这么相对复 ...

  5. JSTL自定义标签

    这节我们总结一下JSTL自定义标签相关内容. 1. 自定义标签简介 自定义标签主要用于移除JSP页面中的Java代码.Jsp页面主要是用来显示给前台的,如果里面有过多的java代码的话,会显得很乱,但 ...

  6. javaEE(7)_自定义标签&JSTL标签(JSP Standard Tag Library)

    一.自定义标签简介 1.自定义标签主要用于移除Jsp页面中的java代码,jsp禁止出现一行java脚本. 2.使用自定义标签移除jsp页面中的java代码,只需要完成以下两个步骤: •编写一个实现T ...

  7. Salesforce 自定义标签在代码中的应用

    自定义标签简介 Salesforce 中自定义标签(Custom Label)的作用是存储一般性的文本,可以用于 Apex.Visualforce 页面.Lightning 组件等地方,用于显示提示信 ...

  8. JSP2 自定义标签

    实现步骤 实现自定义标签的处理类继承javax.servlet.jsp.tagext.SimpleTagSupport,并重写doTag方法 建立标签库配置文件 在jsp中使用自定义标签 一个简单的标 ...

  9. [Java] JSP笔记 - 自定义标签

    自定义标签的创建步骤: 自定义标签的四大功能: 自定义标签的类结构: 在 1.0 中呢, 可以将 <body-content> 的值设置为 JSP, 2.0中则不允许在自定义标签体中出现j ...

随机推荐

  1. sonar runner的配置

    #Configure here general information about the environment, such as SonarQube DB details for example ...

  2. /etc/rc.local 与 /etc/profile

    1.用户自己源码安装的软件组要自启动,可以在/etc/rc.local中配置,rc.loacl 是rc.d/rc.local的一个软连接.rc.local -> rc.d/rc.local 2. ...

  3. java学习之浅谈多线程2--线程同步

    如果一个共享资源被多个线程同时访问,可能会遭到破坏.举个例子说明这个问题,假设创建并启动100个线程,每个线程都往同一个账户中添加一个便士,代码如下: import java.util.concurr ...

  4. $n,$!等的含义

    $$ Shell本身的PID(ProcessID)$! Shell最后运行的后台命令的PID$? 上一个运行的命令是否成功的标志,成功为0,失败不为0$* 所有参数列表.如"$*" ...

  5. install ros-indigo-map-msgs

    CMake Warning at /opt/ros/indigo/share/catkin/cmake/catkinConfig.cmake: (find_package): Could not fi ...

  6. [osgearth]通过API创建一个earth模型

    通过API的方式大体需要以下几个步骤: 创建map对象—— 创建影像数据层—— 创建高程数据层—— 将影像数据层以及高程数据层加入到map对象—— 根据前面创建的map对象创建mapNode节点—— ...

  7. Android之shape与selector实现圆角

    shape和selector是Android UI设计中经常用到的,比如我们要自定义一个圆角Button,点击Button有些效果的变化,就要用到shape和selector.可以这样说,shape和 ...

  8. CSS之旋转立方体

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  9. UVA-1613 K-Graph Oddity (着色问题)

    题目大意:一张n个顶点.m条边的无向连通图,用k种颜色着色(相邻顶点颜色不能相同),其中k为不小于点的最大度数的最小奇数. 题目分析:水题一道.建张图深搜一下就行了. # include<ios ...

  10. Android学习必备--java工具15个

    Weka .Weka集成了数据挖掘工作的机器学习算法.这些算法可以直接应用于一个数据集上或者你可以自己编写代码来调用.Weka包括一系列的工具,如数据预处理.分类.回归.聚类.关联规则以及可视化. M ...