פרק  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)

 

 

 

 

 

 

לנוחיותך, להלן תוכן העניינים של הספר:

 

פרק 1 : הבסיס
פרק 2 : ערכים בסיסיים
פרק 3 : אופרטורים
פרק 4 : משפטי בקרה ולולאות
פרק 5 : פונקציות
פרק 6 : אובייקטים
פרק 7 : אובייקטים מובנים בשפה
פרק 8 : אופן פעולת האובייקטים
פרק 9 : תבניות טקסט
פרק 10 : שילוב של JavaScript ו- HTML
פרק 11 : טיפול באירועים
פרק 12 : האובייקטים שנוצרים בדפדפן
פרק 13 : האובייקט Navigator
פרק 14 : האובייקט Window
פרק 15 : האובייקט Document
פרק 16 : האובייקט Location
פרק 17 : האובייקט History
פרק 18 : יצירת cookies
פרק 19 : האובייקטים Link ו- Anchor
פרק 20 : האובייקט Image
פרק 21 : יצירת Image Map
פרק 22 : האובייקט Form
פרק 23 : טכנולוגית ה- LiveConnect