[转][Java]自定义标签简介

Posted 秤心

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了[转][Java]自定义标签简介相关的知识,希望对你有一定的参考价值。

作用:自定义标签主要用于移除 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]自定义标签简介的主要内容,如果未能解决你的问题,请参考以下文章

Sublime Text3自定义代码片段

SpringCloud系列十一:SpringCloudStream(SpringCloudStream 简介创建消息生产者创建消息消费者自定义消息通道分组与持久化设置 RoutingKey)(代码片段

VSCode创建自定义用户片段

为片段制作自定义列表视图?

jstl标签库基础教程及其使用代码

JavaWeb自定义标签