JSP设计--第7章

 在JSP页面中自定义标签 :

实际上,自定义标签的处理类实现了Tag Handler对象。JSP技术javax.servlet.jsp.tagext中提供了多个Tag Handler接口,JSP1.2中定义了Tag、BodyTag、IterationTag接口,在JSP2.0中新增了SimpleTag接口。JSP还提供了上述接口的实现类TagSupport、BodyTagSupport和SimpleTagSupport(SimpleTagSupport只在JSP2.0中才有)。BodyTagSupport实现了BodyTag、Tag和IterationTag接口。

 

接口及其方法

Tag接口

方法

SimpleTag

dotag

Tag

doStartTag,doEndTag,release

IterationTag

doStartTag,doAfterTag,release

BodyTag

doStartTag,doEndTag,release,doInitBody,doAfterBody

jsp自定义标签的定义步骤:

创建标记处理器
创建TLD文件
编辑web.xml(如果是jar放在lib文件夹中就不需要编写web.xml)
在JSP页面中使用此标签

另外还有修改一下classpath,因为创建标记处理器(java类)需要用到jsp-api.jar,这个文件在tomcat中,把它加入到classpath后才能运行.
为了使到JSP容器能够使用标签库中的自定义行为,必须满足以下两个条件:

1.从一个指定的标签库中识别出代表这种自定义行为的标签

2.找到实现这些自定义行为的具体类

第一个必需条件-找出一个自定义行为属于那个标签库-是由标签指令的前缀(Taglib Directive's Prefix)属性完成,所以在同一个页面中使用相同前缀的元素都属于这个标签库。每个标签库都定义了一个默认的前缀,用在标签库的文档中或者页面中插入自定义标签。所以,你可以使用除了诸如jsp,jspx,java,servlet,sun,sunw(它们都是在JSP白皮书中指定的保留字)之类的前缀。  

uri属性满足了以上的第二个要求。为每个自定义行为找到对应的类。这个uri包含了一个字符串,容器用它来定位TLD文件。在TLD文件中可以找到标签库中所有标签处理类的名称

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

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

public int doStartTag() throws JspException

public int doEndTag() throws JspException

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

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

A.Tag.SKIP_BODY:表示 … 之间的内容被忽略

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

3.doEndTag:但JSP容器遇到自定义标签的结束标志,就会调用doEndTag()方法。doEndTag()方法也返回一个整数值,用来决定程序后续流程。

A.Tag.SKIP_PAGE:表示立刻停止执行网页,网页上未处理的静态内容和JSP程序均被忽略任何已有的输出内容立刻返回到客户的浏览器上。

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

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

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

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

 

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

A.name: 设定Tag的名字

B.tagclass: 设定Tag的处理类

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

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

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

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

 

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

A.name:属性名称

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

C.rtexprvalue:属性值是否可以为request-time表达式,也就是类似于的表达式
 
开始实验
编写JSP
< !—hello.jsp的源码 -- >
<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/helloworld" prefix="mytag" %>
<html>
<head>
<title>
jsp1
</title>
</head>
<body bgcolor="#ffffc0">
<h1>
下面显示的是自定义标签中的内容
</h1>
<br><br>

<mytag:helloworld></mytag:helloworld>
<br>
</body>
</html>
 
编写web.xml
 
<?xml version="1.0" encoding="UTF-8"?>
<!-- edited with XMLSPY v5 rel. 4 U (
http://www.xmlspy.com) by Williams (501) -->
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"
http://java.sun.com/dtd/web-app_2_3.dtd">
<web-app>
<taglib>
        <taglib-uri>/helloworld</taglib-uri>
        <taglib-location>/WEB-INF/helloworld.tld</taglib-location>
</taglib>
</web-app>
 编写tld文件

<?xml version="1.0" encoding="ISO-8859-1"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
   "
http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd"></P< p>
<taglib>
   <tlib-version>1.0</tlib-version>
   <jsp-version>1.2</jsp-version>
   <short-name>mytag</short-name>
   <tag>
       <name>helloworld</name>
       <tag-class>mytag.HelloWorldTag</tag-class>
       <body-content>empty</body-content>
   </tag>
</taglib>
编写标签实现类

注意:JSP容器在调用doStartTag或者doEndTag方法前,会先调用setPageContext和setParent方法,设置pageContext和parent。因此在标签处理类中可以直接访问pageContext变量 .在TagSupport的构造方法中不能访问pageContext成员变量,因为此时JSP容器还没有调用setPageContext方法对pageContext进行初始化

package mytag;   
import java.io.IOException;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
public class HelloWorldTag extends TagSupport {    
  public HelloWorldTag() {
  }
  public int doStartTag() throws JspTagException{
    return EVAL_BODY_INCLUDE;
  }
  public int doEndTag() throws JspTagException{
    try {
      pageContext.getOut().write("Hello World");
    }
    catch (IOException ex) {
      throw new JspTagException("错误");
    }
    return EVAL_PAGE;
  }
}
JSP中的隐含对象都是通过pageContext的方法得到的

写入servlet输出流中:
JspWriter out=pageContext.getOut();//TagSupport类中定义了protected类型的pageContext成员变量

out.println(bodyContent.getString());

pageContext----代表了Web应用中的javax.servlet.jsp.PageContext对象

request表示HttpServletRequest对象

out 对象是javax.jsp.JspWriter的一个实例,并提供了几个方法使你能用于向浏览器回送输出结果。

pageContext对象(JSP中的隐藏对象 )

  pageContext对象相当于当前页面的容器,可以访问当前页面的所有对象。
  pageContext对象的基类是:
javax.servlet.jsp.PageContext类。
  pageContext对象的常用方法:
  HttpSession getSession() 取得当前页面的session对象。
  ServletRequest getRequest() 取得当前页面的request对象。
  ServletResponse getResponse() 取得当前页面的response对象。
  ServletContext getServletContext() 取得当前页面的application对象。
  ServletConfig getServletConfig() 取得当前页面的config对象。
  Object getPage() 取得当前页面的page对象。
  JspWriter getOut() 取得当前页面的out对象。
  Exception getException() 取得当前页面的exception对象。
  void setAttribute(String variabelName, Object objectName)
  将对象objectName保存到pageContext中。
  Object getAttribute(String variableName)

package com.ora.jsp.tags.xmp;

import java.io.*;
import javax.servlet.jsp.*;
import javax.servlet.jsp.tagext.*;
import com.ora.jsp.beans.motd.*;
public class MixedMessageTag extends SimpleTagSupport {
    private MixedMessageBean mmb = new MixedMessageBean();

    // Attributes
    private String categoryaa;

    public void setCategory(String category) {
        this.categoryaa = category;
    }

    public void doTag() throws IOException {
        mmb.setCategory(categoryaa);
 JspWriter out = getJspContext().getOut();
 out.println(mmb.getMessage());
    }
}

SimpleTagSupport中实现了getJspContext()这个方法,这个方法可以获取指向jsp页面的输出流(返回jspcontext)

getOut是jspcontext中的方法



书上的例子如下:它是先把category传入MixedMessageTag 的setCategory函数。然后再doTag方法传入MixedMessageBean 的setCategory函数
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值