一 简介

  主要用于移除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_Jsp标签_简单自定义的更多相关文章

  1. 3_Jsp标签_简单标签_防盗链和转义标签的实现

    一概念 1防盗链 在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件,通过referer,网站可以检测目标网页访问的来源网页.有了referer跟踪来 ...

  2. 传智播客JavaWeb day07、day08-自定义标签(传统标签和简单标签)、mvc设计模式、用户注册登录注销

    第七天的课程主要是讲了自定义标签.简单介绍了mvc设计模式.然后做了案例 1. 自定义标签 1.1 为什么要有自定义标签 前面所说的EL.JSTL等技术都是为了提高jsp的可读性.可维护性.方便性而取 ...

  3. (转)sl简单自定义win窗体控件

    sl简单自定义win窗体控件      相信大家接触过不少win窗体控件ChildWin子窗口就的sl自带的一个  而且网上也有很多类似的控件,而今天我和大家分享下自己制作个win窗体控件,希望对初学 ...

  4. Android系统--输入系统(十一)Reader线程_简单处理

    Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...

  5. jsp的标签库和自定义标签

    1.jstl标签库 JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. ...

  6. UI设计篇·入门篇·绘制简单自定义矩形图/设置按钮按下弹起颜色变化/设置图形旋转

    Android的基本控件和图形有限,难以满足所有的实际需要和设计需求,好在Android给出了相对完善的图形绘制和自定义控件的API,利用这些API,可以基本满足设计的需求. 自定义图像和控件的方法: ...

  7. Spring源码分析(九)解析默认标签中的自定义标签元素

    摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 到这里我们已经完成了分析默认标签的解析与提取过程,或许涉及的内容太多,我 ...

  8. TabbedPane标签美化式样自定义

    JTabbedPane标签美化式样自定义 摘自:https://blog.csdn.net/yuanzihui/article/details/43936795 通过继承BasicTabbedPane ...

  9. [原创]java WEB学习笔记42:带标签体的自定义标签,带父标签的自定义标签,el中自定义函数,自定义标签的小结

    本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...

随机推荐

  1. 在 Fedora 26/27 GNOME 3.24/3.26 环境中安装 FCITX 小企鹅输入法(修订)

    之前我曾经写过一篇文章介绍在 GNOME 3.x 下安装小企鹅输入法框架,但最近在 Fedora 26/27 环境下发现老方法已经失效了,会导致 GNOME 3.24/3.26 桌面在重启后无法进入, ...

  2. 无法启动Visual Studio的localhost web服务器,端口"xxxx"已被使用

    解决方法:项目属性-Web里面有web服务器端口的设置,换个端口即可.项目属性->web->服务器,不要选择“自动分配端口”,选择“使用指定端口”,后面输入一个端口号

  3. 判断图连通的三种方法——dfs,bfs,并查集

    Description 如果无向图G每对顶点v和w都有从v到w的路径,那么称无向图G是连通的.现在给定一张无向图,判断它是否是连通的. Input 第一行有2个整数n和m(0 < n,m < ...

  4. UVA 11039 Building designing 贪心

    题目链接:UVA - 11039 题意描述:建筑师设计房子有两条要求:第一,每一层楼的大小一定比此层楼以上的房子尺寸要大:第二,用蓝色和红色为建筑染色,每相邻的两层楼不能染同一种颜色.现在给出楼层数量 ...

  5. 调试SQLSERVER (一)生成dump文件的方法

    http://www.cnblogs.com/lyhabc/p/4184149.html http://www.cnblogs.com/lyhabc/p/4185399.html

  6. Jinja2文档学习

    这些文档需要精度一遍 1.http://jinja.pocoo.org/docs/dev/ 2.http://jinja.pocoo.org/docs/dev/templates/# 3.https: ...

  7. 【J2SE高速进阶】——多线程之synchronized

    我和老婆去银行取钱 有一天,和老婆打了个赌.如今我的银行账号里共同拥有5000块钱.我们去银行同一时候取钱,看我俩能不能同一时候取出5000来....(PS:打赌的代价是:假设都能取出5000,那这1 ...

  8. Linux USB驱动数据结构

    struct usb_ctrlrequest {    __u8 bRequestType;    __u8 bRequest;    __le16 wValue;    __le16 wIndex; ...

  9. New Ubuntu 16.04 Server Checklist

    新的云服务器需要进行一些配置和安装一些软件,推荐Digitalocean社区的一些教程 服务器配置(包括SSH,安全设置):https://www.digitalocean.com/community ...

  10. 【LeetCode-面试算法经典-Java实现】【139-Word Break(单词拆分)】

    [139-Word Break(单词拆分)] [LeetCode-面试算法经典-Java实现][全部题目文件夹索引] 原题 Given a string s and a dictionary of w ...