`
jayz2010
  • 浏览: 34195 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

Tomcat的标签类实例缓存池控制

阅读更多
支持现场时发现,对于自定义标签库(tld),Tomcat/JBoss和其他一些中间件,如金蝶Apusic表现的不一样。Tomcat会把自定义标签的类实例缓存起来,为下一个用户/请求使用——更确切的说,是维护了一个标签处理器缓存池,可以减少标签类对象的new操作,在一定程度上提升性能,应用服务器代码可以参考org.apache.jasper.runtime.TagHandlerPool。这是Tomcat的缺省行为。然而,对于其他中间件,如Apusic,缺省行为则不一样,它总是为处理某个请求new一个全新的标签类对象。差别是细微的,但给用户应用的可移植性造成了影响。

例如有这样的标签类,在判断age字段为空时,向页面输出一个请求参数的信息:

package com.yd.mytag;

import java.io.IOException;

import javax.servlet.ServletRequest;
import javax.servlet.jsp.JspException;
import javax.servlet.jsp.JspTagException;
import javax.servlet.jsp.tagext.TagSupport;

public class HelloWorldTag extends TagSupport {

/**
*
*/
private static final long serialVersionUID = -3626997868569105660L;
public String age;

public String getAge() {
return age;
}
public void setAge(String age) {
this.age = age;

}
public HelloWorldTag(){
System.out.println("HelloWorldTag init=======================");
System.out.println("AGE IS "+age);
}
//private static final long serialVersionUID = 3174234039143531070L;
public int doStartTag() throws JspException {
return EVAL_BODY_INCLUDE;
}

public int doEndTag() throws JspException {
//String age="";
try {

ServletRequest request =(ServletRequest)this.pageContext.getRequest();
System.out.println(request.getParameter("age"));

if(age==null || age.equals(""))//{
//    age="blank";
// }else {
age = request.getParameter("age");//}

pageContext.getOut().write("age is "+age);
pageContext.getOut().flush();
} catch (IOException ex) {
throw new JspTagException("ERROR");
}
finally{

}
return EVAL_PAGE;
}

public void release(){
//age="";
}
}


简单的JSP页面如下:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8" %>
<%@ taglib uri="/tld/helloworld" prefix="mytag" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>MyJSP</title>
</head>
<body>
<h1>customized tag</h1><br>
<mytag:helloworld></mytag:helloworld>
<br>
<a href="index.jsp?age=testone" >testone</a>
<a href="index.jsp?age=testtwo" >testtwo</a>

<a href="index.jsp?age=99999" >9999999</a>
</body>
</html>


以下是web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>
<jsp-config>
<taglib>
<taglib-uri>/tld/helloworld</taglib-uri>
<taglib-location>/WEB-INF/tlds/helloworld.tld</taglib-location>

</taglib>
</jsp-config>
</web-app>


有这样的hellowworld.tld在WEB-INF/tlds下:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE taglib PUBLIC "-//Sun Microsystems, Inc.//DTD JSP Tag Library 1.2//EN"
"http://java.sun.com/dtd/web-jsptaglibrary_1_2.dtd">
<taglib>
<tlib-version>1.0</tlib-version>
<jsp-version>1.4</jsp-version>
<short-name>mytag</short-name>
<tag>
<name>helloworld</name>
<tag-class>com.yd.mytag.HelloWorldTag</tag-class>
<body-content>empty</body-content>
</tag>
</taglib>


于是,产生的结果是,在缺省的Tomcat上,age的值随着HelloWorldTag的实例被池化复用而随之“缓存”起来,jsp页面的输出随着几个链接的点击不会根据parameter的变化而变化,不是开发人员希望看到的行为,但其他应用服务器,如Apusic却可以。初看来这似乎是Tomcat的bug,但实际深入APP SERVER的源代码和实现机制分析,Tomcat不但机制更为合理(提供了提升性能的缓存),而且很灵活的可以将它的行为配置得和Apusic等应用服务器一直,即绕开TagHandlerPool,方法如下:

在$TOMCAT_HOME/conf/web.xml中,找到有

<servlet-name>JSP-Compiler</servlet-name>

<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>

的一段配置,加入以下参数即可:

<init-param>
<param-name>tagpoolMaxSize</param-name>
<param-value>0</param-value><!--0表示空,-1表示无限大-->
</init-param>


此外,根据Tomcat官方文档http://tomcat.apache.org/tomcat-6.0-doc/jasper-howto.html,enablePooling这个参数似乎也有同样的功效,不幸的是,根据我的实验,单独设置enablePooling为false并不能够解决上面的问题。

对于JBoss,由于web部分基本是采用Tomcat内核,因此,修改JBoss的deploy/jboss-web.

deployer/conf/web.xml(针对版本4.2~4.3)
找到这一部分:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
.....

<load-on-startup>3</load-on-startup>
</servlet>


在<load-on-startup>3</load-on-startup>之前加入这一段:
<init-param>
<param-name>tagpoolMaxSize</param-name>
<param-value>0</param-value>
</init-param>

就可以了。
分享到:
评论

相关推荐

    redis的tomcat7和tomcat8-session共享全jar包

    同一个应用在运行多个tomcat实例的时候,经常需要共享Session。利用Redis第三方缓存进行配置; 生产环境一般会使用了redis,所以主要是编译tomcat-redis-session-manager来达到tomcat利用redis进配置session共享。...

    how-tomcat-works

    20.5.2 mbean标签实例 164 20.5.3 自己编写一个model MBean 164 20.5.4 注册 164 20.5.5 ManagedBean 165 20.5.6 BaseModelMBean 165 20.5.7 使用Modeler API 165 20.6 Catalian中的MBean 165 20.6.1 ClassNameMBean...

    How Tomcat Works: A Guide to Developing Your Own Java Servlet Container

    20.5.2 mbean标签实例 164 20.5.3 自己编写一个model MBean 164 20.5.4 注册 164 20.5.5 ManagedBean 165 20.5.6 BaseModelMBean 165 20.5.7 使用Modeler API 165 20.6 Catalian中的MBean 165 20.6.1 ClassNameMBean...

    JAVA上百实例源码以及开源项目源代码

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    HTML5离线缓存在tomcat下部署可实现图片flash等离线浏览

    打开一个网页,加载完后,如果突然断网了,那么你刷新后那页面就没了,怎么阻止这种局面的发生呢?html5的出现让我们豁然开朗,接下来将为您详细解读

    低清版 大型门户网站是这样炼成的.pdf

    3.2 struts 2控制标签详解 105 3.2.1 if/elseif/else标签详解 105 3.2.2 iterator标签详解 106 3.2.3 append标签详解 108 3.2.4 generator标签详解 110 3.2.5 merge标签详解 112 3.2.6 subset标签详解 113 ...

    JAVA上百实例源码以及开源项目

     Java二进制IO类与文件复制操作实例,好像是一本书的例子,源代码有的是独立运行的,与同目录下的其它代码文件互不联系,这些代码面向初级、中级Java程序员。 Java访问权限控制源代码 1个目标文件 摘要:Java源码,...

    实战Nginx:取代Apache的高性能Web服务器 第一章

    2.6 Nginx的信号控制 2.7 Nginx的平滑升级 第2部分 进 阶 篇 第3章 Nginx的基本配置与优化 3.1 Nginx的完整配置示例 3.2 Nginx的虚拟主机配置 3.3 Nginx的日志文件配置与切割 3.4 Nginx的压缩输出配置 .3.5 Nginx的...

    SpringMVC-Mybatis-Shiro-redis-master 权限集成缓存中实例

    在&lt;build&gt; 标签内加入即可,如果还是不能解决,那么请你加群(改名后)说明你的问题,有人会回答你。 5.Tomcat7以上在访问JSP页面的时候,提示JSTL错误。 这个错误是因为Tomcat7 中没有 JSTL 的jar包,现在已经在...

    Java的学习之路,学习JavaEE以及框架时候的一些项目,结合博客和源码,让你受益匪浅,适合Java初学者和刚入门开始学框架者

    文件名与介绍: [Database-support-...[myDbPoolUse]C3P0连接池配置/DBCP连接池配置/Apache的DBUtils框架使用 [myFilterDemoWeb]过滤器Filter学习-设置全站编码与设置页面缓存 [myGzipWeb]全站压缩 [myJavaMainDe

    mysql spring c3p0/dbcp/dbUtils工具支持包

    [Hibernate]利用Hibernate进行一对多的级联操作-Web实例 [Java_MySQL_jar]-数据库连接支持包 [JavaMail]-收发邮件支持包 [Java_MySQL_jar]Java访问数据库需要的包 [Spring]基于Spring框架的Web应用演示(附带cglib...

    hibernate3+struts2+spring2+freemarker 主流技术架构 实例

    +-----图文安装JDK+TOMCAT+MYSQL配置指南.doc +----jeecms +-----源码 +----JEECMS v2.3.2 Final版发布公告.txt +----readme.txt +----框架简介.txt JEECMS是JavaEE版网站管理系统(Java Enterprise Edition ...

    实战Nginx.取代Apache的高性能Web服务器

    2.6 Nginx的信号控制 2.7 Nginx的平滑升级 第2部分 进 阶 篇 第3章 Nginx的基本配置与优化 3.1 Nginx的完整配置示例 3.2 Nginx的虚拟主机配置 3.3 Nginx的日志文件配置与切割 3.4 Nginx的压缩输出配置 .3.5...

    实战nginx-张宴

    5.1 Nginx与JSP( Tomcat) 在Linux上的安装、 配置 5.2 Nginx与ASP.NET( Mono+FastCGI) 在Linux上的安装、 配置 5.3 Nginx与Perl( FastCGI) 在Linux上的安装、 配置 第6章 Nginx HTTP负载均衡和反向代理的配置...

    从J2SE到J2EE知识点介绍

    9.实例成员和类成员 13 (四).类的继承 14 1.创建子类 14 2.this引用、super引用 16 3.最终类和抽象类 18 (五).类的多态性 18 1. 方法的重载 18 2. 方法的覆盖 18 (六).接口 20 1. 定义接口 20 2. 实现接口 21 ...

    Java开发技术大全 电子版

    14.8.1标签(Jlabel)使用示例488 14.8.2按钮(JButton)使用示例491 14.8.3文本框(JTextField)和密码框(JPasswordField)使用示例492 14.8.4文本区(JTextArea)使用示例496 14.8.5复选框(JcheckBox)使用...

    BOS技术整理-05

    applicationContext中发布服务 bean实例绑定服务实现类 配置日志输入输出拦截 Restful风格的好处: 1.基于这种风格架构,软件编写可以更简洁 → 一个地址通过请求方式控制请求方法 2.基于HTTP协议,支持...

    Linux运维从入门到高级全套案例v3

    4.1. 3 Shell流程控制语句 62 4.1. 4 Shell脚本案例 67 4.1. 5 Shell数组编程 71 5. Linux深入篇 72 5. 1 构建Nginx WEB服务器 72 5.1. 1 Nginx WEB安装 73 5.1. 2 Nginx 虚拟主机配置 74 5.1. 3 Nginx性能优化 75 ...

    java开源包1

    开发它是用于在UTF-8 Oracle实例中使用ASCII编码的Oracle 数据库中来正确的传输非ASCII字符。 Java模板语言 Beetl Beetl,是Bee Template Language的缩写,它绝不是简单的另外一种模板引擎,而是新一代的模板引擎,...

Global site tag (gtag.js) - Google Analytics