Survey
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
* Your assessment is very important for improving the work of artificial intelligence, which forms the content of this project
Bean Scripting Framework.
曾俊雄
What is Scripting Language
Broader definition:
all languages
Narrower definition:
those programming languages requiring
no compilation or with implicit compilation
For example: JavaScript
source:
http://zh.wikipedia.org/wiki/JavaScript
Why Scripting Languages?
simplicity
real time
most scripting languages have good UI
integration
plenty of choices
Where to Use Scripting
Languages?
integrated with UI languages, e.x., html
vs. JavaScript
event-based scenarios, e.x., XSLT vs.
xpath
programming with less ability but more
simplicity, e.x., JSP
Drawbacks
Performance!!
Java + Scripting Language
Background
Java performs better, but more
complicated in syntax and requires
compilation
Scripting languages (e.x., JavaScript) are
much slower (almost 1000x), but much
easier in syntax and requires no
compilation
Java + Scripting language is a good
compromise
use java in major part
use scripting language for some
customizable parts
but how?
byte code
JVM
script
Scripting Engine
However, different scripting
engines have different
interfaces……
load scripting engine
with JVM, and pass
scripting parts into the
scripting engine.
Bean Scripting Framework
Actually, there is a plan to add
common scripting interface into JVM
with JavaSE 7.0
but when can we have JavaSE 7.0 ?!
Now, we have apache bean scripting
framework
http://jakarta.apache.org/bsf/
BSFManager
BSFEngine
JRubyEngine
JavaScriptEngine
PythonEngine
……
Usage
Register script engine to BSFManager
Create an instance of BSFManager
BSFManager.registerScriptingEngine("ruby",
"org.jruby.javasupport.bsf.JRubyEngine", new String[]{"rb"});
BSFManager manager=new BSFManager();
Load registered script engine from the
manager
engine=manager.loadScriptingEngine("ruby");
Execute the scripting code, so it is kept
in the memory
engine.exec("ruby", 0, 0, “……script code……”);
Call target method declared in the
scripting code
engine.call(null, "actionPerformed", new java.lang.Object[]{self, arg0});
This is Ruby!!
Why use Ruby?
Simple yet powerful
exactly the same expressive power with
java
good bridging with jvm
http://jruby.codehaus.org/
Language Constructs
require 'java'
load java support
module Java
include_package "java.lang"
include_package "javax.swing"
include_package "util.ws"
include_package "java.util"
end
import java.lang.*;
import javax.swing.*;
import util.ws.*;
import java.util.*;
define function
def actionPerformed(caller, actionEvent)
if actionEvent.getActionCommand()=="HelloWorld"
Java::JOptionPane.showMessageDialog(caller, "HelloWorld")
elsif actionEvent.getActionCommand()=="HelloWS"
response=Java::WebServiceClient.send("http://localhost:8084/SpringWSTest/services", "<sayHello
xmlns=\"HelloWorld\"/>")
Java::JOptionPane.showMessageDialog(caller, response)
elsif actionEvent.getActionCommand()=="HelloSoapHeaders"
props=Java::HashMap.new
props.put("{ns1}key1","value1")
props.put("{ns2}key2",['_value1','_value2','_value3'].to_java)
response=Java::WebServiceClient.send("http://localhost:8084/SpringWSTest/services", "<sayHello
xmlns=\"HelloWorld\"/>", props)
Java::JOptionPane.showMessageDialog(caller, response)
end
end
require 'java'
load java support
module Java
include_package "java.lang"
include_package "javax.swing"
include_package "util.ws"
include_package "java.util"
end
import java.lang.*;
import javax.swing.*;
import util.ws.*;
import java.util.*;
define function
def actionPerformed(caller, actionEvent)
if actionEvent.getActionCommand()=="HelloWorld"
Java::JOptionPane.showMessageDialog(caller, "HelloWorld")
elsif actionEvent.getActionCommand()=="HelloWS"
response=Java::WebServiceClient.send("http://localhost:8084/SpringWSTest/services",
"<sayHello xmlns=\"HelloWorld\"/>")
Java::JOptionPane.showMessageDialog(caller, response)
elsif actionEvent.getActionCommand()=="HelloSoapHeaders"
props=Java::HashMap.new
props.put("{ns1}key1","value1")
props.put("{ns2}key2",['_value1','_value2','_value3'].to_java)
response=Java::WebServiceClient.send("http://localhost:8084/SpringWSTest/services", "<sayHello
xmlns=\"HelloWorld\"/>", props)
Java::JOptionPane.showMessageDialog(caller, response)
end
end