一、插件类
/**
* 使用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;
}