JavaWeb学习心得之自定义简单标签(一)
2017-10-28 16:47
393 查看
一、简单标签简介
含义:实现SimpleTag接口的标签称为简单标签。
方法:
setJspContext:用于把JSP页面的pageContext对象传递给标签处理器对象
setParent:用于把父标签处理器对象传递给当前标签处理器对象
getParent:用于获取当前标签的父标签对象
setJspBody:用于把标签体的JspFragment对象传递给标签处理器对象
doTag:用于完成所有标签逻辑,包括输出、迭代、修改标签体内容等
方法执行顺序:
调用setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器
调用setParent方法,将父标签传递给当前标签处理器对象,只有父标签存在时,才会调用该方法
调用setJspBody方法:把标签体JspFragment对象传进来
调用doTag方法,通过对JspFragment对象的操作,实现页面逻辑
二、简单标签页面逻辑
1.控制部分内容是否执行
SimpleTag
tld文件
jsp文件
2.控制JSP页面内容重复执行
SimpleTag类
tld文件
jsp文件
3.修改JSP页面输出
SimpleTag类
tld文件
jsp文件
4.控制JSP页面是否执行
SimpleTag类
tld文件
jsp文件
含义:实现SimpleTag接口的标签称为简单标签。
方法:
setJspContext:用于把JSP页面的pageContext对象传递给标签处理器对象
setParent:用于把父标签处理器对象传递给当前标签处理器对象
getParent:用于获取当前标签的父标签对象
setJspBody:用于把标签体的JspFragment对象传递给标签处理器对象
doTag:用于完成所有标签逻辑,包括输出、迭代、修改标签体内容等
方法执行顺序:
调用setJspContext方法,将代表JSP页面的pageContext对象传递给标签处理器
调用setParent方法,将父标签传递给当前标签处理器对象,只有父标签存在时,才会调用该方法
调用setJspBody方法:把标签体JspFragment对象传进来
调用doTag方法,通过对JspFragment对象的操作,实现页面逻辑
二、简单标签页面逻辑
1.控制部分内容是否执行
SimpleTag
import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport; /** * SimpleTagSupport类实现了SimpleTag接口 * SampleTagDemo01类继承SimpleTagSupport * @author hanxin * */ public class SimpleTagDemo01 extends SimpleTagSupport{ /* * 简单标签使用这个方法就可以完成所有的业务逻辑 * 重写doTag方法,控制标签体是否执行 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag() */ @Override public void doTag() throws JspException, IOException { //得到代表jsp标签体的JspFragment JspFragment jspFragment = this.getJspBody(); //得到jsp页面的的PageContext对象 //PageContext pageContext = (PageContext)jspFragment.getJspContext(); //调用JspWriter将标签体的内容输出到浏览器 //jspFragment.invoke(pageContext.getOut()); //调用invoke方法,表示输出内容,否则将不输出方法体内容 jspFragment.invoke(null); } }
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用来添加对taglib(标签库)的描述 --> <description>简单标签库</description> <!--taglib(标签库)的版本号 --> <tlib-version>1.0</tlib-version> <short-name>SimpleTagLib</short-name> <!-- 为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写 , 在Jsp页面中引用标签库时,需要通过uri找到标签库 在Jsp页面中就要这样引入标签库:<%@taglib uri="/mySimpleTagLib" prefix="m"%> --> <uri>/mySimpleTagLib</uri> <!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述 --> <!-- 一个tag标记对应一个自定义标签 --> <tag> <description>SimpleTagDemo01</description> <name>SimpleTagDemo01</name> <!-- 标签对应的处理器类--> <tag-class>com.hanxin.SimpleTagDemo01</tag-class> <!-- tld文件中有四种标签体类型 :empty JSP scriptless tagdepentend 在简单标签(SampleTag)中标签体body-content的值只允许是empty和scriptless,不允许设置成JSP,如果设置成JSP就会出现异常 在传统标签中标签体body-content的值只允许是empty和JSP 如果标签体body-content的值设置成tagdepentend,那么就表示标签体里面的内容是给标签处理器类使用的, 例如:开发一个查询用户的sql标签,此时标签体重的SQL语句就是给SQL标签的标签处理器来使用的 <gacl:sql>SELECT * FROM USER</gacl:sql> 在这种情况下,sql标签的<body-content>就要设置成tagdepentend,tagdepentend用得比较少,了解一下即可 --> <body-content>scriptless</body-content> </tag> </taglib>
jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="/mySimpleTagLib" prefix="m"%> <!DOCTYPE html> <html lang="en"> <!-- Mirrored from www.zi-han.net/theme/hplus/login_v2.html by HTTrack Website Copier/3.x [XR&CO'2014], Wed, 20 Jan 2016 14:19:49 GMT --> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"> <title>控制jsp页面某一部分内容是否执行</title> </head> <body> <m:SimpleTagDemo01>控制jsp页面某一部分内容是否执行</m:SimpleTagDemo01> </body> </html>
2.控制JSP页面内容重复执行
SimpleTag类
import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport; /** * SimpleTagSupport类实现了SimpleTag接口 * SampleTagDemo02类继承SimpleTagSupport * @author hanxin * */ public class SimpleTagDemo02 extends SimpleTagSupport{ /* * 简单标签使用这个方法就可以完成所有的业务逻辑 * 重写doTag方法,控制标签体是否执行 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag() */ @Override public void doTag() throws JspException, IOException { JspFragment jspFragment = this.getJspBody(); /* * 重复执行,只需要重复调用invoke方法 */ for(int i=0;i<10;i++){ jspFragment.invoke(null); } } }
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用来添加对taglib(标签库)的描述 --> <description>简单标签库</description> <!--taglib(标签库)的版本号 --> <tlib-version>1.0</tlib-version> <short-name>SimpleTagLib</short-name> <!-- 为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写 , 在Jsp页面中引用标签库时,需要通过uri找到标签库 在Jsp页面中就要这样引入标签库:<%@taglib uri="/mySimpleTagLib" prefix="m"%> --> <uri>/mySimpleTagLib</uri> <!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述 --> <!-- 一个tag标记对应一个自定义标签 --> <tag> <description>SimpleTagDemo02</description> <name>SimpleTagDemo02</name> <!-- 标签对应的处理器类--> <tag-class>com.hanxin.SimpleTagDemo02</tag-class> <!-- tld文件中有四种标签体类型 :empty JSP scriptles cdaa s tagdepentend 在简单标签(SampleTag)中标签体body-content的值只允许是empty和scriptless,不允许设置成JSP,如果设置成JSP就会出现异常 在传统标签中标签体body-content的值只允许是empty和JSP 如果标签体body-content的值设置成tagdepentend,那么就表示标签体里面的内容是给标签处理器类使用的, 例如:开发一个查询用户的sql标签,此时标签体重的SQL语句就是给SQL标签的标签处理器来使用的 <gacl:sql>SELECT * FROM USER</gacl:sql> 在这种情况下,sql标签的<body-content>就要设置成tagdepentend,tagdepentend用得比较少,了解一下即可 --> <body-content>scriptless</body-content> </tag> </taglib>
jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="/mySimpleTagLib" prefix="m"%> <!DOCTYPE html> <html lang="en"> <!-- Mirrored from www.zi-han.net/theme/hplus/login_v2.html by HTTrack Website Copier/3.x [XR&CO'2014], Wed, 20 Jan 2016 14:19:49 GMT --> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"> <title>用简单标签控制标签体执行</title> </head> <body> <m:SimpleTagDemo02>用简单标签控制标签体执行<br></m:SimpleTagDemo02> </body> </html>
3.修改JSP页面输出
SimpleTag类
import java.io.IOException; import java.io.StringWriter; import javax.servlet.jsp.JspException; import javax.servlet.jsp.PageContext; import javax.servlet.jsp.tagext.JspFragment; import javax.servlet.jsp.tagext.SimpleTagSupport; /** * SimpleTagSupport类实现了SimpleTag接口 * SampleTagDemo03类继承SimpleTagSupport * @author hanxin * */ public class SimpleTagDemo03 extends SimpleTagSupport{ /* * 简单标签使用这个方法就可以完成所有的业务逻辑 * 重写doTag方法 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag() */ @Override public void doTag() throws JspException, IOException { JspFragment jspFragment = this.getJspBody(); StringWriter sw = new StringWriter(); //将标签体的内容写入到sw流中 jspFragment.invoke(sw); //获取sw流缓冲区的内容 String content = sw.getBuffer().toString(); content = content.toUpperCase(); PageContext pageContext = (PageContext)jspFragment.getJspContext(); //将修改后的content输出到浏览器中 pageContext.getOut().write(content); } }
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用来添加对taglib(标签库)的描述 --> <description>简单标签库</description> <!--taglib(标签库)的版本号 --> <tlib-version>1.0</tlib-version> <short-name>SimpleTagLib</short-name> <!-- 为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写 , 在Jsp页面中引用标签库时,需要通过uri找到标签库 在Jsp页面中就要这样引入标签库:<%@taglib uri="/mySimpleTagLib" prefix="m"%> --> <uri>/mySimpleTagLib</uri> <!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述 --> <!-- 一个tag标记对应一个自定义标签 --> <tag> <description>SimpleTagDemo03</description> <name>SimpleTagDemo03</name> <!-- 标签对应的处理器类--> <tag-class>com.hanxin.SimpleTagDemo03</tag-class> <!-- tld文件中有四种标签体类型 :empty JSP scriptless tagdepentend 在简单标签(SampleTag)中标签体body-content的值只允许是empty和scriptless,不允许设置成JSP,如果设置成JSP就会出现异常 在传统标签中标签体body-content的值只允许是empty和JSP 如果标签体body-content的值设置成tagdepentend,那么就表示标签体里面的内容是给标签处理器类使用的, 例如:开发一个查询用户的sql标签,此时标签体重的SQL语句就是给SQL标签的标签处理器来使用的 <gacl:sql>SELECT * FROM USER</gacl:sql> 在这种情况下,sql标签的<body-content>就要设置成tagdepentend,tagdepentend用得比较少,了解一下即可 --> <body-content>scriptless</body-content> </tag> </taglib>
jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="/mySimpleTagLib" prefix="m"%> <!DOCTYPE html> <html lang="en"> <!-- Mirrored from www.zi-han.net/theme/hplus/login_v2.html by HTTrack Website Copier/3.x [XR&CO'2014], Wed, 20 Jan 2016 14:19:49 GMT --> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"> <title>修改jsp页面内容输出</title> </head> <body> <m:SimpleTagDemo03>thing in java</m:SimpleTagDemo03> </body> </html>
4.控制JSP页面是否执行
SimpleTag类
import java.io.IOException; import javax.servlet.jsp.JspException; import javax.servlet.jsp.SkipPageException; import javax.servlet.jsp.tagext.SimpleTagSupport; /** * SimpleTagSupport类实现了SimpleTag接口 * SampleTagDemo04类继承SimpleTagSupport * @author hanxin * */ public class SimpleTagDemo04 extends SimpleTagSupport{ /* * 简单标签使用这个方法就可以完成所有的业务逻辑 * 重写doTag方法 * @see javax.servlet.jsp.tagext.SimpleTagSupport#doTag() */ @Override public void doTag() throws JspException, IOException { 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用来添加对taglib(标签库)的描述 --> <description>简单标签库</description> <!--taglib(标签库)的版本号 --> <tlib-version>1.0</tlib-version> <short-name>SimpleTagLib</short-name> <!-- 为自定义标签库设置一个uri,uri以/开头,/后面的内容随便写 , 在Jsp页面中引用标签库时,需要通过uri找到标签库 在Jsp页面中就要这样引入标签库:<%@taglib uri="/mySimpleTagLib" prefix="m"%> --> <uri>/mySimpleTagLib</uri> <!--一个taglib(标签库)中包含多个自定义标签,每一个自定义标签使用一个tag标记来描述 --> <!-- 一个tag标记对应一个自定义标签 --> <tag> <description>SimpleTagDemo04</description> <name>SimpleTagDemo04</name> <!-- 标签对应的处理器类--> <tag-class>com.hanxin.SimpleTagDemo04</tag-class> <!-- tld文件中有四种标签体类型 :empty JSP scriptless tagdepentend 在简单标签(SampleTag)中标签体body-content的值只允许是empty和scriptless,不允许设置成JSP,如果设置成JSP就会出现异常 在传统标签中标签体body-content的值只允许是empty和JSP 如果标签体body-content的值设置成tagdepentend,那么就表示标签体里面的内容是给标签处理器类使用的, 例如:开发一个查询用户的sql标签,此时标签体重的SQL语句就是给SQL标签的标签处理器来使用的 <gacl:sql>SELECT * FROM USER</gacl:sql> 在这种情况下,sql标签的<body-content>就要设置成tagdepentend,tagdepentend用得比较少,了解一下即可 --> <body-content>empty</body-content> </tag> </taglib>
jsp文件
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@taglib uri="/mySimpleTagLib" prefix="m"%> <!DOCTYPE html> <html lang="en"> <!-- Mirrored from www.zi-han.net/theme/hplus/login_v2.html by HTTrack Website Copier/3.x [XR&CO'2014], Wed, 20 Jan 2016 14:19:49 GMT --> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0"> <title>控制JSP是否继续向下执行</title> </head> <body> <p>开始</p> <m:SimpleTagDemo04/> <p>结束</p> </body> </html>
相关文章推荐
- JavaWeb学习心得之自定义简单标签(二)
- JavaWeb学习记录(十九)——jstl自定义标签之简单标签
- JavaWeb学习心得之JSP自定义标签
- JavaWeb学习心得之JSP标签库打包
- Thymeleaf 3.0 自定义标签方言属性,简单实例。快速学习!
- Javaweb学习笔记6—EL表达式与JSTL及自定义标签
- [原创]java WEB学习笔记40:简单标签概述(背景,使用一个标签,标签库的API,SimpleTag接口,创建一个自定义的标签的步骤 和简单实践)
- JavaWeb学习心得之JSP标签
- [原创]java WEB学习笔记41:简单标签之带属性的自定义标签(输出指定文件,计算并输出两个数的最大值 demo)
- SpringBoot使用Thymeleaf3.0自定义标签,简单实例。快速学习!
- 传智播客JavaWeb day07、day08-自定义标签(传统标签和简单标签)、mvc设计模式、用户注册登录注销
- JAVA_WEB之 Jsp简单的自定义标签
- JavaWeb学习心得之Servlet(一)
- JSP中使用简单标签自定义标签
- 学习Java简单心得
- treeview 学习心得(一) 简单示例
- 我的MYSQL学习心得(一) 简单语法
- 微软企业库5.0 学习之路——第七步、Cryptographer加密模块简单分析、自定义加密接口及使用—上篇
- android学习15#--简单自定义跑马灯textView控件
- JSP 自定义标签:简单标签