`
簡單從泚銷夨
  • 浏览: 74372 次
  • 性别: Icon_minigender_1
  • 来自: 文一西路969号
社区版块
存档分类
最新评论

jsp标签缓存池分析

    博客分类:
  • java
阅读更多

  之前的分页标签写完了,放到线上没出现问题,之后由于要支持wml和html版本,并且要支持form表单,所以改了一下,在TagSupport加了一些变量,没一会写完了,后测试的时候发现好像有缓存,把之前复制的值存下来了,不是每次都new吗?好吧!google,原来确实如此,反编译jsp生成的class文件,发现一下代码。

 

 

public void _jspInit() {
    this._005fjspx_005ftagPool_005fc_005fchoose = TagHandlerPool.getTagHandlerPool(getServletConfig());
    this._005fjspx_005ftagPool_005fc_005fwhen_0026_005ftest = TagHandlerPool.getTagHandlerPool(getServletConfig());
    this._005fjspx_005ftagPool_005fc_005fif_0026_005ftest = TagHandlerPool.getTagHandlerPool(getServletConfig());
    this._005fjspx_005ftagPool_005fc_005fforEach_0026_005fvar_005fitems = TagHandlerPool.getTagHandlerPool(getServletConfig());
    this._el_expressionfactory = _jspxFactory.getJspApplicationContext(getServletConfig().getServletContext()).getExpressionFactory();
    this._jsp_annotationprocessor = ((AnnotationProcessor)getServletConfig().getServletContext().getAttribute(AnnotationProcessor.class.getName()));
  }

  public void _jspDestroy() {
    this._005fjspx_005ftagPool_005fc_005fout_0026_005fvalue_005fnobody.release();
    this._005fjspx_005ftagPool_005fc_005fchoose.release();
    this._005fjspx_005ftagPool_005fc_005fwhen_0026_005ftest.release();
    this._005fjspx_005ftagPool_005fc_005fif_0026_005ftest.release();
    this._005fjspx_005ftagPool_005fc_005fforEach_0026_005fvar_005fitems.release();
  }
 

 

这里面有个缓存池-TagHandlerPool,看源码。

 

 

public class TagHandlerPool {

    private Tag[] handlers;

    public static String OPTION_TAGPOOL="tagpoolClassName";
    public static String OPTION_MAXSIZE="tagpoolMaxSize";

    // index of next available tag handler
    private int current;

    public static TagHandlerPool getTagHandlerPool( ServletConfig config) {
        TagHandlerPool result=null;

        String tpClassName=getOption( config, OPTION_TAGPOOL, null);
        if( tpClassName != null ) {
            try {
                Class c=Class.forName( tpClassName );
                result=(TagHandlerPool)c.newInstance();
            } catch (Exception e) {
                e.printStackTrace();
                result=null;
            }
        }
        if( result==null ) result=new TagHandlerPool();
        result.init(config);

        return result;
    }

    protected void init( ServletConfig config ) {
        int maxSize=-1;
        String maxSizeS=getOption(config, OPTION_MAXSIZE, null);
        if( maxSizeS != null ) {
            try {
                maxSize=Integer.parseInt(maxSizeS);
            } catch( Exception ex) {
                maxSize=-1;
            }
        }
        if( maxSize <0  ) {
            maxSize=Constants.MAX_POOL_SIZE;
        }
        this.handlers = new Tag[maxSize];
        this.current = -1;
    }

    /**
     * Constructs a tag handler pool with the default capacity.
     */
    public TagHandlerPool() {
    // Nothing - jasper generated servlets call the other constructor,
        // this should be used in future + init .
    }

    /**
     * Constructs a tag handler pool with the given capacity.
     *
     * @param capacity Tag handler pool capacity
     * @deprecated Use static getTagHandlerPool
     */
    public TagHandlerPool(int capacity) {
    this.handlers = new Tag[capacity];
    this.current = -1;
    }

    /**
     * Gets the next available tag handler from this tag handler pool,
     * instantiating one if this tag handler pool is empty.
     *
     * @param handlerClass Tag handler class
     *
     * @return Reused or newly instantiated tag handler
     *
     * @throws JspException if a tag handler cannot be instantiated
     */
    public Tag get(Class handlerClass) throws JspException {
    Tag handler = null;
        synchronized( this ) {
            if (current >= 0) {
                handler = handlers[current--];
                return handler;
            }
        }

        // Out of sync block - there is no need for other threads to
        // wait for us to construct a tag for this thread.
        try {
            return (Tag) handlerClass.newInstance();
        } catch (Exception e) {
Rate            throw new JspException(e.getMessage(), e);
        }
    }

    /**
     * Adds the given tag handler to this tag handler pool, unless this tag
     * handler pool has already reached its capacity, in which case the tag
     * handler's release() method is called.
     *
     * @param handler Tag handler to add to this tag handler pool
     */
    public void reuse(Tag handler) {
        synchronized( this ) {
            if (current < (handlers.length - 1)) {
                handlers[++current] = handler;
                return;
            }
        }
        // There is no need for other threads to wait for us to release
        handler.release();
    }

    /**
     * Calls the release() method of all available tag handlers in this tag
     * handler pool.
     */
    public synchronized void release() {
    for (int i=current; i>=0; i--) {
        handlers[i].release();
    }
    }

    protected static String getOption( ServletConfig config, String name, String defaultV) {
        if( config == null ) return defaultV;

        String value=config.getInitParameter(name);
        if( value != null ) return value;
        if( config.getServletContext() ==null )
            return defaultV;
        value=config.getServletContext().getInitParameter(name);
        if( value!=null ) return value;
        return defaultV;
    }

}

 

      原来每个jsp生成的servlet都有个TagHandlerPool,每次初始化的时候创建各个标签的连接池,然后想用就从缓存池里面获取,由于此缓存标签用完还要放到缓存池中,所以每次标签里面的变量要重新复制,不然会出现数据不一致的问题。

1
3
分享到:
评论

相关推荐

    jsp学生管理系统源码+分析

    - **View**: JSP页面,用于展示系统界面,如登录页面、学生信息展示页等,通常包含HTML、CSS和嵌入的JSP标签或脚本元素。 - **Controller**: Servlet或JSP动作,接收用户的HTTP请求,处理后调用Model进行数据处理,...

    企业门户网站 jsp

    - **JSP 页面缓存**:通过缓存 JSP 输出,减少服务器计算,提高响应速度。 - **JSP 预编译**:使用 JSP 编译器预编译 JSP 页面,提高首次请求的响应时间。 - **数据库优化**:优化 SQL 查询,使用连接池,减少...

    JSP应用开发详解(第二版)

    - EJB与JSP的优缺点分析 **第十三章:JSP与Ajax** - Ajax基础:XMLHttpRequest对象 - 使用JavaScript进行异步通信 - JSP页面与Ajax的交互 **第十四章:JSP的安全性** - 安全问题的识别与防范 - 用户认证与授权 - ...

    JSP核心技术和电子商务应用实例源代码分析

    - **性能优化**:例如缓存策略、数据库连接池、异步处理等,提升系统性能。 通过阅读《JSP核心技术和电子商务应用实例源代码分析》,开发者不仅可以掌握JSP的基本概念和技术,还能深入理解如何在实际项目中应用...

    JSP客户管理系统

    在JSP中,Controller功能通常由Servlet实现,或者使用JSP动作标签如 `&lt;jsp:forward&gt;` 或 `&lt;jsp:include&gt;` 来实现。 **三、MSSQL2000数据库** MSSQL2000是Microsoft公司的一款关系型数据库管理系统,用于存储和管理...

    JSP书店开发完整实例

    9. **JSP标签库** 可以使用自定义标签库或标准标签库(如JSTL)简化JSP页面的编写,提高可读性和复用性。例如,JSTL的`&lt;c:forEach&gt;`可以用来遍历集合,显示书籍列表。 10. **安全与性能优化** 网上书店系统还需要...

    JSP图书管理系统源码

    - JSP标签:如JSTL的`fmt`标签用于国际化,`c`标签进行条件判断和循环操作。 7. **部署与运行** - 需要一个支持JSP和Servlet的Web服务器,如Tomcat,Apache,Jetty等。 - 将源码部署到服务器的Web应用目录下,...

    运用JSP与JavaBean实现的BBS

    10. 安全性:为了防止SQL注入、XSS攻击等安全问题,应使用预编译的SQL语句,进行输入验证,以及使用安全的JSP标签库。 以上就是基于JSP和JavaBean实现BBS项目所涉及的主要知识点,涵盖了Web开发的基础、核心技术和...

    jsp 学生成绩管理系统

    - `&lt;jsp:action&gt;`标签:用于执行自定义的行为,如转发、包含、重定向等。 3. 数据库连接与操作: - 通常,学生成绩管理系统会使用关系型数据库,如MySQL或Oracle,存储学生、课程和成绩信息。 - JDBC(Java ...

    JSP问卷调查

    同时,通过缓存、连接池等技术提升系统性能。 **MyEclipse集成环境** MyEclipse是一款强大的Java EE集成开发环境,支持JSP开发。它集成了Tomcat、Jetty等应用服务器,便于调试和部署JSP应用。在MyEclipse中,可以...

    JSP实现BBS论坛

    JSP的核心概念包括JSP指令(如page、include和taglib)、脚本元素(scriptlets、表达式和声明)以及JSP标签库(如JSTL)。 2. **Servlet原理**: JSP最终会被转换为Servlet,因此理解Servlet的工作原理至关重要。...

    jsp 学生成绩系统

    【标题】"jsp 学生成绩系统"是一个基于JavaServer Pages(JSP)技术构建的教育管理应用程序,用于管理和分析学生的学术成绩。JSP是一种服务器端脚本语言,它允许开发人员将HTML、CSS、JavaScript与Java代码结合,...

    jsp网上书店源代码

    9. **安全与性能优化**:系统可能涉及到防止SQL注入、XSS攻击的安全措施,以及缓存策略、连接池等性能优化手段。 10. **部署与运行环境**:JSP应用通常需要在支持Java的Web服务器上运行,如Tomcat、Jetty等,开发者...

    提高JSP应用程序运行速度的七大绝招时间.doc

    定期使用性能监控工具分析JSP应用程序的运行状态,找出瓶颈所在,并进行针对性优化。例如,使用JMeter或LoadRunner进行压力测试,了解系统在高并发下的表现;使用VisualVM或JProfiler等工具进行JVM调优,优化内存...

    JSP 程序设计从入门到精通 PDF 教程

    - **1.3.1 JSP页面中的元素**:这部分解释了JSP页面中常见的几种元素,如JSP标签、脚本片段、声明、表达式等。 - **1.3.2 JSP语法概要**:这里提供了JSP语法的基本概述,包括不同类型的标签和它们的作用。 - **1.3.3...

    韩顺平.j2ee视频实战教程jsp迅雷下载地址.txt

    - **自定义标签**:教授如何开发自定义JSP标签,以及如何使用它们来封装复杂的页面逻辑。 - **会话管理**:讨论如何使用cookie、session等机制来进行用户会话管理。 - **错误处理**:介绍如何在JSP中处理异常情况,...

    JSP+Oracle网络应用系统开发与实例源代码

    在JSP页面中,开发者可以使用JSP指令、脚本元素、表达式以及EL(Expression Language)和JSTL(JavaServer Pages Standard Tag Library)标签库来编写代码。 Oracle,作为一款广泛使用的商业关系型数据库管理系统...

    jsp客户管理系统完整源码(含数据库脚本).zip

    JSP文件中,开发人员可能使用了JSP动作标签(如&lt;jsp:include&gt;、&lt;jsp:useBean&gt;)和脚本元素(Scriptlets,如 )来实现动态功能。JSP表达式()可能用于将Java变量输出到页面上。此外,可能还使用了自定义标签库(Tag...

    JSP+SQLServer个人博客

    5. **统计分析**:访问量统计、热门文章排行等,可能需要实时更新和缓存技术。 6. **界面设计**:使用CSS和JavaScript提升用户体验,如响应式布局适应不同设备。 通过JSP+SQLServer实现的个人博客系统,不仅可以...

Global site tag (gtag.js) - Google Analytics