`
jitaguizhao
  • 浏览: 150801 次
  • 性别: Icon_minigender_1
  • 来自: 天津
社区版块
存档分类
最新评论

自定义标签2

    博客分类:
  • java
阅读更多
JSP标签从1.0 开始就已经出现啦,现在JSP都2.0了出现了两个版本,所以我们在用的时候第一是Jar包要注意版本,还有一个要注意版本的地方就是web.xml和.Tld这两个XML文件。 我最开始的时候摸不到头绪,两个配置文件的版本不一致结果导致页面报错找不到标签,还发了个帖子询问,但是大家都误以为是配置的错误,还郁闷了好几天后来再发现这个原因。 1. 配置文件的头信息 Web.Xml 2.0 Test.tld 2.0 SimpleTag 1.0 Web.Xml 1.x <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> Test.tld 1.x <!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.1//EN" "http://java.sun.com/j2ee/dtds/web-jsptaglibrary_1_1.dtd"> 1.0 1.1 html http://jakarta.apache.org/struts/tags-html 头信息的版本匹配很重要,本文就在此举例头信息,以下的XML文件格式大家要注意匹配版本 (以下的例子都是1。X版本) 2如何配置标签 配置标签是写标签中最有挑战性的事情,下面说说应该如何配置。 首先要配置web.xml /aaa /WEB-INF/test.tld 然后是test.tld 1.0 1.1 Application Tag Library /mytag 学习标签 hello com.TestTld empty 向菜头学习 begin true end true TLD的根是taglib元素。表16-2中列出了taglib的子元素: 表16-2 taglib子子元素 元素 说明 tlib-version 标签库的版本 jsp-version 这个标签库要求的JSP规范版本 short-name JSP页面编写工具可以用来创建助记名的可选名字 uri 唯一标识该标签库的的URI display-name 将由工具显示的可选名 small-icon 将由工具使用的可选小图标 large-icon 可被工具使用的可选大图标 description 可选的标签特定信息 listener 见listener元素 tag 见tag元素 在tag元素中的TLD中指定标签。在表16-3中出了tag的子元素: 表16-3 标签子元素 元素 说明 name 唯一标签名 tag-class 标签handler类的完全限定名 tei-class javax.servlet.jsp.tagext.TagExtraInfo的可选子类。见提供有关脚本变量的信息。 body-content 正文内容类型。见body-conten元素和 body-content元素。 display-name 由工具显示的可选名 small-icon 可以由工具使用的小图标 large-icon 可以由工具使用的大图标 description 可选的标签特定的信息 variable 可选的脚本变量信息。见提供有关脚本变量的信息。 attribute 标签属性信息。见Attribute 元素。 下面几节描述开发在标签类型中介绍的每一种类型的标签所需要的方法和TLD。 之后是在页面上加上声明 <%@ taglib uri="/aaa" prefix="mytag"%> 使用起来就变得非常简单了 以上就是标签的整个配置过程。 2. class的编写 标签handler 标签handler是由Web容器调用的一个对象,用于执行带有自定义标签的JSP页面时对这个标签进行判断。标签handler必须实现Tag或者BodyTag接口。接口可以用于接受现有Java对象并使它成为标签handler。对于新创建的处理器,可以用TagSupport和BodyTagSupport类作为基类。这些类和接口包含在javax.servlet.jsp.tagext包中。 JSP页面的servlet在对标签处理的不同阶段调用由Tag和BodyTag接口定义的标签handler。遇到自定义标签的开始标签时,JSP页面的servlet调用方法以初始化相应的handler,然后调用handler的doStartTag方法。遇到自定义标签的结束标签时,调用处理器的doEndTag方法。在标签handler需要与标签的正文交互时调用其他方法,见带正文的标签。为了提供标签handler的实现,必须实现在处理标签的不同阶段调用的方法,在表16-1中汇总了这些方法。 表16-1标签handler方法 标签handler类型 方法 简单 doStartTag, doEndTag, release 属性 doStartTag, doEndTag, set/getAttribute1...N, release 正文、判断且无交互 doStartTag, doEndTag, release 正文、迭代判断 doStartTag, doAfterBody, doEndTag, release 正文、交互 doStartTag, doEndTag, release, doInitBody, doAfterBody, release 标签handler可以使用一个能让它得以与JSP页面通信的API。到API的入口点是页面上下文对象(javax.servlet.jsp.PageContext),通过它标签handler可以获取JSP页面能够访问的所有其他隐式对象(请求、会话和应用程序)。 隐式对象可以有与其相关联的命名属性。可以用[set|get]Attribute方法访问这种属性。 如果标签是嵌入的,标签handler还可以访问与外围标签关联的handler称为parent)。 一组相关的标签handler类(标签库)一般是打包的且作为JAR文档部署。 简单标签的handler必须实现Tag接口的doStartTag和doEndTag方法。在遇到开始标签时调用doStartTag方法。因为简单标签没有正文,所以这个方法返回SKIP_BODY。在遇到结束标签时调用doEndTag方法。如果要对页面的其他部分进行判断,则doEndTag方法需要返回EVAL_PAGE,否则,它就返回SKIP_PAGE。 每当你写的tag在Jsp页面里面要被解释的时候,服务器就自动调用你的类里面的doStartTag()函数来完成你定义的逻辑,当解析完标签后调用doEndTag()。实现Tag接口来定制自己的tag无疑是最灵活的。但是,难度也比较大,我们定义自己的tag的时候完全不必要搞得这么有内涵。 EVAL_BODY_INCLUDE:把Body读入存在的输出流中,doStartTag()函数可用 EVAL_PAGE:继续处理页面,doEndTag()函数可用 SKIP_BODY:忽略对Body的处理,doStartTag()和doAfterBody()函数可用 SKIP_PAGE:忽略对余下页面的处理,doEndTag()函数可用 EVAL_BODY_TAG:已经废止,由EVAL_BODY_BUFFERED取代 EVAL_BODY_BUFFERED:申请缓冲区,由setBodyContent()函数得到的BodyContent对象来处理tag的body,如果类实现了BodyTag,那么doStartTag()可用,否则非法 EVAL_BODY_AGAIN:请求继续处理body,返回自doAfterBody(),这个返回值在你制作循环tag的时候是很有用的。 TagSupport与BodyTagSupport的区别主要是标签处理类是否需要与标签体交互,如果不需要交互的就用TagSupport,否则如果不需要交互就用BodyTagSupport。 交互就是标签处理类是否要读取标签体的内容和改变标签体返回的内容。 用TagSupport实现的标签,都可以用BodyTagSupport来实现,因为BodyTagSupport继承了TagSupport。 2 doStartTag(),doEndTag() doStartTag()方法是遇到标签开始时会呼叫的方法,其合法的返回值是EVAL_BODY_INCLUDE与SKIP_BODY,前者表示将显示标签间的文字,后者表示不显示标签间的文字;doEndTag()方法是在遇到标签结束时呼叫的方法,其合法的返回值是EVAL_PAGE与SKIP_PAGE,前者表示处理完标签后继续执行以下的JSP网页,后者是表示不处理接下来的JSP网页 doAfterBody(),这个方法是在显示完标签间文字之后呼叫的,其返回值有EVAL_BODY_AGAIN与SKIP_BODY,前者会再显示一次标签间的文字,后者则继续执行标签处理的下一步。 预定的处理顺序是:doStartTag()返回SKIP_BODY,doAfterBodyTag()返回SKIP_BODY,doEndTag()返回EVAL_PAGE. 如果继承了TagSupport之后,如果没有改写任何的方法,标签处理的执行顺序是: doStartTag() ->不显示文字 ->doEndTag()->执行接下来的网页 如果您改写了doStartTag(),则必须指定返回值,如果指定了EVAL_BODY_INCLUDE,则执行顺序是 doStartTag()->显示文字->doAfterBodyTag()->doEndTag()->执行下面的网页 下面来看一段程序: package com; import java.io.*; import java.util.Properties; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class TestTld extends TagSupport ...{ private String begin = null; //参数 private String end = null; //参数 public TestTld() ...{} //构造 public String getBegin() ...{return begin;} public void setBegin(String begin) ...{this.begin = begin;} public String getEnd()...{return end;} public void setEnd(String end)...{this.end = end;} public int doStartTag() throws JspTagException...{//这个方法不用所以直接返回值 return EVAL_BODY_INCLUDE; } public int doEndTag() throws JspException ...{//重点在这个方法上 JspWriter out = pageContext.getOut(); //重要 String sum = begin +""+ end; System.out.print(sum); // pageContext.setAttribute("sum", sum); //返回一个值 try ...{ out.println("beginend= "+sum);//标签的返回值 } catch (IOException e) ...{ e.printStackTrace(); } return SKIP_BODY; } public void release() ...{ super.release(); } } 下面看一下显示的效果: beginend=aabd //------------------------------------------------------------------ <%=sum%> beginend=aabd aabd 3.最后说一下2.0的新方法 SimpleTagSupport类别顾名思义,就是可以处理一些简单的自订标签需求,它是在JSP 2.0之后新增的类别,对于一些简单的自订标签页求,您可以继承它来实作标签处理类别,而不用为了处理一些TagSupport、 BodyTagSuppourt类别中回传值的问题。 为了使用上的简单而降低了复杂性,另一方面就是SimpleTagSupport类别所处理的功能受了些限制,它只处理标签与本体,要不要显示本体文字取决于您,对于标签之后的页面则不在SimpleTagSupport处理的范围之内(虽然您还是可以使用forward之类的方式来决定要不要显示之后的页面,但直接实作TagSupport会更方便一些),另外SimpleTagSupport类别的本体文字不能设定为JSP,这也是使用 SimpleTagSupport上的一些限制。 下面说一下例子: package demo.tags; import java.io.*; import javax.servlet.jsp.*; import javax.servlet.jsp.tagext.*; public class SimpleTagFrag extends SimpleTagSupport ...{ private JspFragment _frag1; private JspFragment _frag2; public void setFragment1(JspFragment frag1) ...{ _frag1 = frag1; } public void setFragment2(JspFragment frag2) ...{ _frag2 = frag2; } public void doTag() throws JspException, IOException ...{ _frag2.invoke(null); _frag1.invoke(null); } } 传过来的值都变成了JspFragment类的,看到了么就是这么简单,只实现一个doTag就行了,配置是一样的。输出的时候只要调用.invoke()方法就完成啦,很简单吧
分享到:
评论

相关推荐

    mybatis自定义标签.zip

    2. **注册标签处理类**:在MyBatis的配置文件(mybatis-config.xml)中,我们需要将自定义标签处理类添加到`typeAliases`中,并声明对应的标签名称。这样MyBatis在解析XML时就能识别我们的自定义标签。 ```xml .....

    struts2 自定义标签

    在Struts2中,自定义标签是提高代码可读性和可维护性的重要工具。本文将深入探讨Struts2自定义标签的实现机制、优点以及如何在实际项目中进行应用。 一、Struts2自定义标签的概念 自定义标签是JSP的一种扩展,允许...

    tp自定义标签

    2. **创建自定义标签** 在ThinkPHP 3.0中,自定义标签通常在`TagLib`类库下创建。首先,你需要在`ThinkPHP/Lib/TagLib`目录下创建一个新的PHP文件,例如`XyTagLib.php`,然后在这个文件中定义一个继承自`Think\...

    jsp 自定义标签实例

    2. **实现标签处理类**:创建一个Java类来实现自定义标签的行为。这个类需要继承`javax.servlet.jsp.tagext.TagSupport`或实现`javax.servlet.jsp.tagext.Tag`接口。在`doStartTag()`和`doEndTag()`方法中编写处理...

    freemarker 自定义freeMarker标签

    3. 使用自定义标签:在模板文件中,你可以像使用内置标签一样使用你的自定义标签。例如,如果你注册了一个名为`myCustomTag`的自定义指令,你可以在模板中这样使用:`&lt;@myCustomTag param1="value1" param2="value2...

    spring自定义标签例子

    在"spring自定义标签例子"这个项目中,我们可以深入理解这一特性,特别是通过Chapter2工程的实例来学习。 Spring框架的自定义标签通常用于简化XML配置,提升可读性和可维护性。这些标签是基于Java的`org.spring...

    jsp2.0 自定义标签和自定标签函数

    2. **使用自定义标签** 在JSP页面中,通过`指令`引入自定义标签库,并使用`属性...&lt;/tag-name&gt;`的格式调用自定义标签。 **二、自定义标签函数** 自定义标签函数是在JSP 2.0中引入的一种新的特性,它允许开发者像...

    struts实现自定义标签

    在 Struts 中,自定义标签是提供一种灵活的方式,使得视图层(通常为 JSP 页面)能够更好地与业务逻辑交互,从而提高代码的可读性和可维护性。本文将深入探讨如何在 Struts 中实现自定义标签。 一、自定义标签概述 ...

    Struts2自定义标签

    自定义标签是Struts2框架中的一个重要特性,它允许开发者创建自己的标签库,以更直观、易读的方式在JSP页面中处理业务逻辑。下面将详细介绍Struts2自定义标签的相关知识点。 首先,理解自定义标签的作用。在传统的...

    jsp 自定义标签的使用

    2. **实现标签处理类(Tag Handler)**:每个自定义标签对应一个Java类,该类需要实现`javax.servlet.jsp.tagext.Tag`或其子接口,如`SimpleTag`。在这个类中,我们可以编写处理标签逻辑的代码。 3. **在JSP页面中...

    java自定义标签.......java自定义标签

    2. **标签处理类(Tag Handler Class)**:每个自定义标签对应一个Java类,这个类实现了`javax.servlet.jsp.tagext.Tag`接口或其子接口,负责处理标签的生命周期方法,如`doStartTag()`、`doEndTag()`等。...

    JSP自定义标签学习笔记

    在JSP(JavaServer Pages)开发中,自定义标签是一种扩展JSP功能的强大工具,它允许开发者创建可重用的代码组件,以提高代码的可读性和可维护性。本篇学习笔记将深入探讨JSP自定义标签的相关概念、创建方法以及实际...

    freemark 自定义标签 总结

    2. **创建自定义标签** 创建自定义标签需要两个主要部分:Java类实现和模板定义。Java类通常继承`freemarker.template.TemplateDirectiveModel`接口,并重写`execute`方法。模板定义则是在`.ftl`文件中使用`...

    一个用于分页的自定义标签

    一个“自定义标签”是开发者为了扩展JSP(JavaServer Pages)功能而创建的,它允许我们封装复杂逻辑并将其作为可重用的组件。本项目提供了一个用于分页的自定义标签,适用于那些需要在网页上进行数据分页展示的应用...

    Freemarker 自定义标签 简单案例

    2. **注册自定义标签**:在应用启动时,你需要将这个Java类注册到Freemarker的配置中,这样Freemarker在解析模板时就能识别并执行自定义标签。 例如,假设我们有一个名为`&lt;@myTag&gt;`的自定义标签,它接受一个参数`...

    html自定义标签的使用

    2. **浏览器兼容性**:虽然HTML5的大部分现代浏览器都支持自定义标签,但老版本的IE(尤其是IE9及以下)可能不支持。为确保跨浏览器兼容,可以使用JavaScript库如polyfill或使用Web Components技术(如Shadow DOM、...

    用js实现自定义标签

    2. **定义标签映射**:创建一个数组`mk`来存储自定义标签与对应的HTML标签样式。每个自定义标签与其对应的开始标签和结束标签一一对应。 3. **定义转换逻辑**: - 获取`body`元素的内联HTML内容。 - 遍历自定义...

    用户自定义标签.

    JSP自定义标签是用户定义的JSP语言元素,可以看成是一种通过标签处理器生成基于XML脚本的方法。自定义标签在功能上和逻辑上都与JavaBean类似,都是一组可重用的组件代码。相较于JavaBean,自定义标签可以使Web开发者...

    自定义标签,标签实例,ppt

    2. 分离视图和逻辑:自定义标签有助于实现MVC架构,使得JSP页面更加专注于视图展示,而将业务逻辑移至标签处理器中。 3. 提升代码可读性:自定义标签的使用方式类似HTML,使得JSP页面更容易理解和维护。 综上所述,...

    java分页标签自定义分页标签自定义分页标签

    自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签自定义分页标签...

Global site tag (gtag.js) - Google Analytics