一、插件类
/** * 使用Struts2的Plugin机制可以很容易的扩展我们的Application, * Struts2扩展点主要包括JavaBeans、Actions、Interceptors、Results等。 */ public interface MyPlugin { public String say(); }
public class MyPluginImpl implements MyPlugin { public String say() { return "I say"; } }
二、打包插件类
将插件类打包成一个独立的jar文件,在jar文件的根目录下还必须添加一个文件名为struts-plugin.xml的xml文件,该xml文件的内容如下:
<?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" "http://struts.apache.org/dtds/struts-2.0.dtd"> <struts> <bean type="com.cjm.struts2.plugins.plugin1.MyPlugin" name="myplugin" class="com.cjm.struts2.plugins.plugin1.MyPluginImpl" /> </struts>
将该jar文件放到web项目的lib目录下即可使用该插件了。在加载时struts2框架会搜寻根目录中存在struts-plugin.xml文件的Jar文件。
bean属性说明:
type属性:指明了插件的接口
class属性:指明了实现类
name属性指明了bean的名字
ant打包脚本:
<?xml version="1.0" encoding="gb2312"?> <project name="jar" default="jar" basedir="."> <target name="jar"> <jar destfile="${basedir}/myplugin_1.0.jar" basedir="${basedir}/bin"/> </target> </project>
三、使用插件
public class HelloWorld extends ActionSupport { private Set<MyPlugin> plugins = new HashSet<MyPlugin>(); public String show() throws Exception { for(MyPlugin plugin: plugins){ System.out.println(plugin.say()); } return SUCCESS; } /** * 通过@Inject注解可以获得Container的引用 * 通过Container可以获得Plugin对象实例 */ @Inject public void setContainer(Container container) { Set<String> names = container.getInstanceNames(MyPlugin.class); for(String s: names){ plugins.add(container.getInstance(MyPlugin.class, s)); } } }
四、获取插件中的常量值
@Inject("com.cjm.struts2.plugins.constant1") public void setConstant(String constant) { this.constant = constant; }