java - servlet的使用比struts2中的action-classes好吗?

标签 java multithreading jakarta-ee servlets struts2

众所周知,Servlet 为各自的请求 使用单独的线程,这提高了服务器的效率。 而在 struts2 框架中,每个映射的 Action-Class 都有自己的对象,这些对象是为各自的请求创建的。

现在,与普通 servlet 中的线程相比,在 struts2 中拥有单独的对象是一种(优化的)好习惯吗?我们为什么不只使用 servlet!?

最佳答案

当请求进入 Web 容器时,容器会从线程池中获取一个线程来执行请求。处理完请求后,线程会返回到池中以供后续请求使用。多个请求可以并行处理,因为池中有多个线程可用。

您在 Web 应用程序中声明的每个 servlet 仅由 Web 容器实例化一次。因此,多个并发线程使用每个 servlet 的单个实例。这就是为什么您的 servlet 必须是线程安全的。

Struts 对上述内容没有任何改变。它的作用是定义一个处理所有 请求的 servlet 或过滤器。对于每个针对给定操作路径的请求,都会创建一个新的 Struts Action 实例。这是带有 servlet 的模型的不同之处。一个 servlet 是一个单例(所有请求只有一个实例),而一个新的 Struts Action 是为每个请求实例化的。

优点是操作不需要是线程安全的,因为它只被一个线程使用,然后被丢弃。它可以包含中间状态而不需要任何同步。缺点是创建了许多实例。但由于 Java 垃圾收集器在回收 Struts 操作等短期对象时速度非常快,因此在实践中不会造成任何问题。

关于java - servlet的使用比struts2中的action-classes好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13203731/

相关文章:

java - 编码和解码 byteValue、intValue、shortValue、hashCode、longValue

java - Hibernate 惰性初始化异常

c - errno 是线程安全的吗?

multithreading - 如何在 Outlook 2007 加载项中高效运行后台任务?

java - 如果只是为了搜索,是否值得将实体放在 @Transactional 服务层下?

jakarta-ee - 在 servlet 的 doget() 方法中调用 init()

java - 具有多值的 map

Java 小服务程序 : Best Way to Determine if request is AJAX

swift - 在 Swift 中调度两个独立的异步线程

java - Apache Camel 转义双花括号