网上朋友的回答是加入<%@ page isThreadSafe=”false”%>这条命令。天啊,我晕!这是什么命令?是jsp的命令啊,怎么会加入到servlet中呢?当然了,jsp的运行实质是servlet机制,这条命令是jsp页面告诉容器编译“我”的时候实现单线程。那我们看看他编译后的servlet类和以前的servlet有什么不同?没有加入这条指令的页面中servlet类定义是:
public final class index_jsp extends
org.apache.jasper.runtime.HttpJspBase
implements
org.apache.jasper.runtime.JspSourceDependent {
………………………………//内部实现咱们大可以不看他。
}
而加入这个命令之后的类定义是:
public final class index_jsp extends
org.apache.jasper.runtime.HttpJspBase
implements
org.apache.jasper.runtime.JspSourceDependent,
SingleThreadModel {
…………………………//同样省略实现细节
}
我想大家应该很清楚的发现:加入<@page isThreadSafe="false">之后servlet是实现了SingleThreadModel接口的。有兴趣的朋友可以查下相关资料,其实这个接口在servlet2.4之后就废除了。那么为什么废除?实现了这个接口查看代码内容的时候却发现什么方法都没添加,为什么?
其实这个接口只是一个标识,让容器改变servlet生成策略的。
默认的,servlet容器是只创建servlet単实例,为请求提供线程池,我们为了能保证servlet的线程安全问题而不在servlet中添加实例属性。
但是如果一个servlet实现了SingleThreadModel接口那容器在创建实例池,为每个求情分配实例,当用户请求结束时将实例归还实例池。
这样做真的安全吗?非也!因为每个请求都会分发一个servlet实例,对于同用户下分发的不同的servlet来说很可能用到同一个session中的属性数据,这样当然出现了线程同步的问题,是不安全的!而且不同用户也可能享用同一个context中的数据,也是不安全的。于是在servlet2.4中建议不再使用这样的设置。
这样一来我们知道:如果非要实现servlet单线程那就要在servlet中实现SingleThreadModel接口,在jsp中添加<@ page isThreadSafe="false">命令。但是这是不被提倡的。
也有网友疑问:让servlet单线程而多实例本来不是为了线程安全的吗?为什么<@ page isThreadSafe=?>?的答案却是false?
我觉得这是个误区,这样设置真的是单线程吗?那肯定不是了,其实这个设置只是要容器保证同一时刻只有一个线程能在servlet的service方法中执行,因为默认的容器实例化servlet时时単实例,如果同时只有一个线程去管理这个唯一的servlet实例,那性能将是极其慢的,为了解决这个问题,容器采取了servlet实例池的方式。每个请求一个线程,而一个线程一个servlet。
因为这种方式并不是线程安全的,所以答案是false。
终上所述:其实这道题目是指如果让一个servlet实例对应一个线程,而不是一个servlet实例对应多个线程的默认方式
相关推荐
#### 二、Servlet容器的单实例多线程处理模式 Servlet容器默认采用单实例多线程的方式处理请求,这意味着对于每个Servlet类,容器只会创建一个实例,并让这个实例服务于所有针对该Servlet的请求。这种方式减少了...
5、如何现实servlet的单线程模式★★ 答:<%@page isThreadSafe=false%> 面试中会遇到! 6、页面间对象传递的方法 答:request,session,application,cookie等 7、JSP和Servlet有哪些相同点和不同点,他们...
开发者可以通过实现Servlet接口或继承HttpServlet类来创建自己的Servlet。Servlet容器(如JSWDK、Tomcat、WebSphere等)负责管理和运行Servlet,它们根据web.xml配置文件中的信息来加载、实例化和管理Servlet。 ...
在完成任务后,Servlet可能不会立即销毁,而是等待一段时间以处理后续请求,这称为多线程模型,提高了服务器的效率。 在这个登录案例中,我们通常会包含以下几个核心组件: 1. **HTML表单**:客户端的登录界面通常...
10. **MVC模式与Servlet**:虽然Servlet主要用于处理请求和响应,但在实际应用中,常常与Model-View-Controller(MVC)设计模式结合,如Spring MVC框架,将业务逻辑、视图渲染和控制逻辑分离。 通过深入学习Servlet...
此外,多线程模型在Servlet中也非常重要,因为Servlet通常在一个单独的线程中为每个请求服务,理解线程安全问题和同步机制是必要的。 在J2EE环境中,Servlet常与JavaServer Pages (JSP)一起使用,形成MVC设计模式的...
在“pushlet_向在线的特定用户发送消息的单线程应用”中,我们关注的是如何使用Pushlet来实现对特定在线用户的即时消息推送,并且整个应用是基于单线程设计的。 首先,我们需要理解单线程的含义。在多用户环境中,...
4. 单例模式:如果Servlet实例不需要为每个请求都创建,可以使用单例模式,并确保所有可能的共享状态都是线程安全的。 5. 无状态Servlet:如果Servlet不需要保持任何状态,那么它天生就是线程安全的,因为没有共享...
Servlet-api-3.0.jar是Java Servlet API的第三版实现,它是开发Web应用程序的重要组成部分,特别是在基于Java的服务器端编程中。这个库包含了用于创建和管理HTTP服务端点的接口和类,允许开发者构建动态、交互式的...
在这个名为“servlet_src”的压缩包中,你可能会找到实现Servlet的各种java文件,这些文件展示了Servlet生命周期、请求处理以及与其他Java EE组件交互的方法。 1. **Servlet生命周期**:Servlet的生命周期由服务器...
12. **MVC模式支持**:虽然Servlet API本身不强制使用某种设计模式,但它与Model-View-Controller(MVC)模式很好地配合,使得开发者可以将业务逻辑、视图和控制分离,提高代码的可维护性。 13. **版本更新**:从...
在异步模式下,当Servlet容器接收到请求后,会调用Servlet的`doService`或`service`方法,然后在该方法内启动一个异步操作。Servlet可以立即返回控制权给容器,而不用等待任务完成。容器会释放掉用于处理该请求的...
2. **线程安全**:Servlet默认为多线程环境设计,因此需要避免在实例变量中存储状态信息,以免引发线程安全问题。 3. **编码与解码**:处理HTTP请求和响应时,注意字符编码的一致性,避免乱码问题。 4. **资源释放...
在实际应用中,Servlet可能会遇到各种特殊的处理情况,这些情况涵盖了错误处理、会话管理、多线程问题、安全性等多个方面。下面,我们将详细探讨Servlet请求响应的特殊处理。 1. **错误处理**: - ` ...
- 解释一下Servlet的单线程模型和多线程模型。 - 如何实现Servlet的会话跟踪? - 举例说明Filter和Listener的应用场景。 掌握这些知识点对于理解Servlet以及在面试中脱颖而出至关重要。同时,对于SSH框架的理解...
Servlet3.1还鼓励实现微容器概念,允许在轻量级环境中部署和运行Servlet,如嵌入式Tomcat或Jetty,便于单元测试和集成测试。 以上就是Servlet3.1规范中的一些核心知识点,它们极大地提升了Java Web应用的开发效率...
* 如何实现 servlet 的单线程模式 * servlet 的配置 五、EJB * EJB 容器提供的服务 * EJB 的角色和三个对象:Remote(Local)接口、Home(LocalHome)接口、Bean 类 * EJB 的几种类型:会话(Session)Bean、实体...
Servlet容器(如Tomcat)默认采用单实例多线程模式来处理请求,这种模式减少了创建和销毁Servlet实例的开销,提高了对请求的响应速度。通过调整Tomcat的配置(如`<Connector>`元素),可以定制线程池的大小,以适应...
此外,Servlet还可以通过Session管理用户会话,通过Filter实现请求和响应的拦截,以及使用MVC模式解耦业务逻辑。 8. **现代Web框架中的Servlet** 虽然现代Web开发中已经出现了很多高级框架,如Spring MVC、Struts...