铁手剑谱

上善若水
数据加载中……
Struts秘籍之第1段:第2.5式. 将应用重构为模块

第2.5式. 将应用重构为模块

问题

你想要将你的应用隔离为多个相对不同的子应用、或者模块,每一个都有其自己的单独的配置。

动作要领

除了默认模块的Struts 配置文件之外,为每一个模块创建一个单独的Struts 配置文件。然后使用ActionServlet的初始化参数在web.xml中声明每一个模块,如Example 2-11.

Example 2-11. ActionServlet 的多模块配置

 

<!-- Action Servlet Configuration -->
<servlet>
  
<servlet-name>action</servlet-name>
  
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
  
<init-param>
    
<param-name>config</param-name>
    
<param-value>/WEB-INF/struts-config.xml</param-value>
  
</init-param>
  
<init-param>
    
<param-name>config/module1</param-name>
    
<param-value>/WEB-INF/struts-config-module1.xml</param-value>
  
</init-param>
  
<init-param>
    
<param-name>config/module2</param-name>
    
<param-value>/WEB-INF/struts-config-module2.xml</param-value>
  
</init-param>
  
<load-on-startup>1</load-on-startup>
</servlet>

 

动作变化

Struts 1.1 引入了定义单独配置的子应用的能力,那就是模块(module)。Modules 引入到Struts 之中是为了解决将web应用分解为相对不同的,可管理的部分的问题。每一个module 都通过其自己的配置文件进行定义。每一个Struts 应用都隐含的具有一个默认module。默认module 没有名字。

附加的模块通过指定一个模块前缀来定义。前缀是Struts的ActionServlet的初始化参数中的config/后面紧跟的值。在Example 2-11中,定义了3个模块。第一个init-param元素定义了默认模块。第二个和第三个init-param元素分别建立了module1和module2。

Struts 预先为每一个通过在struts-config.xm文件中为每一个模块定义的声明来访问的URL准备模块前缀。这项规则也适用于全局转发,全局异常,action mapping,局部转发和局部以外中的path 属性。然而,module的 Struts 配置文件则不需要知道也不应该使用module 前缀。

通过Struts标签所产生的URL,比如通过html:link和html:rewrite,将包含module名称。这意味着包含模块前缀在你想要引用全局共享的Web资源比如图像和CSS时会很令人头痛。很多Web 应用通常都将所有图片放置在站点的顶层/images文件夹中。如果使用modules 并且使用html:img标签来显示这些图片,你必须为每一个模块创建一个单独的/images文件夹户或者设置html:img标签的module属性为空字符串("") 以指示默认的模块。

假定你想要为struts示例的MailReader应用创建一个管理的UI接口。需要在应用中加入一个管理模块,如下面的方式修改web.xml文件,其中第2个init-param元素就定义了admin模块:

  <!-- Action Servlet Configuration -->
  
<servlet>
    
<servlet-name>action</servlet-name>
    
<servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
    
<init-param>
      
<param-name>config</param-name>
      
<param-value>
        /WEB-INF/struts-config.xml,
        /WEB-INF/struts-config-registration.xml
      
</param-value>
    
</init-param>
    
<init-param>
      
<param-name>config/admin</param-name>
      
<param-value>/WEB-INF/struts-config-admin.xml</param-value>
    
</init-param>
    
<load-on-startup>1</load-on-startup>
  
</servlet>

使用module常犯的一个错误就是在你导航到包含模块前缀的URL的时候, Struts 将认为你是在模块之中。例如,你可能在应用的主页面提供了一个标准的HTML 链接(比如<a href . . . >) 到管理模块的index页面。如果用户选择该链接,它们会看到正确的页面。然而, Struts 所关心的是,用户仍然在默认模块中。为了在Struts 1.1 应用的模块之间切换,你必须通过一个特殊的action,SwitchAction来转发用户。在Struts 1.2中,产生链接和URL的Struts html标签已经支持module属性,这样你就可以显式地指定目标模块。

使用Struts 1.1 的模块机制有其缺点。注意不是所有的Struts 1.1标签都支持模块。所以,你可能会发现模块中的JSP页面并不能完全与它们属于的模块无关的情况下便写出来。使用模块的这些缺点都在Struts 1.2中被弥补了。因此,我推荐你只有在Struts1.2中才考虑使用模块。如果你必须使用Struts 1.1 并且你的应用仅仅是稍微有些复杂,你可以向要避免使用模块的矛盾,而使用子目录的方式来组织你的应用,并且使用第2.4中所讲的技术来将struts-config.xml文件进行分解。

相关招式

第2.4 将struts-config.xml文件分解为多个配置的技术。

第6.7 展示了在运行的Struts 应用的模块之间进行切换的技术。

posted on 2005-05-17 16:44 铁手 阅读(1354) 评论(1)  编辑  收藏 所属分类: JavaStruts系列

评论

# Struts 秘籍(CookBook)[TrackBack] 2005-11-12 18:29 阿泠

本系列源改编自O'Reily的Strus Cookbook
[引用提示]阿泠引用了该文章, 地址: http://blog.donews.com/inclear/archive/2005/11/12/624363.aspx
  回复  更多评论    

只有注册用户登录后才能发表评论。


网站导航: