JSP自定义标签之简单标签入门
在sun官方文档上有下面这样一段话。
官方文档声明
public interface SimpleTag
extends JspTag
Interface for defining Simple Tag Handlers.
Simple Tag Handlers differ from Classic Tag Handlers in that instead of supporting doStartTag() and doEndTag(), the SimpleTag interface provides a simple doTag() method, which is called once and only once for any given tag invocation. All tag logic, iteration, body evaluations, etc. are to be performed in this single method. Thus, simple tag handlers have the equivalent power of BodyTag, but with a much simpler lifecycle and interface.
To support body content, the setJspBody() method is provided. The container invokes the setJspBody() method with a JspFragment object encapsulating the body of the tag. The tag handler implementation can call invoke() on that fragment to evaluate the body as many times as it needs.
A SimpleTag handler must have a public no-args constructor. Most SimpleTag handlers should extend SimpleTagSupport.
生存周期及调用流程
The following is a non-normative, brief overview of the SimpleTag lifecycle. Refer to the JSP Specification for details.
- A new tag handler instance is created each time by the container by calling the provided zero-args constructor. Unlike classic tag handlers, simple tag handlers are never cached and reused by the JSP container.
- The setJspContext() and setParent() methods are called by the container. The setParent() method is only called if the element is nested within another tag invocation.
The setters for each attribute defined for this tag are called by the container. - If a body exists, the setJspBody() method is called by the container to set the body of this tag, as a JspFragment. If the action element is empty in the page, this method is not called at all.
- The doTag() method is called by the container. All tag logic, iteration, body evaluations, etc. occur in this method.
- The doTag() method returns and all variables are synchronized.
简单标签使用小案例
必知必会:简单标签也是一个标签,所以声明的过程也Tag的一样,同样是三步。
- 创建继承SimpleTag类的实现类,重写doTag方法
- 在tld文件中进行严格的声明
- 在jsp页面中taglib的命名空间及标签前缀的声明,然后进行调用自定义的简单标签
- 第一步:创建实现类:
package web.simpletag;
import java.io.IOException;
import java.io.StringWriter;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.PageContext;
import javax.servlet.jsp.SkipPageException;
import javax.servlet.jsp.tagext.JspFragment;
import javax.servlet.jsp.tagext.SimpleTagSupport;
/**
* 控制标签体是否执行
* @author Summer
*
*/
public class BodyController extends SimpleTagSupport {
static{
/*
* 简单标签整体的执行流程如下:
* 1.浏览器向web服务器发送请求,然后web服务器调用servlet(jsp)
* 2.complier解释器进行初始化工作,先是调用setJspContext方法,将pageContext对象传递进去
* 3.然后是看看此标签的父标签,即setParent方法
* 4.再就是调用doTag方法了吧?但是要知道doTag内部会使用JspFragment对象,所以就必须先得到它,因此应该是调用setJspBody(JspFragment jspBody)方法
* 5.最后是调用doTag 方法,执行相关的代码逻辑
*/
}
/**
* 简单标签可以使用这一个方法实现所有的业务逻辑
*/
@Override
public void doTag() throws JspException, IOException {
//代表标签体的对象
JspFragment fragment = this.getJspBody();
//fragment.invoke(null);是指将标签中的内容写给谁,null代表浏览器
//1.修改标签体的内容
// fragment.invoke(null);
//2.控制标签体内容的重复输出
// for(int i=1;i<=5;i++){
// fragment.invoke(null);//设置为null,默认为向浏览器输出
// }
//3.修改标签体的内容
PageContext context = (PageContext) fragment.getJspContext();
StringWriter writer = new StringWriter();
fragment.invoke(writer);
String content = writer.getBuffer().toString();
this.getJspContext().getOut().write(content.toUpperCase());
//4.控制jsp页面的执行与否,只需要掌握一个原理即可
/*
* SkipPageException - If the page that (either directly or indirectly) invoked this
* tag is to cease evaluation. A Simple Tag Handler generated from a tag
* file must throw this exception if an invoked Classic Tag Handler
* returned SKIP_PAGE or if an invoked Simple Tag Handler threw
* SkipPageException or if an invoked Jsp Fragment threw a
* SkipPageException.
*/
// throw new SkipPageException();
}
}
- 在tld文件中进行相关约束项的配置:
<?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>JSTL 1.1 XML library</description>
<display-name>JSTL XML</display-name>
<tlib-version>1.1</tlib-version>
<short-name>x</short-name>
<uri>/simplesummer</uri>
<!-- 控制标签体内容的的简单标签的自定义标签 -->
<tag>
<name>BodyController</name>
<tag-class>web.simpletag.BodyController</tag-class>
<body-content>scriptless</body-content>
</tag>
</taglib>
- 第三步:在jsp页面中进行声明然后调用:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@taglib uri="/simplesummer" prefix="summer"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>用SimpleTag接口实现的控制标签体内容是否执行的测试页面</title>
</head>
<body>
<summer:BodyController>Summer</summer:BodyController>
</body>
</html>
- 总结:
- 简单标签可以替代BodyTag接口完成同样的操作,但是有更加的简单和轻便
- 简单标签lifeCycle逻辑清晰,调用规则明确
- 使用相关流对象就可以完成对标签体的操控maniplate
JSP自定义标签之简单标签入门的更多相关文章
- 传智播客JavaWeb day07、day08-自定义标签(传统标签和简单标签)、mvc设计模式、用户注册登录注销
第七天的课程主要是讲了自定义标签.简单介绍了mvc设计模式.然后做了案例 1. 自定义标签 1.1 为什么要有自定义标签 前面所说的EL.JSTL等技术都是为了提高jsp的可读性.可维护性.方便性而取 ...
- JSP自定义tag控件标签
JSP支持自定tag的方法,那就是直接讲JSP代码保存成*.tag或者*.tagx的标签定义文件.tag和tagx文件不仅支持经典jsp代码,各种标签模版代码,还支持xml样式的jsp指令代码. 按照 ...
- JavaWeb学习记录(十九)——jstl自定义标签之简单标签
一.简单标签共定义了5个方法: setJspContext方法 setParent和getParent方法 setJspBody方法 doTag方法 二.方法介绍 osetJspContext方法 用 ...
- JSP标签编程--简单标签
javax.servlet.jsp.tagext里的类SimpleTagSupport 使用SimpleTagSupport类一网打尽以往复杂的标签开发,直接使用doTag()方法 java文件: p ...
- 3_Jsp标签_简单标签_防盗链和转义标签的实现
一概念 1防盗链 在HTTP协议中,有一个表头字段叫referer,采用URL的格式来表示从哪儿链接到当前的网页或文件,通过referer,网站可以检测目标网页访问的来源网页.有了referer跟踪来 ...
- struts2 标签为简单标签
<s:form method="post" action="" theme="simple"> <s:textfield ...
- JSP自定义标签就是如此简单
tags: JSP 为什么要用到简单标签? 上一篇博客中我已经讲解了传统标签,想要开发自定义标签,大多数情况下都要重写doStartTag(),doAfterBody()和doEndTag()方法,并 ...
- JSP自定义标签——简单标签(1)
前面一篇博客介绍了自定义标签的传统标签使用方式,但是我们会发现,使用传统标签非常的麻烦,而且接口还多,现在传统标签基本都没用了,除了一些比较久的框架.Sun公司之后推出了一个新的标签使用方式,称之为简 ...
- JSP第七篇【简单标签、应用、DynamicAttribute接口】
为什么要用到简单标签? 上一篇博客中我已经讲解了传统标签,想要开发自定义标签,大多数情况下都要重写doStartTag(),doAfterBody()和doEndTag()方法,并且还要知道SKIP_ ...
随机推荐
- TensorFlow Serving-TensorFlow 服务
TensorFlow服务是一个用于服务机器学习模型的开源软件库.它处理机器学习的推断方面,在培训和管理他们的生命周期后采取模型,通过高性能,引用计数的查找表为客户端提供版本化访问. 可以同时提供多个模 ...
- 初探nginx
nginx nginx是俄罗斯人写的轻量级http服务器,Nginx 以事件驱动的方式编写,有非常好的性能,同时也是一个非常高效的反向代理.负载均衡. Nginx 稳定性高,模块库丰富,配置灵活,系统 ...
- OVF文件考究
一.什么是OVF文件 开源虚拟化格式OVF(不同于小写的ovf)文件是一种开源的文件规范,它描述了一个开源.安全.有效.可拓展的便携式虚拟打包以及软件分布格式,它一般有几个部分组成,分别是o ...
- mybatis添加记录时返回主键id
参考:mybatis添加记录时返回主键id 场景 有些时候我们在添加记录成功后希望能直接获取到该记录的主键id值,而不需要再执行一次查询操作.在使用mybatis作为ORM组件时,可以很方便地达到这个 ...
- jquery easyui combobox 从指定位置开始模糊查询
$("#bzr").combobox({ url: "ClassSave.aspx?opt=bzr&bzr=<%=arrbj[2]%>", ...
- filter和listener的生命周期
filter(过滤器)和listener(监听器)的生命周期 老实说 生命周期要是说成作用的时间范围我会理解的更好 filter package com.javaweb.filter; import ...
- Java高新技术第一篇:类加载器详解
首先来了解一下字节码和class文件的区别: 我们知道,新建一个Java对象的时候,JVM要将这个对象对应的字节码加载到内存中,这个字节码的原始信息存放在classpath(就是我们新建Java工程的 ...
- 用一个div模拟textarea的实现
<textarea> 标签定义一个多行的文本输入控件.但是它不能像div一样随着内容增加而自动增加,一言不合就出现滚动条,有是有为了更好的交互,可能需要使用div来模拟textarea的实 ...
- Spring Boot 参数校验
1.背景介绍 开发过程中,后台的参数校验是必不可少的,所以经常会看到类似下面这样的代码 这样写并没有什么错,还挺工整的,只是看起来不是很优雅而已. 接下来,用Validation来改写这段 2.Spr ...
- Lintcode392 Is Subsequence solution 题解
[题目描述] Given a string s and a string t, check if s is subsequence of t. You may assume that there is ...