`

jsp tag

 
阅读更多

JSP tag 学习

 

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

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

 

tag2.JPG 

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

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")) {

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

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

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

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

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

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

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

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

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

        } 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);

        }

       

        scriptlessCount--;

}

 

由上面可以看出,局限性比较小,在body-content可以使用 Scriptless 的地方都可以用 JSP 代替,反之则不可。

 

 

  • 大小: 29.6 KB
  • 大小: 30 KB
  • 大小: 27.9 KB
分享到:
评论

相关推荐

    jsp tag接口图

    **JSP Tag接口图**是JavaServer Pages(JSP)技术中的一个重要概念,它涉及到JSP自定义标签的开发和实现。在JSP中,标签库可以极大地提高代码的可读性和可维护性,而Tag接口是创建这些自定义标签的基础。本篇将深入...

    birt jsp tag

    BIRT中JSP Tag的使用 BIRT从2.2开始(最好采用2.2M6及以后版本),提供JSP tag的支持。 现在主要提供了以下5个JSP Tag: 1. viewer --------- 对应 frameset/run 模式,基于Ajax 2. report ---------- 对应 preview...

    javascript合并压缩的jsp tag实现

    JavaScript 合并压缩的 JSP Tag 实现是一个常见的前端优化技术,主要目的是为了减少网络请求次数,提升网页加载速度。在网页开发中,通常会有多份 JavaScript 文件,每份文件都对应一个网络请求,这会增加页面加载...

    jsp tag标签的使用

    在JSP中,tag标签是实现页面逻辑和视图分离的重要手段,提高了代码的可重用性和可维护性。本文将详细介绍JSP的tag标签及其使用方法。** 首先,我们要理解JSP中的tag标签分为两种类型:标准标签库(JSTL, JavaServer...

    dbform jsp tag框架

    "dbform jsp tag框架"是一个专为Java Web开发者设计的高效工具,它利用JSP标签(tag)技术,简化了界面与业务逻辑的交互,从而加速了开发进程。这个框架特别适合构建数据密集型的应用,如表单提交、列表展示等常见...

    ZK框架JSP TAG使用手册

    ### ZK框架JSP TAG使用手册 #### 一、前言与准备工作 ##### 新手入门:JSP与ZK 如果你是初次接触JSP(JavaServer Pages)或ZK框架,那么这份用户指南将为你提供一个很好的起点。JSP是一种用于生成动态网页的技术...

    Manning - JSP Tag Libraries.pdf

    《Manning - JSP Tag Libraries》这本书深入探讨了JavaServer Pages (JSP) 标签库这一核心主题,对于理解并有效利用JSP技术进行Web开发具有极高的价值。标签库是JSP中一种强大的工具,它允许开发者通过自定义的标签...

    Manning - JSP Tag Libraries.rar

    在"**Manning - JSP Tag Libraries**"这个资源中,我们将深入探讨JSP标签库的核心概念、使用方法及其在实际开发中的应用。 ### 1. JSP标准标签库 (JSTL) JSTL(JavaServer Pages Standard Tag Library)是Oracle...

    JSP Tag Libraries

    《JSP Tag Libraries》这本书由Gal Shachor、Adam Chace和Magnus Rydin共同编写,是一本深入探讨JavaServer Pages(JSP)标签库开发的专业书籍。JSP技术是Sun Microsystems公司推出的一种用于创建动态网页的技术,它...

    JSP tag.ppt

    什么是Tag文件 Tag文件的结构 Tag文件的保存 Tag标记与Tag文件的使用 Tag文件中的常用指令 Tag标记的嵌套

    JSP_tag.rar_Eclipse_eclipse jsp t_jsp custom tag_自定义标签

    首先,创建一个新的动态Web项目,然后通过Lomboz的"New &gt; JSP Tag Library"向导创建标签库。向导会生成一个默认的TLD文件,我们需要在这个文件中定义我们的自定义标签。例如,我们可以定义一个名为`&lt;hello&gt;`的标签,...

    CTag.zip_JSP tag_This Is It

    CustomTags This applications clearly inplements custom tag and it use in jsp pages. And is very useful while developing jsp applications.

    java仿google模糊搜索框jsp的tag标签通用查询功能

    在这个项目中,开发者已经创建了一个基于JSP的Tag标签库,实现了这样一个通用的模糊搜索功能。 首先,让我们了解一下什么是JSP Tag标签。JSP Tag标签是JSP的一种扩展机制,它允许开发者创建自定义的、可重用的组件...

    超级封装的.tag标签分页、超级简化jsp内的分页代码、eclipse源码

    本资源提供了一种高效且简洁的分页解决方案,利用.tag标签技术来封装分页逻辑,使得在JSP页面中的实现变得简单易懂。 首先,我们来详细了解一下`.tag`标签。`.tag`文件是JSP标准标签库(JSTL)的一部分,用于创建...

    javax.servlet.jsp.tagext源码

    在Java服务器页面(JSP)技术中,`javax.servlet.jsp.tagext`包是核心组件之一,它提供了用于创建自定义标签库(Tag Libraries)的接口和类。自定义标签是JSP的一种强大特性,允许开发者将复杂的逻辑封装到可重用的...

    WAP 语言标签库 JAVA Jsp tag WAP WML XHTML

    同时支持WAP1.2 ,WAP2.0 ,PDA语言的自适应标签库,使用标签可以利用传入参数可以自由控制页面形态,适配成WML,XHTML,HTML页面.这样用标签库做出一套页面,就是三种同样内容的页面.对于无线内容的开发者,标签库可以减少...

    JSP自定义标签(一)_树形下拉选择菜单

    TLD(Tag Library Descriptor)文件是用来描述标签库中所有自定义标签的元数据。在这个文件中,定义了`SelectorTag`的属性、功能和如何在JSP页面中调用它。 #### 六、CSS代码的重要性 CSS(Cascading Style Sheets...

    JSP及WEB技术 中英文对照文献

    1 JSP简介 JSP(JavaServer Pages)是一种基于Java的脚本技术。是由Sun Microsystems公司倡导、许多公司参与... html) to insert Java program segment (Scriptlet) and JSP tag (tag), To form the JSP file(*jsp).

    jsp 定制标签(Custom Tag).docx

    要创建一个没有Body内容的自定义标签,你需要实现`javax.servlet.jsp.tagext.Tag`接口或继承`TagSupport`类。主要覆盖以下两个方法: - `doStartTag()`: 这个方法在遇到自定义标签时被调用。返回值决定了标签体...

Global site tag (gtag.js) - Google Analytics