1_Jsp标签_简单自定义
一 简介
主要用于移除jsp页面中的java代码
- 编写一个实现Tag接口的Java类,为避免需要实现不必要的方法,只需继承TagSupport类,
把页面java代码移到这个标签处理类中, - 然后编写标签库描述符文件:*.tld
- 在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. 加入标签库:
- 根据tld文件找到对应的标签处理类;
- doStartTag() -> 显示本体文字 -> doAfterBodyTag()->doEndTag()->执行接下来的JSP网页
- ---------------------------------------------
- 当JSP容器在解释JSP页面时,如果遇到自定义标签,将利用标签处理类建立一个标签处理对象。于此同时,JSP容器自动调用setPageContext()方法,将自定义标签的属性值存入标签处理对象,初始化标签处理对象
- JSP容器运行doStartTag()方法,根据该方法返回值决定后续动作。
- 如果返回SKIP_BODY常量,JSP容器忽略该标签主题内容,运行doEndTag()方法
- 若返回EVAL_BODY_INCLUDE常量,JSP容器执行标签主体内容,并将结果包括在响应中,然后运行doAfterBody()方法
- 返回EVAL_BODY_AGAIN常量,JSP容器会再次执行标签体内容
若doEndTag()方法返回EVAL_PAGE常量,JSP容器运行自定义标签后面的JSP内容;若返回SKIP_PAGE常量
JSP容器忽略自定义标签后面的JSP内容
4. 类之间的关系:
-

三 步骤
- 编写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();
} } - 标签库描述符文件
<?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> - 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> - 结果

1_Jsp标签_简单自定义的更多相关文章
- 3_Jsp标签_简单标签_防盗链和转义标签的实现
一概念 1防盗链 在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件,通过referer,网站可以检测目标网页访问的来源网页.有了referer跟踪来 ...
- 传智播客JavaWeb day07、day08-自定义标签(传统标签和简单标签)、mvc设计模式、用户注册登录注销
第七天的课程主要是讲了自定义标签.简单介绍了mvc设计模式.然后做了案例 1. 自定义标签 1.1 为什么要有自定义标签 前面所说的EL.JSTL等技术都是为了提高jsp的可读性.可维护性.方便性而取 ...
- (转)sl简单自定义win窗体控件
sl简单自定义win窗体控件 相信大家接触过不少win窗体控件ChildWin子窗口就的sl自带的一个 而且网上也有很多类似的控件,而今天我和大家分享下自己制作个win窗体控件,希望对初学 ...
- Android系统--输入系统(十一)Reader线程_简单处理
Android系统--输入系统(十一)Reader线程_简单处理 1. 引入 Reader线程主要负责三件事情 获得输入事件 简单处理 上传给Dispatch线程 InputReader.cpp vo ...
- jsp的标签库和自定义标签
1.jstl标签库 JSP标准标签库(JSTL)是一个JSP标签集合,它封装了JSP应用的通用核心功能. JSTL支持通用的.结构化的任务,比如迭代,条件判断,XML文档操作,国际化标签,SQL标签. ...
- UI设计篇·入门篇·绘制简单自定义矩形图/设置按钮按下弹起颜色变化/设置图形旋转
Android的基本控件和图形有限,难以满足所有的实际需要和设计需求,好在Android给出了相对完善的图形绘制和自定义控件的API,利用这些API,可以基本满足设计的需求. 自定义图像和控件的方法: ...
- Spring源码分析(九)解析默认标签中的自定义标签元素
摘要:本文结合<Spring源码深度解析>来分析Spring 5.0.6版本的源代码.若有描述错误之处,欢迎指正. 到这里我们已经完成了分析默认标签的解析与提取过程,或许涉及的内容太多,我 ...
- TabbedPane标签美化式样自定义
JTabbedPane标签美化式样自定义 摘自:https://blog.csdn.net/yuanzihui/article/details/43936795 通过继承BasicTabbedPane ...
- [原创]java WEB学习笔记42:带标签体的自定义标签,带父标签的自定义标签,el中自定义函数,自定义标签的小结
本博客为原创:综合 尚硅谷(http://www.atguigu.com)的系统教程(深表感谢)和 网络上的现有资源(博客,文档,图书等),资源的出处我会标明 本博客的目的:①总结自己的学习过程,相当 ...
随机推荐
- 解决Manjaro linux的中文输入
系统安装完成后, 首先:安装中文输入法:pacman -S fcitx fcitx-libpinyin kcm-fcitx 接着:修改.xprofile 添加内容如下: export GTK2_RC_ ...
- ubuntu16.04安装docker CE
如需开始在 Ubuntu 上使用 Docker CE,请确保您满足先决条件,然后再安装 Docker. 如需安装 Docker 企业版 (Docker EE),请转至获取适用于 Ubuntu 的 Do ...
- Codeforces 761E Dasha and Puzzle(构造)
题目链接 Dasha and Puzzle 对于无解的情况:若存在一个点入度大于4,那么直接判断无解. 从根结点出发(假设根结点的深度为0), 深度为0的节点到深度为1的节点的这些边长度为2^30, ...
- Single Number II - LeetCode
Given an array of integers, every element appears three times except for one. Find that single one. ...
- Java---Static内存图详解
案例: 输出结果 内存图: 执行流程: java文件通过编译成class文件,class文件通过类加载器加载到方法区中,程序首先会加载核心类库,也就是你的程序想要运行所需要的一些最基本的类.接着程序会 ...
- UIView和UIImageView 旋转消除锯齿方法
方法一: calendarImageView_ =[[UIImageView alloc] initWithFrame:CGRectMake(3,3,60,72)]; calendarImag ...
- PS中把图片白色背景变成透明的方法
用魔术橡皮擦擦去白色(调整容差,取消连续,点选白色部分),保存成png格式
- 前端模板adminlte
adminlet是一个前端模板,包含各种各样的功能,自己的网站可以根据需要进行修改:可以免费使用,也有收费增强版,界面如下: 参考: 1.https://adminlte.io/ 2.https:// ...
- z pre-pass 相关问题的讨论
z pre-pass 是指在渲染流程中,第一个pass先画一张深度buffer出来,得到需要绘制的最前面这层深度,用这个在接下来的pass中做深度剔出,这样在第二个pass中会省略很多绘制. 这项技术 ...
- 【音乐App】—— Vue-music 项目学习笔记:歌手页面开发
前言:以下内容均为学习慕课网高级实战课程的实践爬坑笔记. 项目github地址:https://github.com/66Web/ljq_vue_music,欢迎Star. 一.歌手页面布局与设计 需 ...