Web应用程序中可以存在多少个请求处理器实例?

时间:2014-12-03 14:50:24

标签: java struts-1

我正在阅读Struts 1.x的一些博客,发现每个Web应用程序只有一个操作servlet实例,每个Web应用程序模块只有一个请求处理器实例。

有人可以解释一下我的应用程序模块究竟是什么意思吗?或者我们如何为应用程序模块配置请求处理器?

1 个答案:

答案 0 :(得分:0)

在所有版本的Struts(包括1.1版)中,每个Web应用程序只能运行一个ActionServlet控制器servlet实例(即.war文件)。这是因为ActionServlet将框架配置的若干细节存储在Web应用程序范围内的变量中,这是应用程序的所有部分共享的范围。因此,尝试在同一Web应用程序中运行多个ActionServlet实例会导致问题,因为与一个实例关联的数据会覆盖与另一个实例关联的数据。

在1.1版之前,整个应用程序的配置必须驻留在单个Struts配置文件中。对于配置文件非常庞大且涉及多个开发人员的大型应用程序,这被证明是一个有争议的问题。

为了解决这个问题,在以后的版本中,struts通过使用模块将应用程序细分为谨慎的单元,提供了具有多个实例的功能。每个模块都有自己的Struts配置文件,自己的一组操作和转发,一个单独的URL命名空间,等等。本质上,模块就像主Struts应用程序中的mini-Struts应用程序。尽管在与模块相同的版本(1.1)中添加了多个配置文件,但无需将应用程序转换为模块使用。对多个配置文件的支持减轻了与使用Struts进行基于团队的大型开发相关的一些问题。但是,多个配置文件不会像模块那样对Struts应用程序进行分区。使用多个配置文件时,文件中的信息将合并为一组大量配置数据。但是,这可能会导致问题。例如,如果在一个文件中定义具有特定名称的操作,而另一个配置文件定义具有相同名称的另一个操作,则上次读取的配置文件将覆盖第一个文件的数据。基本上,最后一个胜利。模块没有这个问题,因为Struts分别存储每个模块的配置数据。在每个配置文件中,您可以使用控制器标记配置自定义请求处理器。

如何为每个模块创建Struts配置文件?

  1. 为每个模块创建单独的Struts配置文件 -

    /WEB-INF/struts-config-moduleA.xml
    /WEB-INF/struts-config-moduleB.xml

  2. 配置模块的web.xml部署描述符

    <!-- Action Servlet Configuration -->
    <servlet>
    <servlet-name>action</servlet-name>
    <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    <init-param>
       <param-name>config/moduleA</param-name>
       <param-value>/WEB-INF/struts-config-moduleA.xml</param-value>
     </init-param>
     <init-param>
        <param-name>config/moduleB</param-name>
        <param-value>/WEB-INF/struts-config-moduleB.xml</param-value>
      </init-param>
      <load-on-startup>1</load-on-startup>
      </servlet>
    
  3. 我不确定这是否能回答你的问题,但这可能对你有用。

    如果要扩展RequestProcessor类,则需要做两件事 -

    1. 扩展RequestProcessor类。示例 -

      public class CustomRequestProcessor extends RequestProcessor{
      // Do whatever you want
      }
      
    2. 在struts-config.xml中为控制器创建一个条目,例如 -

      <controller contentType="text/html;charset=UTF-8" locale="true" 
      processorClass="fully qualified custom request processor class name" />