Во второй части, я всего лишь сделаю вызов событий на groovy более универсальным и буду использовать для этого способа, хранения событий в файлах, а не в БД. Это удобно когда действительно начнется разработка и нужен будет контроль версий кода, поиск по текстам, merge кода и прочее.
Для запуска groovy кода из файла будем использовать "GroovyScriptEngine".
На кнопке вызова события поместим два атрибута имя файла скрипта и имя метода в скрипте.
Для запуска groovy кода из файла будем использовать "GroovyScriptEngine".
На кнопке вызова события поместим два атрибута имя файла скрипта и имя метода в скрипте.
<af:commandToolbarButton text="Calculate" id="ctbCalc" actionListener="#{myBean.runScript}"> <f:attribute name="script" value="calc.groovy"/> <f:attribute name="method" value="onCalc"/> </af:commandToolbarButton>
а в бине на событии кнопки получим эти параметры и запустим скрипт
public void runScript(ActionEvent actionEvent) { Object script = actionEvent.getComponent().getAttributes().get("script"); Object method = actionEvent.getComponent().getAttributes().get("method"); if(script!=null){ ScriptHost sh = getScriptHost(); sh.invokeMethod((String)script, (String)method); } }
Вот так выглядит выполнение скрипта
public class ScriptHost { private GroovyScriptEngine gse; private String[] roots = new String[] { "C:\\Temp\\Script" }; public void invokeMethod(String script, String method) { try { Script createScript = gse.createScript(script, binding); Object[] args = { }; createScript.invokeMethod(method, args); } catch (ResourceException e) { System.out.println(e); } catch (ScriptException e) { System.out.println(e); } }
Так же в скрипте используются глобальнае объекты "model и bindings " переданные из java.
Скрипт: C:\Temp\Script\calc.groovy
def foo(value) { println "Calling function foo() with param ${value}"; } def onCalc(value) { println "Calling function onCalc!"; def emp = model.getEmployeesView(); def row = emp.first(); while(row != null){ println row.getAttribute('LastName'); row.setAttribute('Salary', row.getAttribute('Salary') * bindings.getAttrValue('param1') ); row = emp.next(); } }
Форма
Источник
A dynamic language for the Java platform
http://groovy.codehaus.org/
http://groovy.codehaus.org/
Комментариев нет:
Отправить комментарий