《研磨struts2》第十八章 结合JFreeChart 之 18.2 Struts2插件概述

        Struts2并没有求大求全,企图把所有的功能都包含进来,而是设计了一个灵活、可扩展的插件体系,让所有的人都可以以做插件的方式,为Struts2添加新的功能,这也是Struts2非常吸引人的地方之一。

来简单的认识一下Struts2的插件。打开Struts2 下载包中的lib目录struts-2.1.8.1\lib,会发现,这里面以struts2作为文件名开头的文件可以被分成两类,一类是Struts2的核心包,比如struts2-core-2.1.8.1.jar;而其他的都叫struts2-xxx-plugin-2.1.8.1.jar,很显然,后者都是Struts2的插件。

       这些插件的存在形式就是普通的jar包,看起来和其他jar包也没什么区别,但是,如果打开来看,就发现内藏玄机了。打开看看,会发现,只要是插件的jar包,其根目录下都有一个叫struts-plugin.xml的文件,里面有这个插件相应的配置。

       以struts2-jfreechart-plugin-2.1.8.1.jar中的struts-plugin.xml为例来观察一下,示例如下:

 

java代码:
  1. <?xml version="1.0" encoding="UTF-8" ?>  
  2. <!DOCTYPE struts PUBLIC  
  3.     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"  
  4.     "http://struts.apache.org/dtds/struts-2.0.dtd">  
  5.       
  6. <struts>  
  7.     <package name="jfreechart-default" extends="struts-default">  
  8.         <result-types>  
  9.             <result-type name="chart" class="org.apache.struts2.dispatcher.ChartResult">  
  10.                 <param name="height">150</param>  
  11.                 <param name="width">200</param>  
  12.             </result-type>  
  13.         </result-types>  
  14.     </package>  
  15. </struts>  

               仔细看一下,根元素为<struts>,<struts>元素中有一个<package>元素,而<package>元素中有一个<result-types>子元素,而<result-types>子元素中有一个<result-type>子元素。

       好像很熟悉啊。没错,其实这个struts-plugin.xml实际上就是个struts.xml,因此我们也可以在自己的配置文件里这样写。

       至此,可以看到Struts2插件的存在方式:

  • 命名规则为struts2-xxx-plugin-版本号.jar
  • 存在形式就是一个普通的jar包。
  • 这个jar包的根目录必须存在一个叫struts-plugin.xml,而其本质就是一个struts.xml。

而使用Struts2插件的时候,只需要把这个jar包拷贝到web工程的编译路径上即可。

18.2.2 Struts2插件的加载顺序和作用

在启动web容器的时候,Struts2有一个运行时配置,它会按照以下顺序加载配置文件:

  • struts-default.xml这个文件应该在核心包中,也就是struts2-core-版本号.jar中,通常有一个。
  • struts-plugin.xml这种文件应该在所有的插件包中,也就是以struts2-xxx-plugin-版本号.jar,通常会有多个。
  • struts.xml这个文件应该在我们的web应用的classpath根目录上有一个。

通常情况下,插件的配置文件优先于我们的配置文件加载,因此,我们可以像引用struts-default 包一样来引用struts-plugin.xml文件中的其他包。

       比如,有了上面的那个JFreeChart插件的struts-plugin.xml后,我们的<package>元素只要继承插件中的包,就可以任意使用这个包内的任意资源,如下示例:

 

java代码:
  1. <package name="sample" namespace="/sample" extends="jfreechart-default">  
  2.     <action name="sampleAction" class="cn.javass.action.SampleAction">  
  3.         <result type="chart"/>  
  4.     </action>  
  5. </package>  

这里注意两个要点:

  • 我们的包继承了jfreechart-default包,因此,我们的包中可以随意使用jfreechart-default包中的东西,在上面的例子中定义的<result type=”chart”>,就使用了jfreechart-default包中定义的的<result-type name=” chart”>。
  • Struts2的包在继承关系上是递归的, jfreechart-default包又继承自struts-default包,因此,我们的sample包也可以自由使用struts-default的东西。

插件就是以这种声明新包,然后在新包中声明新功能的方式,来简洁的加入到应用中,而且在插件中还可以通过声明来替换struts-default包中的默认行为。

 

私塾在线网站原创《研磨struts2》系列

转自请注明出处:【http://sishuok.com/forum/blogPost/list/0/4169.html

欢迎访问http://sishuok.com获取更多内容

猜你喜欢

转载自rubbing-struts2.iteye.com/blog/1569907