`
mozhenghua
  • 浏览: 324101 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论
阅读更多

      利用JSP实现动态页面,常常会写一个自定义标签来实现页面的组件化设计。一般是写一个类让它继承TagSupport类,然后将页面的逻辑封装在TagSupport中,然后在tld文件中添加自定义标签的属性及标签名称声明。 之后就可以在jsp页面使用自定义标签了,以上提到的自定义标签只是一个大概,在此不赘述了。

      另外实现页面组件化设计还有另外一个途径,那就是通过tagplugin来实现。

package org.apache.jasper.compiler.tagplugin;
public interface TagPlugin {
    void doTag(TagPluginContext ctxt);
}

 

 

package org.apache.jasper.compiler.tagplugin;

public interface TagPluginContext {
       boolean isScriptless();
      // 是否设置了自定义标签上的值
      boolean isAttributeSpecified(String attribute);
      // 以该自定义标签为上线文,取得该自定义标签所对应的临时变量名    
      String getTemporaryVariableName();
      // 在JSP生成java文件的过程中会在import区块中导入import的内容    
      void generateImport(String s);
      //
 void generateDeclaration(String id, String text);

    /**
     * Generate Java source codes
     */
    void generateJavaSource(String s);
    // 
    boolean isConstantAttribute(String attribute);
    // 取得自定义标签定义的属性值,isAttributeSpecified()方法为查询该属性值是否有值
    String getConstantAttribute(String attribute);
    // 由于属性值是可以写el的,所以在标签生成结果时候,会在生成java文件的过程中自动调用解析el语法的功能模块
    void generateAttribute(String attribute);
    // 生成自定义标签的body内容,注意:如果在doTag函数中中没有调用该方法的话,tagmanager会在标签解析呃呃最后自动调用标签的内容块
    void generateBody();
    void dontUseTagPlugin();

    TagPluginContext getParentContext();
    void setPluginAttribute(String attr, Object value);
    Object getPluginAttribute(String attr);
}

 以上这两个接口是包装在tomcat的jasper.jar这个jar包中的。

 下面介绍如何在web应用中实现一个简单的tagplugin

  首先,写一个类实现TagPlugin 接口:

public class NameTagPlugin implements TagPlugin {

	private static int count = 1;

	public void doTag(TagPluginContext ctx) {

		System.out.println(ctx.getTemporaryVariableName());

		ctx.generateDeclaration("cssDependants","private static final java.util.List css_dependants = new java.util.ArrayList(1); ");

		if (ctx.isAttributeSpecified("name")) {
			ctx.generateDeclaration("cssDependantsPath" + (count++),
					"static{css_dependants.add(\""
							+ ctx.getConstantAttribute("name") + "\");}");
		}

		System.out.println(ctx.getConstantAttribute("name"));
		
		}

}

注意:以上这个类需要放在 $catalina_home$/common/classes这个目录下,因为tagplugin这个类是在jsp编译成java文件的时候调用的,当java文件被编译成class字节码之后就不会调用tagplugin了。

       TagPluginContext类的generateDeclaration有两个参数,id和 content,当在一个pagecontext中重复调用generateDeclaration()这个方法如果前后两次调用id参数是一样的,那么在java文件中生成的declaration块就会显示第一次调用所输入content内容。

 

以上这段代码会使自定义标签编译成java文件的时候生成,如下内容(代码片段):

public final class nametagtest_jsp extends org.apache.jasper.runtime.HttpJspBase
    implements org.apache.jasper.runtime.JspSourceDependent {
private static final java.util.List css_dependants = new java.util.ArrayList(1); 
static{css_dependants.add("hello");}
static{css_dependants.add("code");}

  private static java.util.List _jspx_dependants;

  static {
    _jspx_dependants = new java.util.ArrayList(1);
    _jspx_dependants.add("/WEB-INF/koubeitagtest.tld");
  }

 

 

 

再写一个自定义标签(这个尽量简单一些,写一个类似helloworld的就行了)

public class TestTag extends TagSupport {

	private String name;

	public int doStartTag() throws JspException {

		try {
			this.pageContext.getOut().write(name);
		} catch (IOException e) {
			throw new JspException(e);
		}

		return EVAL_BODY_INCLUDE;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}
}

 将自定义标签声明在/WEB-INF/koubeitagtest.tld,这个文件中。

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.0" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd">
  <display-name>koubeitest</display-name>
  <tlib-version>2.2.4</tlib-version>
  <short-name>tt</short-name>
  <uri>koubeitest-tags</uri>
  <tag>
    <name>name</name>
    <tag-class>com.koubei.example.tag.TestTag</tag-class>
    <body-content>JSP</body-content>
    <attribute>
      <name>name</name>
      <required>false</required>
      <rtexprvalue>false</rtexprvalue>
    </attribute>
</tag>
</taglib>

 

 创建tagPlugins.xml文件,注意文件名不能有错误,大小写不能错。存放在WEB-INF文件夹下,当时我因为文件名写成了tagplugin.xml造成plugin没有起作用。

<?xml version="1.0"?>

<tag-plugins>
	<tag-plugin>
		<tag-class>com.koubei.example.tag.TestTag</tag-class>
		<plugin-class>com.koubei.example.tag.NameTagPlugin</plugin-class>
	</tag-plugin>	
</tag-plugins>

  

 总结:

  1. 使用tagplugin和customtag都是为了在jsp页面中实现页面组件化设计的,但是他们两个各有侧重,tagplugin是在jsp编译成java文件的编译期使用的(tomcat中是使用JDTCompiler来编译的),而customTag是在jsp页面运行期执行的,tagplugin只会执行一次,而customtag会jsp页面运行的时候每次都执行的。
  2. 在试验过程中发现,tagplugin和customtag这两种技术的使用是互斥的,如果在tagPlugins.xml中为某个自定义标签配置了插件的话那么,改custometag的dostart和doend方法就都不会执行了,而且全要依赖在tagplugin的dotag方法中在jsp编译的时候预先静态写入到java文件中的内容来执行了(这点稍微有点不爽)
  3. 何时应该使用tagplugin这个技术,原先有的内容生成如果是在自定义标签输出的,但是这个内容又不是以来每个访问页面的用户身份而取得的就能用tagplugin技术,这样会大幅提升页面运行的效率。 唯一不足的是,使用tagplugin还是要写一个plugin所对因的customtag,说白了这个customtag就是一个傀儡。

 

分享到:
评论

相关推荐

    深入解析tomcat.pdf

    《深入解析Tomcat》这本书是Java Web开发领域的一本经典之作,由曹旭东翻译,提供了对Apache Tomcat服务器的全面、深入的理解。Tomcat是一款轻量级的应用服务器,广泛用于部署Servlet和JSP应用。以下是对这本书内容...

    Tomcat架构解析文档.zip

    【Java面试必备】Tomcat架构解析 Tomcat作为一款开源的、基于Java的Web应用服务器,是许多初学者和开发者入门Java Web应用的首选。它轻量级、高效且易于管理,广泛应用于小型到中型企业级应用。在面试中,对Tomcat...

    tomcat源码+文档pdf+源码解析

    这个资源包包含了Tomcat的源码、文档以及源码解析,对于深入理解Tomcat的工作原理、优化应用性能以及进行二次开发具有极大的帮助。 首先,让我们深入探讨Tomcat的源码。源码是软件的基石,通过阅读源码,我们可以...

    解析Tomcat处理请求的类Connector<三>

    【标题】:“解析Tomcat处理请求的类Connector&lt;三&gt;” 在Java的Web服务器领域,Tomcat无疑是最为广泛使用的轻量级应用服务器之一。它以其开源、免费、高效的特点深受开发者喜爱。在这个系列的第三部分,我们将深入...

    tomcat 架构 分析

    作为Web服务器,Tomcat负责解析Java的Servlet和JSP页面。 一、Tomcat整体架构概述 Tomcat架构具有模块化特性,其核心部分由两个组件构成:Connector(连接器)和Container(容器)。这两者在Tomcat中扮演着极其...

    tomcat 架构解析和优化。pdf

    《Tomcat架构解析与优化》一书主要涵盖了Apache Tomcat服务器的基础架构、工作原理以及性能调优策略。Tomcat作为一款广泛使用的Java Servlet容器,它的高效运行和优化对于任何Java Web应用都至关重要。 首先,...

    架构解析——Tomcat

    《架构解析——Tomcat》是刘光瑞撰写的一本深入探讨Tomcat的书籍,共380页,采用PDF格式,包含索引书签目录,方便读者查阅和学习。这本书全面解析了Tomcat的内部机制,是理解Java Web服务器核心技术的重要参考资料。...

    apache+tomcat域名泛解析

    ### Apache + Tomcat 域名泛解析详解 在现代Web服务器配置中,Apache与Tomcat结合使用是一种常见的做法,特别是在需要处理静态资源与动态内容分离的场景下。本文将详细探讨如何通过Apache来实现对Tomcat应用的域名...

    tomcat架构解析_PDF电子书下载 高清 带索引书签目录_刘光瑞(著)

    《Tomcat架构解析》这本书由刘光瑞撰写,由人民邮电出版社出版,是一本深入探讨Tomcat服务器架构的专业书籍。Tomcat作为Apache软件基金会的项目之一,是世界上最流行的Java应用服务器,尤其在轻量级Web应用领域,其...

    解析Tomcat的启动脚本–catalina.bat

    Tomcat 的三个最重要的启动脚本: startup.bat catalina.bat setclasspath.bat 上一篇咱们分析了 startup.bat 脚本 这一篇咱们来分析 catalina.bat 脚本. 至于 setclasspath.bat 这个脚本, 相信看完这一篇, 就可以...

    tomcat 架构解析

    Tomcat架构解析 基于Tomcat 8.5.x全面介绍了Tomcat的架构、各组件的实现方案以及使用方式,主要包括Tomcat的基础组件架构以及工作原理,Tomcat各组件的实现方案、使用方式以及详细配置说明,Tomcat与Web服务器集成...

    tomcat源码解析

    ### tomcat源码解析 #### 简介与概览 Tomcat作为一款开源的Servlet容器,被广泛应用于Java Web应用的开发与部署环境中。它不仅支持Servlet API,还支持JSP规范,使得开发者能够轻松地构建动态网页。本文旨在深入...

    tomcat架构解析 【刘光瑞PDF高清】.rar

    《Tomcat架构解析》是由刘光瑞撰写的一本深入探讨Tomcat应用服务器架构的专业书籍。这本书全面剖析了Tomcat的设计原理、内部工作机制以及各种组件的详细配置,是学习和理解Tomcat不可或缺的参考资料。 Tomcat作为一...

    tomcat解析多个项目配置

    tomcat解析多个项目配置,并设置默认访问项目。

    tomcat架构解析-高清-完整

    本书只是从架构设计上,对Tomcat的各组件进行了概念性讲解,如果你想阅读Tomcat的源码,本书的内容会让你更容易了解Tomcat的组件结构、设计方案,更容易去由概要到具体的熟悉Tomcat各组件的实现。 其次,本书不局限...

    tomcat启动原理解析

    **Tomcat启动原理解析** Tomcat作为一款广泛使用的开源Java应用服务器,其启动过程涉及了众多关键步骤和组件的协同工作。理解Tomcat的启动原理对于开发者来说至关重要,不仅有助于提升性能优化的能力,还能在遇到...

    Tomcat解析与性能优化.pdf

    ### Tomcat解析与性能优化知识点概述 #### 一、Tomcat基本构成与文件结构 **1. 文件构成** - **1.1 server/shared/common目录** - **Java类库存放位置**:`/server/lib`、`/shared/lib` 和 `/common/lib` 三个...

    Tomcat源码解析.pdf

    ### Tomcat源码解析知识点概览 #### 一、Tomcat概述 - **定义**:Apache Tomcat是一款开源的Servlet容器,它实现了Servlet规范,并且提供了作为Web服务器的一些特性,但其提供的性能远不及专业的Web服务器,如...

    tomcat7,tomcat8,tomcat9

    Tomcat7、Tomcat8和Tomcat9是不同版本的Tomcat,每个版本都有其特性和改进。 **Tomcat7**: Tomcat7是2011年发布的,它主要支持Java Servlet 3.0和JSP 2.2规范。这个版本引入了一些重要改进,包括增强的安全性、更...

    tomcat配置虚拟目录,外加域名解析

    当我们谈论“Tomcat配置虚拟目录,外加域名解析”,这涉及到两个关键概念:一是如何在Tomcat服务器上设置虚拟主机(virtual hosts),使得一个Tomcat实例可以服务于多个不同的域名或网站;二是如何进行DNS域名解析,...

Global site tag (gtag.js) - Google Analytics