问题描述:
使用JSP自定义标签时,发现标签内的私有变量在页面第一次请求之后就不会发生变化了。而且不同的页面同样的标签变量值不一样。
问题猜想:
原以为JSP自定义标签在JSP编译的时候会被new出来,但是看样子JSP在编译的时候用了缓存池来存放解析后的标签的对象。并且这个缓存池针对同一个页面是共享的。
问题原因跟踪:
查看JSP编译成的servlet代码,发现标签的实例果然不是new出来的,而是这么创建的:
是从一个缓存池里取出来的,再往前跟踪缓存池的创建和销毁:
把当前servlet的config作为参数,得到了一个标签缓存池的实例,也就是说对于同一个servlet标签缓存池是共享的。证明了之前的猜想。
既然实例共享,那么很自然的就想到了tomcat是怎么做到线程安全的呢?
关于标签的线程安全可以参考下面的链接,不再赘述:
http://klcwt.iteye.com/blog/749652
结论:
虽然使用标签时可以不用担心线程安全,但是在使用标签内的属性变量时要特别小心,在标签解析完时要注意将一些不必要的属性变量重置为默认值,否则很容易“一劳永逸”。
P.s:JSP自定义标签生命周期http://blog.csdn.net/xuejianxinokok/archive/2010/06/29/5702155.aspx
分享到:
相关推荐
- **生命周期**:JSP页面经历加载、解析、编译、初始化、服务和销毁六个阶段,理解这些阶段对于优化性能至关重要。 - **动作(Actions)**:`jsp:include`, `jsp:forward`, `jsp:param`等动作用于控制页面的流程和...
Struts2是一个强大的MVC...5. JSP和标签库:了解JSP页面中标签的生命周期,以及它们与后台Java类的交互机制。 这些内容对于深入理解和开发基于Struts2的Web应用至关重要,同时也能帮助开发者提高工作效率和代码质量。
Servlet的执行流程也就是servlet的生命周期,当服务器启动的时候生命周期开始,然后通过init()《启动顺序根据web.xml里的startup-on-load来确定加载顺序》 方法初始化servlet,再根据不同请求调用doGet或doPost...
这个文件提供了JSP 2.2版本的源码,包括JSP页面的转换机制,EL解析,以及自定义标签的实现细节。开发者可以借此深入了解JSP是如何被编译成Servlet的,以及如何将EL表达式转化为Java代码执行。 总的来说,深入学习这...
2. **JSP生命周期**:包括翻译阶段、初始化、服务和销毁四个阶段,其中翻译阶段会将JSP转换为Servlet。 **二、JSP 2.0的新特性** 1. **表达式语言(EL)**:EL简化了获取和设置JavaBean属性的操作,允许在JSP页面中...
3. **JSP生命周期**: 从加载到销毁的过程,包括初始化、服务和销毁三个阶段。 4. **JSP内置对象**: request、response、session、application、out、pageContext等对象的用法和作用。 5. **Servlet与JSP的关系**: ...
- 定义了一个自定义标签库的位置,以便在JSP页面中使用。 ```jsp ``` #### 二、脚本元素 脚本元素允许在JSP页面中嵌入Java代码,主要用于实现动态功能。 1. **声明元素** (`! ... %>`) - 用于声明变量或...
- **JSP自定义标签** - 自定义标签允许开发者创建自己的标签,以简化 JSP 页面的开发。 - **JSP表达式语言** - 表达式语言 (EL) 提供了一种简洁的方式来访问 JSP 页面中的对象和属性。 - **JSP异常处理** - 异常...
5. **JSP生命周期**:解析JSP页面的编译、初始化、服务和销毁过程。 6. **MVC设计模式**:JSP在MVC架构中的位置,以及如何与Servlet和JavaBean协作。 7. **JSP的高级特性**:自定义标签、自定义动作、过滤器和监听...
**JSP生命周期** 包括解析、编译、加载、初始化、服务和销毁六个阶段。在服务阶段,JSP会被转换为一个servlet类,每次请求都会调用这个servlet的`service()`方法。 综上所述,"jsp帮助文档api" 是关于JSP技术的API...
介绍了Servlet的基本概念、生命周期、请求处理流程,以及过滤器、监听者、JavaBean的使用,为JSP开发者提供了更深层次的技术支撑。 ### 数据库访问技术 包括SQL语言的基础知识、JDBC驱动的配置和使用,以及如何...
1. **JSP基础**:JSP语法、EL(Expression Language)、JSTL(JSP Standard Tag Library)、自定义标签等,这些都是构建动态Web页面的基础。 2. **Servlet技术**:JSP与Servlet的关系,Servlet生命周期,以及如何...
- **JSP生命周期**: - 编译阶段:将JSP文件编译成Servlet类。 - 执行阶段:运行编译后的Servlet类来处理HTTP请求。 - **JSP指令标签**: - `page`指令:设置页面属性,如编码、脚本语言等。 - `include`指令:...
- **标签库**:自定义的或内置的标签库可以封装复杂功能,简化JSP页面的编写。 #### 3. **MVC模式** - **定义**:Model-View-Controller,一种设计模式,用于分离应用程序的业务逻辑、数据和表示层。Servlet通常...
为了使用自定义标签,JSP页面必须引用相应的标签库描述符(Tag Library Descriptor,TLD)。TLD文件定义了自定义标签的名称、属性和行为。通过引用TLD,JSP页面能够识别并正确地使用自定义标签。 #### Servlet配置...
- **生命周期与线程模型**:分析JSP的生命周期,理解其线程模型,以及在JSP中定义类变量的方法。 - **分页技术**:介绍数据库分页原理,并使用JSTL(JavaServer Pages Standard Tag Library)改写分页逻辑,提高数据...
5. **JSP标签库**:如JSTL(JavaServer Pages Standard Tag Library)和自定义标签库,可以提高代码可读性和复用性,简化JSP页面的编写。例如,JSTL可以用于处理条件语句、迭代、XML解析等任务。 6. **Session和...
3. **JSP生命周期**:经历翻译、编译、加载和实例化等阶段,可通过自定义标签库(JSTL)等工具介入。 4. **JSP元素交互**:在最终生成的Servlet中,这些元素协同工作,呈现动态内容。 以上是`head_first_servlet&...