פרק 23:
טכנולוגיית ה - LiveConnect
·
הקדמה
·
פניה
ל-Applet מתוך
שורות קוד שנכתבו ב-JavaScript
·
פניה
לפקודות ה-JavaScipt מתוך ה-Applet
·
פניה
ל- plugin אשר מותקן בדפדפן
מתוך שורות קוד שנכתבו ב-JavaScript
·
תרגילים
הקדמה
באמצעות
טכנולוגיית ה-LiveConnect
ניתן לחבר בין מה שנכתב ב-JavaScript לבין applets אשר נכתבו ב-Java ולבין תכניות plugins שונות אשר פועלות בתוך הדפדפן.
בכתיבת
פרק זה הנחתי כי את/ה יודע/ת לתכנת applets ב-Java.
אם הנחה זו איננה נכונה אני ממליץ הנה לדחות את לימוד הפרק לשלב מאוחר יותר.
תחת
טכנולוגיה זו ניתן בתוך פקודות ה-JavaScript
להתייחס ל-Applets אשר פועלים באותה עת בדפדפן כאל אובייקטים, ובתור
שכאלה להפעיל מתוכם מתודות אשר הוגדרו בהם (תזכורת: כדי לייצור applet ב-Java יש
להגדיר מחלקה אשר תירש מהמחלקה Applet ותכלול בתוכה את הגדרתן מחדש – overriding – של מספר מתודות אשר מגיעות אליה בירושה. בעת פעולת ה-applet
הדפדפן יוצר אובייקט מטיפוס המחלקה שהוגדרה).
כיוון
שטכנולוגיית ה-LiveConnect
פותחה על ידי Netscape
הדפדפן Internet Explorer לא תומך בה באופן מלא.
פנייה ל-applet מתוך שורות קוד שנכתבו ב-JavaScript
מתוך
שורות הקוד אשר נכתבות ב-JavaScript ניתן לפנות ולהפעיל מתודות אשר הוגדרו בתוך ה-Applet או
הגיעו אליו בירושה והרשאת הגישה שלהם היא
public.
ה-applet
אשר פועל בתוך הדפדפן הנו, למעשה, אובייקט אשר נוצר מהמחלקה אשר הוגדרה כדי שתשמש
בתור applet.
הפניה
להפעלת מתודה מתוך האובייקט שנוצר (ה-applet) ניתנת לביצוע במספר דרכים. אחת הדרכים כוללת שימוש במערך applets
אשר מהווה תכונה באובייקט document. מערך זה כולל בתוך כל אחד מתאיו reference
לאובייקט מטיפוס Applet אשר מייצג applet אחר אשר פועל בדפדפן. כך למשל, אם במסמך קיים applet
אחד ויחיד, והמתודה startProcess מוגדרת בו אז ניתן יהיה להפעילה מתוך שורות ה-javaScript
שתיכתבנה באופן הבא: document.applets[0].startProcess().
דרך
נוספת כוללת שימוש בשמו של ה-applet וזאת במקום האיבר במערך applets אשר מייצג אותו. כאשר מוסיפים את תגית ה-applet אל תוך מסמך ה-HTML ניתן להוסיף לתוכה את התכונה NAME ולקבוע את ערכה כך שיהיה שווה לשם שרוצים לתת לאותו applet. כך למשל, בהמשך לדוגמא הקודמת, אם השם שניתן ל-applet
באמצעות הוספת התכונה NAME אל תוך תגית ה-applet אשר מייצגת אותו הוא dodly אז הפעלת המתודה startProcess תוכל להיעשות גם באופן הבא: document.dodly.startProcess().
הדוגמא
הבאה מציגה מסמך HTML
אשר כולל בתוכו גםApplet וגם פקודות ב-JavaScript אשר פונות להפעלתו.
<!-- file name : simpleLiveConnect.html -->
<!-- 2000(c) Zindell Publishing House Ltd.
-->
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML
4.0//EN">
<HTML>
<HEAD>
<TITLE>simpleLiveConnect.html - a Demo to the LiveConnect
technology</TITLE>
<SCRIPT LANGUAGE="JavaScript1.2">
function putText()
{
document.applets[0].putText(document.myForm.neto.value);
}
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="myForm">
<INPUT TYPE="text"
SIZE="20" NAME="neto">
<INPUT TYPE="button"
VALUE="PRESS" onClick="putText()">
</FORM>
<HR>
<APPLET CODE="SimpleLiveConnect.class"
WIDTH="400" HEIGHT="300">
</APPLET>
</BODY>
<HTML>
//filename:SimpleLiveConnect.java
//Copyright (c) 2000 Haim Michael & Zindell
//Publishing House, Ltd. All rights reserved.
//No part of the contents of this program may be
//reproduced or transmitted in any form or by any
//means without the written permission of the
publisher.
import
java.awt.*;
import
java.applet.*;
public
class SimpleLiveConnect extends Applet
{
public void putText(String str)
{
label1.setText("Hello
" + str);
}
public void init()
{
setLayout(null);
setSize(426,266);
add(label1);
label1.setBounds(72,180,96,22);
label2.setText("Greetings");
add(label2);
label2.setForeground(java.awt.Color.blue);
label2.setFont(new
Font("Dialog", Font.PLAIN, 18));
label2.setBounds(72,48,288,55);
}
java.awt.Label label1 = new java.awt.Label();
java.awt.Label label2 = new java.awt.Label();
}
כל
applet
אשר רץ בתוך הדפדפן מיוצג במסמך ה-HTML על ידי אובייקט מטיפוס Applet. המתודות והמשתנים שהוגדרו ב-applet עם הרשאת הגישה public מיוצגים באמצעות תכונות אשר מופיעות באובייקט ה-Applet.
באמצעות לולאת for..in
ניתן להציג תכונות אלה ובדרך זו לדעת מהם המשתנים ומהן המתודות אשר מוגדרים ב-applet עם
הרשאת הגישה public כך
שניתן לפנות אליהם מתוך שורות ה-JavaScript.
בדוגמא
הבאה ניתן לראות כיצד ניתן לעשות שימוש בלולאת for..in כדי לגלות את המשתנים ואת המתודות אשר קיימים ב-applet
ושניתן לגשת אליהם (הרשאת הגישה שלהם public).
<!-- file name : forinLiveConnect.html -->
<!-- 2000(c) Zindell Publishing House Ltd.
-->
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML
4.0//EN">
<HTML>
<HEAD>
<TITLE>forinLiveConnect.html - a Demo to using the for..in loop
</TITLE>
<SCRIPT LANGUAGE="JavaScript1.2">
function putText()
{
var str;
for(prop in
document.applets[0])
{
str += prop
+ " : " + document.applets[0][prop] + "\n";
}
document.myForm.ta.value
= str;
}
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="myForm">
<INPUT TYPE="button"
VALUE="PRESS" onClick="putText()">
<TEXTAREA ROWS=16 COLS=60
NAME="ta"> </TEXTAREA>
</FORM>
<HR>
<APPLET CODE="SimpleLiveConnect.class"
WIDTH="400" HEIGHT="300">
</APPLET>
</BODY>
<HTML>
שימוש
זה בלולאת ה- for..in
איננו נתמך על ידי Internet Explorer (Netscape Nevigator
תומך בו).
כדי
לשמור על רמת ביטחון גבוהה מפני מעשים זדוניים, לא ניתן להפעיל באמצעות פקודה
שנכתבה ב-JavaScript
מתודה אשר מוגדרת בתוך ה-applet ושבפעולתה פונה (לצורך שמירה או קריאה של נתונים) אל קובץ.
ניתן
לייצור applet
שממדיו הופכים אותו לבלתי נראה (רוחבו ואורכו שווים לפיקסל אחד. אם קובעים את
רוחבו ואורכו כשווים ל-0 מתקבלות תוצאות מוזרות) ולהשתמש בו כ-applet
רגיל לכל דבר.
הדוגמא
הבאה מציגה מסמך HTML
אשר כולל בתוכו applet
בלתי נראה (מימדיו שווים לפיקסל אחד והוא ממוקם בתחתית המסך). ה-applet
שמשולב במסמך מבצע פעולת קריאה מקובץ אשר ממוקם בשרת.
<!-- file name : invisibleApplet.html -->
<!-- 2000(c) Zindell Publishing House Ltd.
-->
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML
4.0//EN">
<HTML>
<HEAD>
<TITLE>invisibleApplet.html - a Demo to using an invisible
applet</TITLE>
<SCRIPT LANGUAGE="JavaScript1.2">
function getFile()
{
document.myForm.ta.value
= document.invisible.getFile(document.myForm.tf.value);
}
</SCRIPT>
</HEAD>
<BODY>
<FORM NAME="myForm">
<LABEL>name of the file :
</LABEL>
<INPUT TYPE="text"
SIZE="20" NAME="tf">
<INPUT TYPE="button"
VALUE="GET" onClick="getFile()">
<HE>
<TEXTAREA ROWS=16 COLS=60
NAME="ta"> </TEXTAREA>
</FORM>
<APPLET CODE="InvisibleApplet.class" WIDTH="1"
HEIGHT="1" NAME="invisible">
</APPLET>
</BODY>
<HTML>
//filename:InvisibleApplet.java
//Copyright (c) 2000 Haim Michael & Zindell
//Publishing House, Ltd. All rights reserved.
//No part of the contents of this program may be
//reproduced or transmitted in any form or by any
//means without the written permission of the
publisher.
import
java.awt.*;
import
java.applet.*;
import
java.net.*;
import
java.io.*;
public
class InvisibleApplet extends Applet
{
URL
theURL;
public String getFile(String fileName)
{
System.out.println("getFile:");
return getInfo(fileName);
}
public String getInfo(String fileName)
{
System.out.println("getInfo:");
DataInputStream dis = null;
String str = null;
try
{
theURL = new
URL(getDocumentBase(),fileName);
System.out.println("getInfo:
theURL was created");
dis = new DataInputStream(
theURL.openStream());
System.out.println("getInfo:
ois was created");
StringBuffer sbf = new
StringBuffer();
String line;
while ((line =
dis.readLine())!=null)
sbf.append(line + "\n");
str = sbf.toString();
System.out.println("getInfo:
str equals:\n" + str);
}
catch(Exception e)
{
e.printStackTrace();
}
finally
{
try
{
dis.close();
}
catch(Exception e)
{
e.printStackTrace();
}
}
return str;
}
}
כאשר
מועבר ערך משורות ה-javaScript אל ה-applet שכתוב ב-Java הוא עובר, לעתים, המרה. כאשר מדובר בערך מחרוזתי או בערך בוליאני
אז הוא נקלט על ידי ה-applet בתור reference מטיפוס String או ערך מטיפוס Boolean בהתאם. כאשר מדובר בערך מספרי אז הוא תמיד יעבור casting לערך מטיפוס float. כל ערך מספרי שמועבר משורות ב-JavaScript אל ה-applet שנכתב ב-JAVA עובר casting ל-float.
ניתן
גם לשלוח אל ה-applet
אובייקטים שקיימים ב-javaScript כגון Form, Document
ואחרים. במקרים אלה האובייקטים ייקלטו על ידי ה-applet בתור אובייקטים מטיפוס המחלקה netscape.javascript.JSObject.
פניה לפקודות ה-JavaScipt מתוך ה-applet
ב-package
ששמו javascript
קיימות שתי המחלקות הבאות: JSObject ו- JSException. יש לדאוג לכך שבעת ביצוע הקומפילציה ה-JVM יכיר את שתי המחלקות הללו כדי שהקומפילציה תצליח. בתוך קבוצת
הספריות שמשמשת את הדפדפן NetscapeNevigator ניתן למצוא את הקובץ java40.jar (או java_30.jar או java_301.jar בגרסאות ישנות יותר של הדפדפן) אשר כולל בתוכו באופן מקווץ את ה-package
האמור. בתוך קבוצת הספריות שמשמשות את הדפדפן InternetExplorer ניתן באופן דומה למצוא את הקובץ H3rfb7jn.zip.
כדי
שה-applet
אשר כותבים יצליח בגישתו אל מסמך ה-HTML ואל פקודות ה-JavaScript אשר מופיעות בו יש להוסיף אל תוך תגית ה- <APPLET> את
התכונה MAYSCRIPT.
המחלקה
JSObject
כוללת בתוכה מספר מתודות אשר מאפשרות את פעולת הגישה למסמך ה-HTML
ולקוד ה-JavaScript
אשר מופיע בו.
כך, למשל, באמצעות המתודה
הסטטית getWindow
אשר מוגדרת בה באופן הבא:
getWindow(Applet applet)
ניתן
לקבל reference
לאובייקט מטיפוס JSObject
אשר מתאר את אובייקט ה-window במסמך ה-HTML (האובייקט אשר מתאר את החלון שבו מסמך ה-HTML מוצג). זוהי המתודה הסטטית היחידה שמוגדרת במחלקה.
מתודות
אחרות שמוגדרות במחלקה כוללות בין היתר את המתודות הבאות:
המתודה
call
call (String functionName, Object
args[])
מתודה
זו מקבלת בעת הפעלתה כארגומנט ראשון את שם הפונקציה אשר הוגדרה במסמך ה-HTML
באמצעות שורות קוד ב-JavaScript. הארגומנט השני שיש לשלוח אליה הוא reference למערך אשר מכיל בכל אחד מאיבריו reference לאובייקט אחר אשר נשלח כארגומנט אל הפונקציה. המתודה גורמת
בפעולתה להפעלת הפונקציה. אם הפונקציה לא מקבלת פרמטרים אז יש לשלוח בתור ארגומנט
שני reference
למערך מטיפוס String אשר מכיל מחרוזת ריקה אחת בלבד, כגון: String vec[] = {""};
המתודה
eval
eval (String expression)
מתודה
זו מקבלת בעת הפעלתה reference לאובייקט מטיפוס String אשר מתאר מחרוזת תווים שהיא פקודה/פקודות ב-JavaScript. המתודה גורמת בפעולתה לביצוע של אותה פקודה/פקודות. אם לפקודות שבוצעו
קיים ערך שמוחזר אז המתודה eval מחזירה אותו. המתודה מחזירה, למעשה, reference לאובייקט מטיפוס JSObject אשר מתאר את הערך שהוחזר. מסיבה זו יש צורך, לעתים, לבצע לערך
המוחזר casting ל-String.
המתודה
getMember
getMember(String elementName)
מתודה
זו מחזירה reference
לאובייקט מטיפוס JSObject
אשר מתאר את מרכיב המסמך ששמו elementName. כך למשל, אם מסמך ה-HTML שבו פועל ה-applet כולל טופס ששמו myForm (עבור פקודות ה-JavaScript מייצג אותו אובייקט מסוג Form) אז הפעלת המתודה getMember באופן הבא:
JSObject form = (JSObject) win.getMember("myForm");
תגרום
לכך שבתוך המשתנה form יוכנס reference לאובייקט מסוג JSObject אשר מתאר את הטופס myForm. כל זאת בהנחה שלפני כן נכתבה הפקודה המתאימה אשר גרמה לכך ש win
יכיל את ה-reference
לאובייקט ה-Window
שמייצג את החלון שבו המסמך מופיע:
JSObject win =
JSObject.getWindow(this);
בהנחה
שהשורה נכתבת בתוך אחת מהמתודות של ה-applet.
המתודה
setMember
setMember(String elementName, Object
value)
מתודה
זו מאפשרת לקבוע את ערכו של מרכיב במסמך ה-HTML. מתודה זו יש להפעיל על אובייקט ה-JSObject אשר מתאר את האובייקט (ב-JavaScript)
אשר מכיל (בתור תכונה) reference לאובייקט שאת ערכו רוצים לשנות.
הפעולה
הראשונה שיש לבצע ב-applet שכותבים היא לקבלתו של reference לאובייקט מסוג JSObject אשר יתאר את אובייקט ה-window במסמך. יש לבצע זאת באמצעות המתודה הסטטית getWindow באופן שהוצג. לאחר מכן ניתן לקבל reference לאובייקט מסוג JSObject אשר יוכל לייצג כל מרכיב וכל תכונה שקיימים במסמך. כך, למשל, ניתן
יהיה לקבל reference
לאובייקט JSObject
אשר מייצג את התכונה value בשדהטקסט אשר שמו הוא tf ושנמצא בתוך טופס ששמו myForm באופן הבא:
JSObject win =
JSObject.getWindow(this);
JSObject doc =
(JSObject)win.getMember("document");
JSObject form =
(JSObject)doc.getMember("myForm");
JSObject textFld =
(JSObject)form.getMember("tf");
JSObject theTextField = (JSObject)textFld.getMember("value");
דרך
נוספת לקבלת ה-reference
לאובייקט ה-JSObject
אשר מתאר את התכונה value של שדה הטקסט האמור כוללת את השימוש במתודה eval:
JSObject win =
JSObject.getWindow(this);
JSObject val =
win.eval("document.myForm.tf.value");
אובייקט
מטיפוס String
שמועבר מה-applet
שכתוב ב-Java אל
פקודות ה-JavaScript
מתקבל בתור אובייקט מסוג String. ערך מטיפוס Boolean שמועבר מה-applet שכתוב ב-Java אל פקודות ה-JavaScript מתקבל בתור ערך מטיפוס Boolean. כל ערך מספרי שמועבר מה-applet אל פקודות ה-JavaScript מתקבל בתור ערך מטיפוס מספרי (ב-JavaScript לא קיימת ההבחנה בין סוגי ערכים מספריים שונים כפי שהיא קיימת ב-Java).
מערך שמועבר מה-applet
לפקודות ה-JavaScript
מתקבל בפקודות ה-JavaScript
בתור אובייקט מטיפוס Array (כמו אובייקט שיוצרים ב-JavaScript באמצעות new Array()).
התכנית
הבאה מדגימה את הפעלתן של פקודות ב-JavaScript תוך כדי פעולתו של ה-applet אשר פועל באותו מסמך.
<!-- file name : invisibleApplet.html -->
<!-- 2000(c) Zindell Publishing House Ltd.
-->
<! DOCTYPE HTML PUBLIC "-//W3C//DTD HTML
4.0//EN">
<HTML>
<HEAD>
<TITLE>appletToJS.html - a Demo to using an invisible
applet</TITLE>
</HEAD>
<BODY>
<APPLET CODE="AppletToJS.class" WIDTH="1"
HEIGHT="1" MAYSCRIPT>
</APPLET>
</BODY>
<HTML>
//filename:AppletToJS.java
//Copyright (c) 2000 Haim Michael & Zindell
//Publishing House, Ltd. All rights reserved.
//No part of the contents of this program may be
//reproduced or transmitted in any form or by any
//means without the written permission of the
publisher.
import
java.awt.*;
import
java.applet.*;
import
java.net.*;
import
java.io.*;
import
netscape.javascript.*;
public
class AppletToJS extends Applet
{
public void start()
{
JSObject win = JSObject.getWindow(this);
win.eval("window.alert('Bonjour through LiveConnect')");
}
}
פניה ל- plugin אשר מותקן בדפדפן מתוך שורות קוד שנכתבו ב-JavaScript
חברות
אשר מייצרות תוכנות plug-in מספקות בדרך כלל אוסף של פקודות שמיועדות להפעלת ה-plug-in
שהן מספקות. קיים דמיון רב בין הפעלתו של plug-in לבין הפעלתו של applet. בשני המקרים אובייקט מייצג את ה-applet/תכנת ה-plug-in. אחת התכונות שקיימות באובייקט document היא התכונה embeds אשר מהווה מערך שכל
אחד מאיבריו הוא reference
לכל אחד מהאובייקטים אשר מייצגים את כל אחת מתכניות ה-plug-in שמותקנות בדפדפן. על אובייקט שמייצג תכנית plug-in ניתן להפעיל את המתודות אשר הוגדרו על ידי יצרנית תכנת ה-plug-in.
תרגילים
1. עליך ליצור מסמך HTML
אשר יכלול תכנית ב-JavaScript
אשר תקלוט מהמשתמש את ציוניו במקצועות הלימוד השונים ובאמצעות apllet
בלתי נראה תיחשב את הממוצע המשוקלל של כל הציונים.
2000 © All the rights reserved to Haim Michael & Zindell
Publishing House Ltd.
No
parts of the contents of this paper may be reproduced or transmitted in any
form by any means
without
the written permission of the publisher !
This book can be used for personal use only !!!
Brought
to you by Zindell
(http://www.zindell.com)
לנוחיותך, להלן תוכן
העניינים של הספר: