~ubuntu-branches/ubuntu/karmic/rhino/karmic

« back to all changes in this revision

Viewing changes to docs/embedding-engine.html

  • Committer: Bazaar Package Importer
  • Author(s): Jerry Haltom
  • Date: 2005-03-19 16:56:07 UTC
  • mto: (11.1.1 squeeze)
  • mto: This revision was merged to the branch mainline in revision 3.
  • Revision ID: james.westby@ubuntu.com-20050319165607-geu3j3fnqlkpqkh1
Tags: upstream-1.6.R1
Import upstream version 1.6.R1

Show diffs side-by-side

added added

removed removed

Lines of Context:
1
 
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
2
 
<html>
3
 
<head>
4
 
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
5
 
   <meta name="Generator" content="Microsoft Word 97">
6
 
   <meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; U) [Netscape]">
7
 
   <title>Embedding �Scripting Host� in Business Applications</title>
8
 
</head>
9
 
<body link="#0000FF">
10
 
<b><font face="Arial"><font size=-1>Embedding
11
 
�Scripting Host� in Business Applications</font></font></b>
12
 
<p><b><font face="Arial"><font size=-1>Madhukumar Seshadri, <a href="http://www.cognizant.com)/">www.cognizant.com</a></font></font></b>
13
 
<br>&nbsp;
14
 
<br>&nbsp;
15
 
<p><font face="Arial"><font size=-1>With web browsers, continuing to rule
16
 
the human interface for applications, creating value by being ubiquitous,
17
 
few adoptions of rich technology that�s getting brewed underneath, will
18
 
help designing business applications even though most of the current ones
19
 
are made with bird�s eye of the underlying technologies.</font></font>
20
 
<p><font face="Arial"><font size=-1>JavaScript is a scripting language
21
 
invented and developed by Netscape. The language was primarily designed
22
 
for creating lightweight programming for web browser extensions by exposing
23
 
the Document Object Model of an HTML page to the scripts. JavaScript is
24
 
becoming object oriented and getting adopted for server-side scripting.</font></font>
25
 
<p><font face="Arial"><font size=-1>JavaScript is also becoming a standard
26
 
in the scripting world as Netscape is working closely with ECMA (European
27
 
Computer Manufacturers Association) to make it as a standard scripting
28
 
language for the script world. The standards are published as ECMA Script.</font></font>
29
 
<p><font face="Arial"><font size=-1>JavaScript originally designed for
30
 
exposing the DOM (Document Object Model) standardized by World Wide Web
31
 
consortium (W3C), to help web page designers to control and manipulate
32
 
the pages dynamically. �JavaScript� engines were embedded in the browsers
33
 
and they execute those portions of the code embedded in the HTML pages.</font></font>
34
 
<p><font face="Arial"><font size=-1>In short, JavaScript engine embedded
35
 
in the browser allowed extensions or manipulations for DOM Object run time
36
 
for the HTML page by executing the �scripts� associated with them. In other
37
 
words, browser exposes its DOM object for the page to scripts for extensions
38
 
and dynamic manipulations of the same, using a language that the script
39
 
interpreter understands.</font></font>
40
 
<p><font face="Arial"><font size=-1>Can I do the same for my application
41
 
by exposing my custom business objects written in my middle-tier? Can I
42
 
allow user to my write JavaScript extensions for my objects and also be
43
 
host for executing those scripts?</font></font>
44
 
<p><font face="Arial"><font size=-1>JavaScript host runs times are available
45
 
as binaries written in major languages. Check out <a href="http://www.mozilla.org/js">www.mozilla.org/js</a>.
46
 
Spider Monkey and Rhino are open source JavaScripting engines available
47
 
from mozilla.</font></font>
48
 
<p><font face="Arial"><font size=-1>Microsoft implementation of ECMA Script
49
 
(ECMA Script is based on core JavaScript, created by Netscape) is called
50
 
JScript. Microsoft binaries of jscript engine can be downloaded from http://msdn.microsoft.com/scripting/.</font></font>
51
 
<p><font face="Arial"><font size=-1>This document doesn�t explain the JavaScript
52
 
language in detail but explains how these scripting engines can be used
53
 
as host to expose business objects in the middle-tier and how the user
54
 
of these applications can extend it if needed using JavaScript.</font></font>
55
 
<p><font face="Arial"><font size=-1>The scripting engine Rhino (<a href="http://www.mozilla.org/js)">www.mozilla.org/rhino)</a>,
56
 
a javascript engine purely written in Java is one that I am going to use
57
 
for the testing the above.</font></font>
58
 
<p><font face="Arial"><font size=-1>Let us set some simple goals,</font></font>
59
 
<ul>
60
 
<li>
61
 
<font face="Arial"><font size=-1>Execute a plain �JavaScript� code and
62
 
use static Java object</font></font></li>
63
 
 
64
 
<li>
65
 
<font face="Arial"><font size=-1>Instantiate external objects (written
66
 
in Java) from the script and use them within the script</font></font></li>
67
 
</ul>
68
 
 
69
 
<br>&nbsp;
70
 
<br>&nbsp;
71
 
<p><font face="Arial"><font size=-1>Let us write a simple Javscript to
72
 
test the above set goals,</font></font>
73
 
<p><font face="Arial"><font size=-1><b>Fig 1</b> � jshosttest.js</font></font>
74
 
<p><b><i><font face="Arial"><font size=-1>/* Test 1 */</font></font></i></b>
75
 
<br><b><i><font face="Arial"><font size=-1>/* Use a static Java Object
76
 
in the script */</font></font></i></b>
77
 
<p><font face="Arial"><font size=-1>function test1() {</font></font>
78
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; var str;</font></font>
79
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; str = '"Hello World";</font></font>
80
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; return str;</font></font>
81
 
<br><font face="Arial"><font size=-1>}</font></font>
82
 
<p><font face="Arial"><font size=-1>var str = test1( );</font></font>
83
 
<br><font face="Arial"><font size=-1>//out is expected to be Java Object
84
 
exposed to the script scope</font></font>
85
 
<br><font face="Arial"><font size=-1>out.println ("JavaScript - Test 1
86
 
- " + str);</font></font>
87
 
<p><b><i><font face="Arial"><font size=-1>/* Test 2 */</font></font></i></b>
88
 
<p><b><i><font face="Arial"><font size=-1>/* Instantiate a Javaobject for
89
 
this scope and use it */</font></font></i></b>
90
 
<p><font face="Arial"><font size=-1>function test2(){</font></font>
91
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; // create a Java
92
 
string buffer object from JavaScript and use its java instance</font></font>
93
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; // This uses an
94
 
another Java object created for creating new objects within Java and</font></font>
95
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; // brings the same
96
 
for JavaScript execution scope</font></font>
97
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; // Refer _create.java
98
 
for more information</font></font>
99
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; create.getInstance("java.lang.StringBuffer","buffer");</font></font>
100
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; //JavaScript refers
101
 
the java object instance as �buffer�</font></font>
102
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; out.println(buffer.toString());</font></font>
103
 
<br>&nbsp;&nbsp;&nbsp; <font face="Arial"><font size=-1>buffer.append("I
104
 
am a javaobject dynamically created and executed in JavaScript");</font></font>
105
 
<br>&nbsp;&nbsp;&nbsp; <font face="Arial"><font size=-1>return buffer.toString();</font></font>
106
 
<br><font face="Arial"><font size=-1>}</font></font>
107
 
<p><font face="Arial"><font size=-1>var str = test2();</font></font>
108
 
<br><font face="Arial"><font size=-1>out.println("From JavaScript - Test
109
 
2 " + str);</font></font>
110
 
<p><font face="Arial"><font size=-1>Let us write a simple Javahost Object
111
 
using the Rhino engine to execute the above script,</font></font>
112
 
<p><b><font face="Arial"><font size=-1>Fig 2.1 - JSHost.java</font></font></b>
113
 
<p><font face="Arial"><font size=-1>/**</font></font>
114
 
<br><font face="Arial"><font size=-1>* @author Madhukumar Seshadri</font></font>
115
 
<br><font face="Arial"><font size=-1>* @version</font></font>
116
 
<br><font face="Arial"><font size=-1>*/</font></font>
117
 
<p><font face="Arial"><font size=-1>import org.mozilla.javascript.*;</font></font>
118
 
<br><font face="Arial"><font size=-1>import java.io.*;</font></font>
119
 
<br><font face="Arial"><font size=-1>import java.lang.*;</font></font>
120
 
<br><i><font face="Arial"><font size=-1>// import com.xxx.xxx.*;</font></font></i>
121
 
<p><font face="Arial"><font size=-1>public class JSHost extends Object
122
 
{</font></font>
123
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; /** Creates new
124
 
JSHost */</font></font>
125
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; public JSHost()
126
 
{</font></font>
127
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; }</font></font>
128
 
<p><i><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; /*** Executes
129
 
.js file ***/</font></font></i>
130
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; public Object executeJS
131
 
(String jsfname){</font></font>
132
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; //You can also
133
 
use evaluateReader</font></font>
134
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; File fp = new File(jsfname);</font></font>
135
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; String str_buff
136
 
=null;</font></font>
137
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; try {</font></font>
138
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
139
 
FileReader fr = new FileReader(jsfname);</font></font>
140
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
141
 
int length = (int) fp.length();</font></font>
142
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
143
 
char cbuff[] = new char[(char)length];</font></font>
144
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
145
 
fr.read(cbuff);</font></font>
146
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
147
 
str_buff = new String(cbuff);</font></font>
148
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; } catch(Exception
149
 
e) {</font></font>
150
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
151
 
e.printStackTrace();</font></font>
152
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; }</font></font>
153
 
<p><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; //Execute the .js
154
 
file content</font></font>
155
 
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; return executeJSSource(str_buff);</font></font>
156
 
<br><font face="Arial"><font size=-1>}</font></font>
157
 
<p><i><font face="Arial"><font size=-1>/*** Executes javascript source
158
 
***/</font></font></i>
159
 
<br><font face="Arial"><font size=-1>public Object executeJSSource (String
160
 
jsbuff){</font></font>
161
 
<br><font face="Arial"><font size=-1>Object any=null;</font></font>
162
 
<br><font face="Arial"><font size=-1>try{</font></font>
163
 
<br><i><font face="Arial"><font size=-1>//Enter the Context</font></font></i>
164
 
<br><font face="Arial"><font size=-1><i>// Refer </i><u><font color="#0000FF">http://www.mozilla.org/js/rhino/tutorial.html</font></u></font></font>
165
 
<br><font face="Arial"><font size=-1>Context context = Context.enter();</font></font>
166
 
<br><i><font face="Arial"><font size=-1>// Get the execution scope</font></font></i>
167
 
<br><font face="Arial"><font size=-1>Scriptable scope = context.initStandardObjects(null);</font></font>
168
 
<p><i><font face="Arial"><font size=-1>//----------- For Test 1 - Get System.out
169
 
in scope</font></font></i>
170
 
<br><font face="Arial"><font size=-1>//Scriptable jObj1 = Context.toObject(System.out,
171
 
scope);</font></font>
172
 
<br><font face="Arial"><font size=-1>scope.put("out", scope, jObj1);</font></font>
173
 
<p><i><font face="Arial"><font size=-1>//------------ For Test 2 - Instantiate
174
 
Create Object and get that in scope</font></font></i>
175
 
<br><i><font face="Arial"><font size=-1>//Allow JScript to create Java
176
 
Objects</font></font></i>
177
 
<br><i><font face="Arial"><font size=-1>//Bring the _create object to context</font></font></i>
178
 
<br><font face="Arial"><font size=-1>_create create = new _create( );</font></font>
179
 
<br><i><font face="Arial"><font size=-1>//Register this context and scope
180
 
to this create object instance</font></font></i>
181
 
<br><font face="Arial"><font size=-1>create.registerContext(context,scope);</font></font>
182
 
<br><font face="Arial"><font size=-1>//Scriptable jObj2 = Context.toObject(_create,
183
 
scope);</font></font>
184
 
<br><font face="Arial"><font size=-1>scope.put("create",scope,create);</font></font>
185
 
<br><i><font face="Arial"><font size=-1>//Evaluate (or execute js)</font></font></i>
186
 
<br><font face="Arial"><font size=-1><i>//Refer </i><u><font color="#0000FF">http://www.mozilla.org/js/rhino/tutorial.html</font></u></font></font>
187
 
<br><font face="Arial"><font size=-1>any = context.evaluateString(scope,
188
 
jsbuff, "", 1, null);</font></font>
189
 
<br><i><font face="Arial"><font size=-1>//Exit the Context</font></font></i>
190
 
<br><font face="Arial"><font size=-1>context.exit( );</font></font>
191
 
<br><font face="Arial"><font size=-1>}</font></font>
192
 
<p><font face="Arial"><font size=-1>catch ( JavaScriptException jse) {</font></font>
193
 
<br><font face="Arial"><font size=-1>jse.printStackTrace();</font></font>
194
 
<br><font face="Arial"><font size=-1>}</font></font>
195
 
<p><font face="Arial"><font size=-1>return any;</font></font>
196
 
<p><font face="Arial"><font size=-1>}</font></font>
197
 
<p><font face="Arial"><font size=-1>}</font></font>
198
 
<br>&nbsp;
199
 
<br>&nbsp;
200
 
<p><font face="Arial"><font size=-1>Let us write a class for creating new
201
 
Java objects and bringing them to this script execution scope,</font></font>
202
 
<p><b><font face="Arial"><font size=-1>Fig 2.2 � _create.java</font></font></b>
203
 
<p><i><font face="Arial"><font size=-1>/**</font></font></i>
204
 
<p><i><font face="Arial"><font size=-1>* @author Madhukumar</font></font></i>
205
 
<p><i><font face="Arial"><font size=-1>*/</font></font></i>
206
 
<p><font face="Arial"><font size=-1>import java.lang.Class;</font></font>
207
 
<p><font face="Arial"><font size=-1>import org.mozilla.javascript.*;</font></font>
208
 
<p><font face="Arial"><font size=-1>public class _create extends Object
209
 
{</font></font>
210
 
<p><font face="Arial"><font size=-1>static Context ptr = null;</font></font>
211
 
<p><font face="Arial"><font size=-1>static Scriptable scope =null;</font></font>
212
 
<p><font face="Arial"><font size=-1>public _create () { }</font></font>
213
 
<p><font face="Arial"><font size=-1>public void registerContext(Context
214
 
cptr, Scriptable sc){</font></font>
215
 
<p><font face="Arial"><font size=-1>ptr = cptr;</font></font>
216
 
<p><font face="Arial"><font size=-1>scope = sc;</font></font>
217
 
<p><font face="Arial"><font size=-1>}</font></font>
218
 
<p><font face="Arial"><font size=-1>public void getInstance(String classname,String
219
 
jsclassname) {</font></font>
220
 
<p><font face="Arial"><font size=-1>Object any=null;</font></font>
221
 
<p><font face="Arial"><font size=-1>try {</font></font>
222
 
<p><font face="Arial"><font size=-1>Class thisclass = Class.forName(classname);</font></font>
223
 
<p><font face="Arial"><font size=-1>any = thisclass.newInstance();</font></font>
224
 
<p><font face="Arial"><font size=-1>}</font></font>
225
 
<p><font face="Arial"><font size=-1>catch(Exception e){</font></font>
226
 
<p><font face="Arial"><font size=-1>e.printStackTrace();</font></font>
227
 
<p><font face="Arial"><font size=-1>}</font></font>
228
 
<p><font face="Arial"><font size=-1>if( ptr != null) {</font></font>
229
 
<p><font face="Arial"><font size=-1>if (scope !=null) {</font></font>
230
 
<p><i><font face="Arial"><font size=-1>//register created object for this
231
 
execution scope</font></font></i>
232
 
<p><font face="Arial"><font size=-1>scope.put(jsclassname,scope,any);</font></font>
233
 
<p><font face="Arial"><font size=-1>}</font></font>
234
 
<p><font face="Arial"><font size=-1>}</font></font>
235
 
<p><font face="Arial"><font size=-1>}</font></font>
236
 
<p><font face="Arial"><font size=-1>}</font></font>
237
 
<br>&nbsp;
238
 
<br>&nbsp;
239
 
<p><font face="Arial"><font size=-1>It is time to test the code, so let
240
 
us write a small object that will use the JSHost object,</font></font>
241
 
<p><b><font face="Arial"><font size=-1>Fig 3 - JSHosttest.java</font></font></b>
242
 
<p><font face="Arial"><font size=-1>/**</font></font>
243
 
<p><font face="Arial"><font size=-1>* @author Madhukumar</font></font>
244
 
<p><font face="Arial"><font size=-1>* @version</font></font>
245
 
<p><font face="Arial"><font size=-1>*/</font></font>
246
 
<p><font face="Arial"><font size=-1>public class JSHosttest extends Object
247
 
{</font></font>
248
 
<p><font face="Arial"><font size=-1>/** Creates new JSHostTest*/</font></font>
249
 
<p><font face="Arial"><font size=-1>public JSHosttest() {</font></font>
250
 
<p><font face="Arial"><font size=-1>}</font></font>
251
 
<p><font face="Arial"><font size=-1>public static void main (String args[]){</font></font>
252
 
<p><font face="Arial"><font size=-1>if (args.length &lt; 1) {</font></font>
253
 
<p><font face="Arial"><font size=-1>System.out.println("Usage - Java JSHosttest.class
254
 
&lt;js source file>");</font></font>
255
 
<p><font face="Arial"><font size=-1>return;</font></font>
256
 
<p><font face="Arial"><font size=-1>}</font></font>
257
 
<p><font face="Arial"><font size=-1>JSHost jsh = new JSHost();</font></font>
258
 
<p><font face="Arial"><font size=-1>System.out.println("Executing JavaScript
259
 
file - " + args[0]);</font></font>
260
 
<p><font face="Arial"><font size=-1>Object result = jsh.executeJS(args[0]);</font></font>
261
 
<p><font face="Arial"><font size=-1>if (result instanceof String){</font></font>
262
 
<p><font face="Arial"><font size=-1>System.out.println("Results - " + result);</font></font>
263
 
<p><font face="Arial"><font size=-1>}</font></font>
264
 
<p><font face="Arial"><font size=-1>}</font></font>
265
 
<p><font face="Arial"><font size=-1>}</font></font>
266
 
<br>&nbsp;
267
 
<br>&nbsp;
268
 
<p><font face="Arial"><font size=-1>For more explanations on the code execution,
269
 
please refer embedding tutorial <a href="http://www.mozilla.org/js/rhino/tutorial.html">http://www.mozilla.org/js/rhino/tutorial.html</a>
270
 
and for all documentation and examples on Rhino visit <a href="http://www.mozilla.org/rhino/doc.html">http://www.mozilla.org/rhino/doc.html</a>.</font></font>
271
 
<br>&nbsp;
272
 
<br>&nbsp;
273
 
<br>&nbsp;
274
 
<br>&nbsp;
275
 
<br>&nbsp;
276
 
<br>&nbsp;
277
 
</body>
278
 
</html>
 
1
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
 
2
<html>
 
3
<head>
 
4
   <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
 
5
   <meta name="Generator" content="Microsoft Word 97">
 
6
   <meta name="GENERATOR" content="Mozilla/4.7 [en] (WinNT; U) [Netscape]">
 
7
   <title>Embedding �Scripting Host� in Business Applications</title>
 
8
</head>
 
9
<body link="#0000FF">
 
10
<b><font face="Arial"><font size=-1>Embedding
 
11
�Scripting Host� in Business Applications</font></font></b>
 
12
<p><b><font face="Arial"><font size=-1>Madhukumar Seshadri, <a href="http://www.cognizant.com)/">www.cognizant.com</a></font></font></b>
 
13
<br>&nbsp;
 
14
<br>&nbsp;
 
15
<p><font face="Arial"><font size=-1>With web browsers, continuing to rule
 
16
the human interface for applications, creating value by being ubiquitous,
 
17
few adoptions of rich technology that�s getting brewed underneath, will
 
18
help designing business applications even though most of the current ones
 
19
are made with bird�s eye of the underlying technologies.</font></font>
 
20
<p><font face="Arial"><font size=-1>JavaScript is a scripting language
 
21
invented and developed by Netscape. The language was primarily designed
 
22
for creating lightweight programming for web browser extensions by exposing
 
23
the Document Object Model of an HTML page to the scripts. JavaScript is
 
24
becoming object oriented and getting adopted for server-side scripting.</font></font>
 
25
<p><font face="Arial"><font size=-1>JavaScript is also becoming a standard
 
26
in the scripting world as Netscape is working closely with ECMA (European
 
27
Computer Manufacturers Association) to make it as a standard scripting
 
28
language for the script world. The standards are published as ECMA Script.</font></font>
 
29
<p><font face="Arial"><font size=-1>JavaScript originally designed for
 
30
exposing the DOM (Document Object Model) standardized by World Wide Web
 
31
consortium (W3C), to help web page designers to control and manipulate
 
32
the pages dynamically. �JavaScript� engines were embedded in the browsers
 
33
and they execute those portions of the code embedded in the HTML pages.</font></font>
 
34
<p><font face="Arial"><font size=-1>In short, JavaScript engine embedded
 
35
in the browser allowed extensions or manipulations for DOM Object run time
 
36
for the HTML page by executing the �scripts� associated with them. In other
 
37
words, browser exposes its DOM object for the page to scripts for extensions
 
38
and dynamic manipulations of the same, using a language that the script
 
39
interpreter understands.</font></font>
 
40
<p><font face="Arial"><font size=-1>Can I do the same for my application
 
41
by exposing my custom business objects written in my middle-tier? Can I
 
42
allow user to my write JavaScript extensions for my objects and also be
 
43
host for executing those scripts?</font></font>
 
44
<p><font face="Arial"><font size=-1>JavaScript host runs times are available
 
45
as binaries written in major languages. Check out <a href="http://www.mozilla.org/js">www.mozilla.org/js</a>.
 
46
Spider Monkey and Rhino are open source JavaScripting engines available
 
47
from mozilla.</font></font>
 
48
<p><font face="Arial"><font size=-1>Microsoft implementation of ECMA Script
 
49
(ECMA Script is based on core JavaScript, created by Netscape) is called
 
50
JScript. Microsoft binaries of jscript engine can be downloaded from http://msdn.microsoft.com/scripting/.</font></font>
 
51
<p><font face="Arial"><font size=-1>This document doesn�t explain the JavaScript
 
52
language in detail but explains how these scripting engines can be used
 
53
as host to expose business objects in the middle-tier and how the user
 
54
of these applications can extend it if needed using JavaScript.</font></font>
 
55
<p><font face="Arial"><font size=-1>The scripting engine Rhino (<a href="http://www.mozilla.org/js)">www.mozilla.org/rhino)</a>,
 
56
a javascript engine purely written in Java is one that I am going to use
 
57
for the testing the above.</font></font>
 
58
<p><font face="Arial"><font size=-1>Let us set some simple goals,</font></font>
 
59
<ul>
 
60
<li>
 
61
<font face="Arial"><font size=-1>Execute a plain �JavaScript� code and
 
62
use static Java object</font></font></li>
 
63
 
 
64
<li>
 
65
<font face="Arial"><font size=-1>Instantiate external objects (written
 
66
in Java) from the script and use them within the script</font></font></li>
 
67
</ul>
 
68
 
 
69
<br>&nbsp;
 
70
<br>&nbsp;
 
71
<p><font face="Arial"><font size=-1>Let us write a simple Javscript to
 
72
test the above set goals,</font></font>
 
73
<p><font face="Arial"><font size=-1><b>Fig 1</b> � jshosttest.js</font></font>
 
74
<p><b><i><font face="Arial"><font size=-1>/* Test 1 */</font></font></i></b>
 
75
<br><b><i><font face="Arial"><font size=-1>/* Use a static Java Object
 
76
in the script */</font></font></i></b>
 
77
<p><font face="Arial"><font size=-1>function test1() {</font></font>
 
78
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; var str;</font></font>
 
79
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; str = '"Hello World";</font></font>
 
80
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; return str;</font></font>
 
81
<br><font face="Arial"><font size=-1>}</font></font>
 
82
<p><font face="Arial"><font size=-1>var str = test1( );</font></font>
 
83
<br><font face="Arial"><font size=-1>//out is expected to be Java Object
 
84
exposed to the script scope</font></font>
 
85
<br><font face="Arial"><font size=-1>out.println ("JavaScript - Test 1
 
86
- " + str);</font></font>
 
87
<p><b><i><font face="Arial"><font size=-1>/* Test 2 */</font></font></i></b>
 
88
<p><b><i><font face="Arial"><font size=-1>/* Instantiate a Javaobject for
 
89
this scope and use it */</font></font></i></b>
 
90
<p><font face="Arial"><font size=-1>function test2(){</font></font>
 
91
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; // create a Java
 
92
string buffer object from JavaScript and use its java instance</font></font>
 
93
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; // This uses an
 
94
another Java object created for creating new objects within Java and</font></font>
 
95
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; // brings the same
 
96
for JavaScript execution scope</font></font>
 
97
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; // Refer _create.java
 
98
for more information</font></font>
 
99
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; create.getInstance("java.lang.StringBuffer","buffer");</font></font>
 
100
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; //JavaScript refers
 
101
the java object instance as �buffer�</font></font>
 
102
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; out.println(buffer.toString());</font></font>
 
103
<br>&nbsp;&nbsp;&nbsp; <font face="Arial"><font size=-1>buffer.append("I
 
104
am a javaobject dynamically created and executed in JavaScript");</font></font>
 
105
<br>&nbsp;&nbsp;&nbsp; <font face="Arial"><font size=-1>return buffer.toString();</font></font>
 
106
<br><font face="Arial"><font size=-1>}</font></font>
 
107
<p><font face="Arial"><font size=-1>var str = test2();</font></font>
 
108
<br><font face="Arial"><font size=-1>out.println("From JavaScript - Test
 
109
2 " + str);</font></font>
 
110
<p><font face="Arial"><font size=-1>Let us write a simple Javahost Object
 
111
using the Rhino engine to execute the above script,</font></font>
 
112
<p><b><font face="Arial"><font size=-1>Fig 2.1 - JSHost.java</font></font></b>
 
113
<p><font face="Arial"><font size=-1>/**</font></font>
 
114
<br><font face="Arial"><font size=-1>* @author Madhukumar Seshadri</font></font>
 
115
<br><font face="Arial"><font size=-1>* @version</font></font>
 
116
<br><font face="Arial"><font size=-1>*/</font></font>
 
117
<p><font face="Arial"><font size=-1>import org.mozilla.javascript.*;</font></font>
 
118
<br><font face="Arial"><font size=-1>import java.io.*;</font></font>
 
119
<br><font face="Arial"><font size=-1>import java.lang.*;</font></font>
 
120
<br><i><font face="Arial"><font size=-1>// import com.xxx.xxx.*;</font></font></i>
 
121
<p><font face="Arial"><font size=-1>public class JSHost extends Object
 
122
{</font></font>
 
123
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; /** Creates new
 
124
JSHost */</font></font>
 
125
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; public JSHost()
 
126
{</font></font>
 
127
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; }</font></font>
 
128
<p><i><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; /*** Executes
 
129
.js file ***/</font></font></i>
 
130
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; public Object executeJS
 
131
(String jsfname){</font></font>
 
132
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; //You can also
 
133
use evaluateReader</font></font>
 
134
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; File fp = new File(jsfname);</font></font>
 
135
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; String str_buff
 
136
=null;</font></font>
 
137
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; try {</font></font>
 
138
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
139
FileReader fr = new FileReader(jsfname);</font></font>
 
140
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
141
int length = (int) fp.length();</font></font>
 
142
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
143
char cbuff[] = new char[(char)length];</font></font>
 
144
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
145
fr.read(cbuff);</font></font>
 
146
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
147
str_buff = new String(cbuff);</font></font>
 
148
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; } catch(Exception
 
149
e) {</font></font>
 
150
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;
 
151
e.printStackTrace();</font></font>
 
152
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; }</font></font>
 
153
<p><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; //Execute the .js
 
154
file content</font></font>
 
155
<br><font face="Arial"><font size=-1>&nbsp;&nbsp;&nbsp; return executeJSSource(str_buff);</font></font>
 
156
<br><font face="Arial"><font size=-1>}</font></font>
 
157
<p><i><font face="Arial"><font size=-1>/*** Executes javascript source
 
158
***/</font></font></i>
 
159
<br><font face="Arial"><font size=-1>public Object executeJSSource (String
 
160
jsbuff){</font></font>
 
161
<br><font face="Arial"><font size=-1>Object any=null;</font></font>
 
162
<br><font face="Arial"><font size=-1>try{</font></font>
 
163
<br><i><font face="Arial"><font size=-1>//Enter the Context</font></font></i>
 
164
<br><font face="Arial"><font size=-1><i>// Refer </i><u><font color="#0000FF">http://www.mozilla.org/js/rhino/tutorial.html</font></u></font></font>
 
165
<br><font face="Arial"><font size=-1>Context context = Context.enter();</font></font>
 
166
<br><i><font face="Arial"><font size=-1>// Get the execution scope</font></font></i>
 
167
<br><font face="Arial"><font size=-1>Scriptable scope = context.initStandardObjects();</font></font>
 
168
<p><i><font face="Arial"><font size=-1>//----------- For Test 1 - Get System.out
 
169
in scope</font></font></i>
 
170
<br><font face="Arial"><font size=-1>//Scriptable jObj1 = Context.toObject(System.out,
 
171
scope);</font></font>
 
172
<br><font face="Arial"><font size=-1>scope.put("out", scope, jObj1);</font></font>
 
173
<p><i><font face="Arial"><font size=-1>//------------ For Test 2 - Instantiate
 
174
Create Object and get that in scope</font></font></i>
 
175
<br><i><font face="Arial"><font size=-1>//Allow JScript to create Java
 
176
Objects</font></font></i>
 
177
<br><i><font face="Arial"><font size=-1>//Bring the _create object to context</font></font></i>
 
178
<br><font face="Arial"><font size=-1>_create create = new _create( );</font></font>
 
179
<br><i><font face="Arial"><font size=-1>//Register this context and scope
 
180
to this create object instance</font></font></i>
 
181
<br><font face="Arial"><font size=-1>create.registerContext(context,scope);</font></font>
 
182
<br><font face="Arial"><font size=-1>//Scriptable jObj2 = Context.toObject(_create,
 
183
scope);</font></font>
 
184
<br><font face="Arial"><font size=-1>scope.put("create",scope,create);</font></font>
 
185
<br><i><font face="Arial"><font size=-1>//Evaluate (or execute js)</font></font></i>
 
186
<br><font face="Arial"><font size=-1><i>//Refer </i><u><font color="#0000FF">http://www.mozilla.org/js/rhino/tutorial.html</font></u></font></font>
 
187
<br><font face="Arial"><font size=-1>any = context.evaluateString(scope,
 
188
jsbuff, "", 1, null);</font></font>
 
189
<br><i><font face="Arial"><font size=-1>//Exit the Context</font></font></i>
 
190
<br><font face="Arial"><font size=-1>context.exit( );</font></font>
 
191
<br><font face="Arial"><font size=-1>}</font></font>
 
192
<p><font face="Arial"><font size=-1>catch ( JavaScriptException jse) {</font></font>
 
193
<br><font face="Arial"><font size=-1>jse.printStackTrace();</font></font>
 
194
<br><font face="Arial"><font size=-1>}</font></font>
 
195
<p><font face="Arial"><font size=-1>return any;</font></font>
 
196
<p><font face="Arial"><font size=-1>}</font></font>
 
197
<p><font face="Arial"><font size=-1>}</font></font>
 
198
<br>&nbsp;
 
199
<br>&nbsp;
 
200
<p><font face="Arial"><font size=-1>Let us write a class for creating new
 
201
Java objects and bringing them to this script execution scope,</font></font>
 
202
<p><b><font face="Arial"><font size=-1>Fig 2.2 � _create.java</font></font></b>
 
203
<p><i><font face="Arial"><font size=-1>/**</font></font></i>
 
204
<p><i><font face="Arial"><font size=-1>* @author Madhukumar</font></font></i>
 
205
<p><i><font face="Arial"><font size=-1>*/</font></font></i>
 
206
<p><font face="Arial"><font size=-1>import java.lang.Class;</font></font>
 
207
<p><font face="Arial"><font size=-1>import org.mozilla.javascript.*;</font></font>
 
208
<p><font face="Arial"><font size=-1>public class _create extends Object
 
209
{</font></font>
 
210
<p><font face="Arial"><font size=-1>static Context ptr = null;</font></font>
 
211
<p><font face="Arial"><font size=-1>static Scriptable scope =null;</font></font>
 
212
<p><font face="Arial"><font size=-1>public _create () { }</font></font>
 
213
<p><font face="Arial"><font size=-1>public void registerContext(Context
 
214
cptr, Scriptable sc){</font></font>
 
215
<p><font face="Arial"><font size=-1>ptr = cptr;</font></font>
 
216
<p><font face="Arial"><font size=-1>scope = sc;</font></font>
 
217
<p><font face="Arial"><font size=-1>}</font></font>
 
218
<p><font face="Arial"><font size=-1>public void getInstance(String classname,String
 
219
jsclassname) {</font></font>
 
220
<p><font face="Arial"><font size=-1>Object any=null;</font></font>
 
221
<p><font face="Arial"><font size=-1>try {</font></font>
 
222
<p><font face="Arial"><font size=-1>Class thisclass = Class.forName(classname);</font></font>
 
223
<p><font face="Arial"><font size=-1>any = thisclass.newInstance();</font></font>
 
224
<p><font face="Arial"><font size=-1>}</font></font>
 
225
<p><font face="Arial"><font size=-1>catch(Exception e){</font></font>
 
226
<p><font face="Arial"><font size=-1>e.printStackTrace();</font></font>
 
227
<p><font face="Arial"><font size=-1>}</font></font>
 
228
<p><font face="Arial"><font size=-1>if( ptr != null) {</font></font>
 
229
<p><font face="Arial"><font size=-1>if (scope !=null) {</font></font>
 
230
<p><i><font face="Arial"><font size=-1>//register created object for this
 
231
execution scope</font></font></i>
 
232
<p><font face="Arial"><font size=-1>scope.put(jsclassname,scope,any);</font></font>
 
233
<p><font face="Arial"><font size=-1>}</font></font>
 
234
<p><font face="Arial"><font size=-1>}</font></font>
 
235
<p><font face="Arial"><font size=-1>}</font></font>
 
236
<p><font face="Arial"><font size=-1>}</font></font>
 
237
<br>&nbsp;
 
238
<br>&nbsp;
 
239
<p><font face="Arial"><font size=-1>It is time to test the code, so let
 
240
us write a small object that will use the JSHost object,</font></font>
 
241
<p><b><font face="Arial"><font size=-1>Fig 3 - JSHosttest.java</font></font></b>
 
242
<p><font face="Arial"><font size=-1>/**</font></font>
 
243
<p><font face="Arial"><font size=-1>* @author Madhukumar</font></font>
 
244
<p><font face="Arial"><font size=-1>* @version</font></font>
 
245
<p><font face="Arial"><font size=-1>*/</font></font>
 
246
<p><font face="Arial"><font size=-1>public class JSHosttest extends Object
 
247
{</font></font>
 
248
<p><font face="Arial"><font size=-1>/** Creates new JSHostTest*/</font></font>
 
249
<p><font face="Arial"><font size=-1>public JSHosttest() {</font></font>
 
250
<p><font face="Arial"><font size=-1>}</font></font>
 
251
<p><font face="Arial"><font size=-1>public static void main (String args[]){</font></font>
 
252
<p><font face="Arial"><font size=-1>if (args.length &lt; 1) {</font></font>
 
253
<p><font face="Arial"><font size=-1>System.out.println("Usage - Java JSHosttest.class
 
254
&lt;js source file>");</font></font>
 
255
<p><font face="Arial"><font size=-1>return;</font></font>
 
256
<p><font face="Arial"><font size=-1>}</font></font>
 
257
<p><font face="Arial"><font size=-1>JSHost jsh = new JSHost();</font></font>
 
258
<p><font face="Arial"><font size=-1>System.out.println("Executing JavaScript
 
259
file - " + args[0]);</font></font>
 
260
<p><font face="Arial"><font size=-1>Object result = jsh.executeJS(args[0]);</font></font>
 
261
<p><font face="Arial"><font size=-1>if (result instanceof String){</font></font>
 
262
<p><font face="Arial"><font size=-1>System.out.println("Results - " + result);</font></font>
 
263
<p><font face="Arial"><font size=-1>}</font></font>
 
264
<p><font face="Arial"><font size=-1>}</font></font>
 
265
<p><font face="Arial"><font size=-1>}</font></font>
 
266
<br>&nbsp;
 
267
<br>&nbsp;
 
268
<p><font face="Arial"><font size=-1>For more explanations on the code execution,
 
269
please refer embedding tutorial <a href="http://www.mozilla.org/js/rhino/tutorial.html">http://www.mozilla.org/js/rhino/tutorial.html</a>
 
270
and for all documentation and examples on Rhino visit <a href="http://www.mozilla.org/rhino/doc.html">http://www.mozilla.org/rhino/doc.html</a>.</font></font>
 
271
<br>&nbsp;
 
272
<br>&nbsp;
 
273
<br>&nbsp;
 
274
<br>&nbsp;
 
275
<br>&nbsp;
 
276
<br>&nbsp;
 
277
</body>
 
278
</html>