一 简介

  主要用于移除jsp页面中的java代码

  1. 编写一个实现Tag接口的Java类,为避免需要实现不必要的方法,只需继承TagSupport类,
        把页面java代码移到这个标签处理类中,
  2. 然后编写标签库描述符文件:*.tld
  3. 在jsp页面导入标签库即可使用

二 原理

  1. JSP的执行过程主要可以分为以下几点:

1  客户端发出请求。
2  Web容器将JSP转译成Servlet源代码。
3  Web容器将产生的源代码进行编译。
4  Web容器加载编译后的代码并执行。
5  把执行结果响应至客户端

  2. 没有标签时:

    JSP页面中的位于<% %>外面的每行和紧临<%%>两边的每段文本被转换成以这些文本作为参数的一条条out.write语句,

    JSP脚本片断(位于<%%>内的 一段java代码)中的java代码被原封不动地搬移进了_jspService方法中的相应位置处,

    JSP表达式(位于<%=和%>之中的内容)则是被转换成以其 中的变量或表达式作为参数的out.print语句。

  3. 加入标签库:

    1. 根据tld文件找到对应的标签处理类;
    2. doStartTag() -> 显示本体文字 -> doAfterBodyTag()->doEndTag()->执行接下来的JSP网页
    3. ---------------------------------------------
      • 当JSP容器在解释JSP页面时,如果遇到自定义标签,将利用标签处理类建立一个标签处理对象。于此同时,JSP容器自动调用setPageContext()方法,将自定义标签的属性值存入标签处理对象,初始化标签处理对象
      • JSP容器运行doStartTag()方法,根据该方法返回值决定后续动作。
        1. 如果返回SKIP_BODY常量,JSP容器忽略该标签主题内容,运行doEndTag()方法
        2. 若返回EVAL_BODY_INCLUDE常量,JSP容器执行标签主体内容,并将结果包括在响应中,然后运行doAfterBody()方法
        3. 返回EVAL_BODY_AGAIN常量,JSP容器会再次执行标签体内容
      • 若doEndTag()方法返回EVAL_PAGE常量,JSP容器运行自定义标签后面的JSP内容;若返回SKIP_PAGE常量
        JSP容器忽略自定义标签后面的JSP内容

  4. 类之间的关系:

-

三 步骤

  1. 编写HelloWorldTag.java

    package com.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 HelloWorldTag extends TagSupport {
    private static final long serialVersionUID = 1L;
    private String name;
    public void setName(String name)
    {
    this.name = name;
    } @Override
    public int doStartTag() throws JspException {
    JspWriter out = this.pageContext.getOut();
    HttpServletRequest hreq = (HttpServletRequest) this.pageContext.getRequest();
    try {
    out.print("Hello-World-"+name+"<br/>");
    } catch (IOException e) {
    e.printStackTrace();
    throw new RuntimeException(e);
    }
    return super.doStartTag();
    } }
  2. 标签库描述符文件
    <?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>A tag library exercising SimpleTag handlers.</description>
    <tlib-version>1.0</tlib-version>
    <short-name>SimpleTagLibrary</short-name>
    <uri>http://self-tag-with-hello</uri> <tag>
    <name>helloWorld</name> <tag-class>com.tag.HelloWorldTag</tag-class>
    <body-content>empty</body-content>
    <attribute>
    <name>name</name>
    <required>true</required>
    <rtexprvalue>true</rtexprvalue>
    </attribute>
    </tag> </taglib>
  3. jsp页面显示
    <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
    <%@ taglib uri="http://self-tag-with-hello" prefix="i" %>
    <html>
    <head>
    <title>helllo</title>
    </head>
    <body>
    <i:helloWorld name="小呵"/>
    </body>
    </html>
  4. 结果

最新文章

  1. 使用专业的消息队列产品rabbitmq之centos7环境安装
  2. 关闭dialog(lhgdialog)
  3. [java] 汇率换算器实现(1)
  4. [C/C++][文件操作] 对比目录并列出同名较新文件、较旧文件 0.1
  5. 解决: Fail to create empty document
  6. PHP 反射 ReflectionClass
  7. 总结了关于PHP xss 和 SQL 注入的问题(转)
  8. 2016.09.01 html5兼容
  9. C# DLL文件注册问题(涉及AxInterop.WMPLib.dll等)
  10. 水题 hdu1002------用BigInteger解决大数问题
  11. C++11标准后的C++阅读书目
  12. Marble 绘制线
  13. 入坑以来最清晰的this指南[老哥们来交流指正]
  14. Java中的空值判断
  15. BZOJ.4151.[AMPPZ2014]The Cave(结论)
  16. Android的ToolBar
  17. CSS Modules入门教程
  18. 大神教你Debian GNU/Linux 9.7 “Stretch” Live和安装镜像开放下载
  19. Tomcat和java的安装
  20. mysql8 :客户端连接caching-sha2-password问题

热门文章

  1. android中Adapter适配器的讲解
  2. Spring Boot学习——第一个Spring Boot程序
  3. python的特殊方法总结
  4. hdu 3579(中国剩余定理+考虑0)
  5. Educational Codeforces Round 39 (Rated for Div. 2) B. Weird Subtraction Process[数论/欧几里得算法]
  6. Codeforces 632F Magic Matrix(bitset)
  7. Codeforces 739B Alyona and a tree(树上路径倍增及差分)
  8. 洛谷——P1227 [JSOI2008]完美的对称
  9. Storyboards Tutorial 03
  10. GLSL纹理贴图 【转】