JavaAction

1.JavaAction

    X-Meta引擎是使用Java编写的,执行模型最终执行的是Java程序,通过JavaAction可以调用Java程序,JavaAtion就是模型和Java之间的桥梁。

2.调用JavaAction的方式

    名字为JavaAction的模型都可以当作JavaAction模型,比如在XWorker中JavaAction的模型是xworker.lang.actions.JavaAction。

1.1.调用Java类库中的Java方法

     可以调用Java项目中的Java方法,比如Jar中的Java程序等。

1.2.在模型中编写Java代码

    可以在模型中直接编写Java代码,这些代码会被动态编译和加载。

1.3.Java代码和模型放在一起

    可以在模型目录下编写Java代码,这些代码也会被动态编译和加载。

    通常我们建议使用第一种方式,即Java代码在Java项目里编写,而在模型中使用Groovy等脚本更方便。

3.Java代码规范

3.1.pubic static Object xxx(ActionContext actionContext)

    只有一个固定ActionContext参数的Java静态方法可以被调用。调用该方法时不会实例化方法所属的类的实例。

3.2.使用注解

    执行非静态的Java方法时会实例化对象,此时可以使用注解。如下面的示例。

package xworker.ide;

import org.eclipse.swt.browser.Browser;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
import org.xmeta.ActionContext;
import org.xmeta.Thing;
import org.xmeta.World;
import org.xmeta.annotation.ActionClass;
import org.xmeta.annotation.ActionField;
import org.xmeta.annotation.ActionParams;

@ActionClass(creator="newInstance")
public class TestJavaActionAnnotation {
	@ActionField(name="shell")
	Shell shellAbc;
	
	@ActionField
	Browser browser;
		
	@ActionParams(names="urlText")
	public void urlTextSelection(Text urlText, ActionContext actionContext) {
		browser.setUrl(urlText.getText());
	}
	
	public void okSelection(ActionContext actionContext) {
		System.out.println("okButton session ");
	}
	
	public void cancelSelection() {
		System.out.println("cancelButton session ");
		shellAbc.dispose();
	}
	
	public static Object newInstance(ActionContext actionContext) {
		return new TestJavaActionAnnotation();
	}
	
	public static void main(String[] args) {
		try {
			
			World world = World.getInstance();			
			world.init("./xworker/");
			
			Thing thing = World.getInstance().getThing("_local.test.core.actions.javaaction.TestAnnotation");
			thing.doAction("run");
			
		}catch(Exception e) {
			e.printStackTrace();
		}
	}	
}
  • @ActionClass
    creator属性用来指明实例化对象的静态方法,该静态方法参数固定为ActionContext。如果没有ActionClass注解,那么调用class.newInstance()来实例化对象。
     
  • @ActionField
    用在属性上,实例化对象时,从变量上下文获取变量对该属性赋值。其中name属性是变量上下文中变量的名称,如果和字段同名,那么可以忽略不用设置。   
     
  • @ActionParams
    用于从变量上下文中获取函数的参数变量,names属性是参数在变量上下文中的变量名称,如有多个使用英文逗号分隔,注意参数的顺序。如果最后一个参数是ActionContext,则可以不用设置。       
           

    测试模型的代码。

<?xml version="1.0" encoding="utf-8"?>

<Shell name="shell" descriptors="xworker.swt.widgets.Shell" text="测试Annotation" width="800"
     height="600" label="TestAnnotation">
    <GridLayout name="shellGridLayout"></GridLayout>
    <Text name="urlText" BORDER="true">
        <GridData name="GridData" style="FILL_HORIZONTAL"></GridData>
        <Listeners>
            <Listener type="DefaultSelection">
                <JavaAction name="okSelection" outerClassName="xworker.ide.TestJavaActionAnnotation"
                     methodName="urlTextSelection"></JavaAction>
            </Listener>
        </Listeners>
    </Text>
    <Browser name="browser" _xmeta_id_="browsre">
        <GridData name="browserGridData" style="FILL_BOTH"></GridData>
    </Browser>
    <Composite name="buttonComposite" _xmeta_id_="1264">
        <GridData name="buttonCompositeGridData" _xmeta_id_="1265" style="FILL_HORIZONTAL"
             horizontalAlignment="END"></GridData>
        <RowLayout name="buttonCompositeRowLayout" _xmeta_id_="1266"></RowLayout>
        <Button name="okButton" _xmeta_id_="1267" text="Ok">
            <RowData name="RowData" _xmeta_id_="1268" width="80"></RowData>
            <Listeners _xmeta_id_="1269">
                <Listener name="okButtonSelection" _xmeta_id_="1270">
                    <JavaAction name="okSelection" outerClassName="xworker.ide.TestJavaActionAnnotation"
                         methodName="okSelection"></JavaAction>
                </Listener>
            </Listeners>
        </Button>
        <Button name="cancelButton" _xmeta_id_="1271" text="Cancel">
            <RowData name="RowData" _xmeta_id_="1272" width="80"></RowData>
            <Listeners _xmeta_id_="1273">
                <Listener name="cancelButtonSelection" _xmeta_id_="1274">
                    <JavaAction name="okSelection" outerClassName="xworker.ide.TestJavaActionAnnotation"
                         methodName="cancelSelection"></JavaAction>
                </Listener>
            </Listeners>
        </Button>
    </Composite>
</Shell>

 

Copyright ©  2007-2017 XWorker.org  版权所有

沪ICP备08000575号