我正在阅读Struts 1.x的一些博客,发现每个Web应用程序只有一个操作servlet实例,每个Web应用程序模块只有一个请求处理器实例。
有人可以解释一下我的应用程序模块究竟是什么意思吗?或者我们如何为应用程序模块配置请求处理器?
答案 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配置文件?
为每个模块创建单独的Struts配置文件 -
/WEB-INF/struts-config-moduleA.xml
/WEB-INF/struts-config-moduleB.xml
配置模块的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>
我不确定这是否能回答你的问题,但这可能对你有用。
如果要扩展RequestProcessor类,则需要做两件事 -
扩展RequestProcessor类。示例 -
public class CustomRequestProcessor extends RequestProcessor{
// Do whatever you want
}
在struts-config.xml中为控制器创建一个条目,例如 -
<controller contentType="text/html;charset=UTF-8" locale="true"
processorClass="fully qualified custom request processor class name" />