jsp自定义标签学习笔记

一、新建class,用以处理tag对应的功能。该类需要继承TagSupport类。

TagSupport类简介:

1.处理标签的类必须扩展javax.servlet.jsp.TagSupport.

2.TagSupport类的主要属性:

A.parent属性:代表嵌套了当前标签的上层标签的处理类

B.pageContex属性:代表Web应用中的javax.servlet.jsp.PageContext对象

3.JSP容器在调用doStartTag或者doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent。因此在标签处理类

中可以直接访问pageContext变量
4.在TagSupport的构造方法中不能访问pageContext成员变量,因为此时JSP容器还没有调用

setPageContext方法对pageContext进行初始化

 

 

TagSupport处理标签的方法:


1.TagSupport类提供了两个处理标签的方法:

public int doStartTag() throws JspException

public int doEndTag() throws JspException


2.doStartTag:但JSP容器遇到自定义标签的起始标志,就会调用doStartTag()方法。

doStartTag()方法返回一个整数值,用来决定程序的后续流程。一般重写该方法就行了。

A.Tag.SKIP_BODY:表示prefix:someTag…/prefix:someTag之间的内容被忽略不会显示在页面,TagSupport中就是返回该值

B.Tag.EVAL_BODY_INCLUDE:表示标签之间的内容被正常执行

3.doEndTag:但JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag

()方法也返回一个整数值,用来决定程序后续流程。

A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被

忽。略任何已有的输出内容立刻返回到客户的浏览器上。

B.Tag_EVAL_PAGE:表示按照正常的流程继续执行JSP网页

 

如:

public class MyTag extends TagSupport {

 private String src;
 
 public void setSrc(String src) {
  this.src = src;
 }

 @Override
 public int doStartTag() throws JspException {
  
  try {
   this.pageContext.getOut().print(src.trim());     //将值输出到页面中
  } catch (IOException e) {
   e.printStackTrace();
  }
  return EVAL_BODY_INCLUDE;
 }

}

 

二、创建标签库描述文件(Tag Library Descriptor):

1.标签库描述文件,简称TLD,采用XML文件格式,定义了用户的标签库。TLD文件中的元素可以分成3类:

A.taglib:标签库元素

B.tag:标签元素

C.attribute:标签属性元素

2.标签库元素taglib用来设定标签库的相关信息,它的常用属性有:

A.shortname: 指定Tag Library默认的前缀名(prefix)

B.uri: 设定Tag Library的惟一访问表示符

3.标签元素用来定义一个标签,它的常见属性有:

A.name:设定Tag的名字

B.tagclass:设定Tag的处理类

C.bodycontent:设定标签的主体(body)内容

1).empty:表示标签中没有body

2).JSP:表示标签的body中可以加入JSP程序代码

3).tagdependent:表示标签中的内容由标签自己去处理

4.标签属性元素attribute用来定义标签的属性,它的常见属性有:

A.name:属性名称

B.required:属性是否必需的,默认为false

C.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于的表达式  

 

如下,我设置的路径为/WEB-INF/tld/mytag.tld:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
                        "http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
 <tlib-version>1.0</tlib-version>
 <jsp-version>1.2</jsp-version>
 <short-name>mytag</short-name>
 
 <tag>
  <name>trim</name>
  <tag-class>taglib.MyTag</tag-class>
  <body-content>JSP</body-content>   
  <attribute>
   <name>src</name>
   <required>true</required>
   <rtexprvalue>false</rtexprvalue>
   <type>String</type>
  </attribute>
 </tag>
</taglib>

 

注意:如果<body-content>元素body为empty,则页面中标签元素中不能有body文本,否则会出现如下异常:

org.apache.jasper.JasperException: /index.jsp(52,8) According to TLD, tag mytag:trim must be empty, but is not

另如果它不为empty,要输出页面中的body内容,在类doStartTag() 方法中必须返回Tag.EVAL_BODY_INCLUDE,

dodoEndTag() 为Tag_EVAL_PAGE

 

 

三、配置web.xml

因为自定义的标签,最好在web.xml中配置下

如:

<jsp-config>
  <taglib>
   <taglib-uri>/mytag</taglib-uri>
   <taglib-location>/WEB-INF/tld/mytag.tld</taglib-location>
  </taglib>
 </jsp-config>

 

taglib-uri:设定Tag Library的惟一标示符,在Web应用中将根据它来引用Tag Libray

taglib-location:指定和Tag Library对应的TLD文件的位置

 

四、页面使用自定义标签

1.加入% @ taglib% 指令来声明对标签库的引用。

       <%@ taglib prefix="mytag" uri="/WEB-INF/tld/mytag.tld"%>

prefix表示在JSP网页中引用这个标签库的标签时的前缀,uri用来指定Tag Library的标识符,它必须和web.xml中的taglib-uri属性保持一致

2.使用标签

desc:<mytag:trim src=" trim ">sadf</mytag:trim>

 

页面将输出desc:trimsadf  

若toStartTag()方法返回Tag.SKIP_BODY,则sadf不会打印

 

 

 

 

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值