`

JSP tag 学习

    博客分类:
  • JSP
阅读更多

JSP2.0 中,对于自定义的标签有两种实现方法,实现接口或者继承现有的类

如下图,标注蓝色的是接口,其它是标签类(SimpleTagSupport只在JSP2.0中才有)

   

在以上接口和类中,定义了一些静态常量,如下:

Tag 中定义:

SKIP_BODY = 0;          // 不处理标签体,直接调用doEndTag()方法

EVAL_BODY_INCLUDE = 1;   // 解析标签体,但绕过 doInitBody () setBodyContent () 方法

SKIP_PAGE = 5;          // 不解析标签后面的JSP内容

EVAL_PAGE = 6;          // 解析标签后,继续解析标签后面的JSP内容

 

IterationTag 中定义:

EVAL_BODY_AGAIN = 2;

 

BodyTag 中定义:

EVAL_BODY_TAG = 2;          // deprecated

EVAL_BODY_BUFFERED = 2;    //

 

特别的,对于EVAL_BODY_AGAINEVAL_BODY_BUFFERED

doAferBody中返回SKIP_BODY,表示终止标记正文处理;若返回的是 EVAL_BODY_BUFFERED ,将会再一次调用doAferBody方法,重新处理标记正文,直到返回SKIP_BODY为止。  //

 

TagSupport 默认doStartTag()/doAfterBody()返回SKIP_BODY

BodyTagSupport 默认doStartTag()返回EVAL_BODY_BUFFERED / doInitBody()什么也不做 /doAfterBody()返回SKIP_BODY

下面是自定义tag的执行过程(由上至下),对于以上各常量的实际运用为:

注意其中的 doInitBody/setBodyContent 方法在自定义标签实现了 BodyTag 接口或继承BodyTagSupport才可以使用

Tag 方法

可返回的静态常量

doStartTag

SKIP_BODY EVAL_BODY_INCLUDE

EVAL_BODY_AGAIN/EVAL_BODY_BUFFERED

doInitBody

做标签一些初始化工作,无返回值

setBodyContent

doInitBody 之后执行,使用setBodyContent得到JSP页面中标签体之间内容

doAfterBody

最终必须返回SKIP_BODY ,否则可能导致OutOfMemoryError,可参考上面

doEndTag

SKIP_PAGE/EVAL_PAGE

 

示例代码如下:

public int doAfterBody() throws JspException {

  try {

   this.pageContext.getOut().write("<br>");

  } catch (IOException e) {

      e.printStackTrace();

  }

  if(cou>1){

   cou--;

   return this.EVAL_BODY_AGAIN;

  }else{

   return this.SKIP_BODY;   // 最终必须返回SKIP_BODY

  }

 }

 

自定义标签的开发包括:

1.  开发标签的处理程序(java类)

2.  .tld 文件中指定标签使用的类

3.  web.xml中指定JSP中使.tld(标签库描述文件)文件的位置。

 

.tld文件中

<tag>

    <name>out</name>

    <tag-class>org.apache.taglibs.standard.tag.el.core.OutTag</tag-class>

<body-content>JSP</body-content>

<attribute>

        <name>value</name>

        <required>true</required>

        <rtexprvalue>false</rtexprvalue>

 </attribute>

  </tag>

 

body-content

根据web-jsptaglibrary_2_0.xsd(位于servlet-api.jar包($TOMCAT_HOME\common\lib)中的\javax\servlet\resources下,其中web.xml验证时所需要的xsd文件都位于此resources目录下), body-content 的值有下面4种:

<xsd:enumeration value="tagdependent"/>

    <xsd:enumeration value="JSP"/>

    <xsd:enumeration value="empty"/>

    <xsd:enumeration value="scriptless"/>

 

 

tagdependent 标签体内容 直接被写入BodyContent,由自定义标签类来进行处理,而不被JSP容器解释

如下:

<test:myList>

select name,age from users

</test:myList>

 

JSP 接受所有JSP语法,如定制的或内部的tagscripts、静态HTML、脚本元素、JSP指令和动作。如:

<my:test>

    <%=request.getProtocol()%>      //

</my:test>

具体可参考后面附源码。

 

empty 空标记,即起始标记和结束标记之间没有内容。

下面几种写法都是有效的,

<test:mytag />

<test:mytag uname="Tom" />

<test:mytag></test:mytag>

 

scriptless 接受文本、ELJSP动作。如上述使用<body-content> scriptless </body-content> 报错,具体可参考后面附源码。

 

rtexprvalue:

由请求时表达式来指定属性的值,默认为false,如下必须设置为true

<test:welcome uname="<%=request.getParameter("username") %>" />

 

 

body-content JSP/scriptless 时标签体可以接受的代码(jasper-compiler.jar $TOMCAT_HOME\common\lib)中 \org\apache\jasper\compiler\Parser.java中):

JSP:

private void parseElements(Node parent)

        throws JasperException

    {

        if( scriptlessCount > 0 ) {

            // vc: ScriptlessBody

            // We must follow the ScriptlessBody production if one of

            // our parents is ScriptlessBody.

            parseElementsScriptless( parent );

            return;

        }

       

        start = reader.mark();

        if (reader.matches("<%--")) {

            parseComment(parent);

        } else if (reader.matches("<%@")) {

            parseDirective(parent);

        } else if (reader.matches("<jsp:directive.")) {

            parseXMLDirective(parent);

        } else if (reader.matches("<%!")) {

            parseDeclaration(parent);

        } else if (reader.matches("<jsp:declaration")) {

            parseXMLDeclaration(parent);

        } else if (reader.matches("<%=")) {

            parseExpression(parent);

        } else if (reader.matches("<jsp:expression")) {

            parseXMLExpression(parent);

        } else if (reader.matches("<%")) {

            parseScriptlet(parent);

        } else if (reader.matches("<jsp:scriptlet")) {

            parseXMLScriptlet(parent);

        } else if (reader.matches("<jsp:text")) {

            parseXMLTemplateText(parent);

        } else if (reader.matches("${")) {

            parseELExpression(parent);

        } else if (reader.matches("<jsp:")) {

            parseStandardAction(parent);

        } else if (!parseCustomTag(parent)) {

            checkUnbalancedEndTag();

            parseTemplateText(parent);

        }

}

Scriptless:

private void parseElementsScriptless(Node parent)

        throws JasperException

    {

        // Keep track of how many scriptless nodes we've encountered

        // so we know whether our child nodes are forced scriptless

        scriptlessCount++;

       

        start = reader.mark();

        if (reader.matches("<%--")) {

            parseComment(parent);

        } else if (reader.matches("<%@")) {

            parseDirective(parent);

        } else if (reader.matches("<jsp:directive.")) {

            parseXMLDirective(parent);

        } else if (reader.matches("<%!")) {

            err.jspError( reader.mark(), "jsp.error.no.scriptlets" );

        } else if (reader.matches("<jsp:declaration")) {

        

分享到:
评论
1 楼 sunson468 2009-01-20  
受教了!谢谢

相关推荐

    JSP2.0 Tag 使用

    在JSP2.0技术规范中,引入了一种新的标签机制,被称为Tag Files(标签文件),其主要目标是为了解决传统JSP页面中脚本元素的使用问题,提供一个更为简洁和高效的方式来进行页面动态内容的添加。开发者可以利用标签...

    JSP学习笔记 jsp学习资料

    本资料包“JSP学习笔记”提供了丰富的学习资源,适用于初学者和有一定经验的开发者,用以提升对JSP的理解和应用能力。 ### 1. JSP基本概念 - **页面组成**:JSP页面由静态内容(HTML、CSS、JavaScript)和动态内容...

    jsp完全学习手册,让你爱上JSP

    "jsp完全学习手册"是一本全面覆盖JSP技术的资源,旨在帮助你从零基础开始,逐步掌握这门强大的Web开发工具。让我们一起探索JSP的核心概念、特性以及实际应用。 首先,了解JSP的基本原理至关重要。JSP是一种基于Java...

    jsp完全学习手册 代码

    《jsp完全学习手册》是针对JavaServer Pages(JSP)技术的一本全面教程,由清华大学出版社出版。这本书涵盖了从基础到高级的JSP知识,旨在帮助读者深入理解并掌握JSP开发技能。2-23章的代码包含了书中实例的源代码,...

    JSP基础学习的课堂源码

    **JSP基础学习知识点概述** JSP(JavaServer Pages)是一种动态网页技术,它允许开发者在HTML、XML或其他标记语言中嵌入Java代码,从而实现服务器端的动态内容生成。本资源提供了JSP基础学习的课堂源码,以及一个...

    JAVA_JSP学习系列

    本"JAVA_JSP学习系列"着重于为初学者提供深入浅出的学习资源,通过实例教学,帮助读者快速掌握JSP的核心概念和实践技巧。 首先,JSP是Java平台上的一个标准,用于开发服务器端应用程序,特别是Web应用。它允许...

    jsp 基础学习

    【JSP基础学习】 JSP(JavaServer Pages)是Java平台上的动态网页技术,它允许开发者将静态HTML、XML或者JavaScript代码与动态Java代码结合在一起,以创建交互式的Web应用程序。JSP技术由Sun Microsystems(现已被...

    JSP完全学习手册

    《JSP完全学习手册》是一本全面覆盖JSP(Java Server Pages)技术的教程,旨在帮助初学者和进阶者深入理解并掌握JSP的核心概念和技术。这本书通过10个章节的内容,逐步引导读者从基础到高级,系统地学习JSP的各个...

    jsp学习基础课件(适用于初学者)

    5. **EL(Expression Language)和JSTL(JSP Standard Tag Library)**:介绍EL作为简化数据访问的表达式语言,以及JSTL提供的各种标签库,如核心标签库、XML处理标签库等,它们可以提高代码的可读性和可维护性。...

    jsp学习网站

    7. **JSTL(JSP Standard Tag Library)**: - JSTL是一组标准的标签库,提供了循环、条件判断、XML处理等功能,减少Scriptlets的使用。 8. **Servlet和JSP的关系**: - JSP最终被编译成Servlet,两者都是JavaEE...

    Manning - JSP Tag Libraries.pdf

    **正文** 《Manning - JSP Tag Libraries》这本书深入探讨了JavaServer Pages (JSP) 标签库这一核心主题,对于理解并...通过学习和实践,我们可以充分利用JSP标签库的力量,构建更加高效、灵活且易于维护的Web应用。

    JSP学习电子教案JSP

    **JSP学习电子教案JSP** 本资源是一个针对JavaServer Pages (JSP)技术的电子教案,由CSDN推荐并被用户评价为价值颇高的学习资料。它旨在帮助初学者和进阶者更好地理解和掌握JSP编程,使得学习过程更为轻松。在本文...

    关于jsp学习代码

    ### EL(Expression Language)与JSTL(JavaServer Pages Standard Tag Library) EL是一种简洁的表达式语言,用于获取和设置JSP页面中的对象属性。JSTL提供了一套标准标签,如`fmt`, `sql`, `c`等,用于增强JSP的...

    深度学习JSP留言板

    9. JSP标签库:可能还会介绍自定义标签的使用,以及标准标签库如JSTL(JavaServer Pages Standard Tag Library)的应用。 通过这个【深度学习JSP留言板】教程,你不仅可以学习到JSP的基础知识,还能实践如何将这些...

    servlet和jsp学习指南

    - 了解JSP与JSTL(JavaServer Pages Standard Tag Library)以及表达式语言(Expression Language, EL)的结合使用,提高JSP页面的可读性和可维护性。 3. Servlet和JSP的整合应用 - 通过具体的项目案例,学习如何...

    jsp基础学习

    【JSP基础学习】 JSP(JavaServer Pages)是Java平台上的动态网页技术,它允许开发者将静态HTML、XML或自定义标记与Java代码混合在一起,以创建动态内容。JSP是Servlet技术的一种简化,其本质是Servlet,但提供了一...

    jsp完整学习笔记(完整版)

    除了上述基础语法,JSP还支持EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library),它们提供了更简洁的表达式和标准标签库,使JSP代码更加简洁和易读。 在实际开发中,通常推荐使用JSP的...

    Manning - JSP Tag Libraries.rar

    **JSP标签库详解** JSP(JavaServer Pages)是一种动态网页技术,它允许开发者将HTML、CSS和Java代码结合在一起,以创建交互式的...通过深入学习和实践,开发者能够更好地利用JSP标签库提高Web应用的开发效率和质量。

    从零开始学习jsp编程

    【JSP基础教学详解】 JavaServer Pages(JSP)是一种基于Java...通过深入学习这些基础概念和实践,你可以逐步掌握JSP编程,为构建动态、交互性强的Web应用打下坚实基础。不断练习和实践,你将在JSP的世界里游刃有余。

Global site tag (gtag.js) - Google Analytics