כיצד להתחיל עם Java בצד השרת

Java בצד השרת (SSJ), המכונה לעתים סרטי רשת או יישומונים בצד השרת, הוא הכלאה עוצמתית של ממשק ה- Gateway Common (CGI) ותכנות API שרתים ברמה נמוכה יותר - כגון NSAPI מ- Netscape ו- ISAPI של מיקרוסופט.

מאמר זה מספק מבוא והוראות מפורטות ליישום Netscape של Java בצד השרת, ש- Netscape מכנה יישומונים בצד השרת (SSA).

SSA יכולים להתנהג כמו סקריפט CGI. זה מקבל getו postבקשות ומחזיר דף אינטרנט (בדרך כלל בצורה של HTML), אבל SSJ נטען באופן דינמי לתוך השרת כמו NSAPI / ISAPI. זה מבטל את עיכובי ההתחלה של CGI. זה גם מאפשר ל- SSJ לשמור על חלק ממצבו בין הוצאות להורג, כגון שמירה על חיבור פתוח למסד נתונים.

SSAs מבצעים בארגז החול שלהם , המספק את האבטחה שמצפים מג'אווה. לדוגמה, יישומון מתרסק לא יקרוס את כל השרת כפי שיכול לקרות בתכנות NSAPI / ISAPI. אבטחה נוספת זו מאפשרת גם העלאת יישומונים לביצוע בשרת - בדיוק כמו יישומוני Java בצד הלקוח מורידים לביצוע על הלקוח.

אולי ההיבט החשוב ביותר של SSA הוא בכך שהם, כתובים בג'אווה, בלתי תלוי בפלטפורמה ומכווני עצמים.

הִיסטוֹרִיָה

מספר גדל והולך של שרתים תומכים בג'אווה בצד השרת, כולל שרתי Netscape FastTrack 2.0 ו- Enterprise 2.0, שרת ה- Java של JavaSoft (נקרא בעבר Jeeves), ה- Jigsaw של World Wide Web Wide, ה- T3Server של WebLogic, שרת האינטרנט של אורקל ו- ExpressO של Peak Technologies. כל אחד מהשרתים הללו משתמש ב- Java API בצד השרת, המחייב מפתחים לכתוב תוכניות שונות עבור כל שרת בו ישתמשו.

פרטי Netscape: הכן את השרת שלך

לפני שאתה מחבר את היישומון הראשון שלך בצד השרת לשרתים של Netscape, עליך להכין את השרת. שרתי Enterprise ו- FastTrack זהים בתמיכת ה- SSA שלהם.

התחל על ידי הפעלת מתורגמן Java של השרת. ניתן לעשות זאת ממנהל השרתים תחת "תוכניות -> ג'אווה". לחץ על כפתור כן כדי לאפשר את מתורגמן Java. מנהל השרת יבקש ממך "ספריית יישומוני Java", שהיא המקום להציב את קבצי התמיכה של SSA וכן את המיקום עבור כל קבצי המחלקה של SSA. הוא מספק מיקום ברירת מחדל. במכונות יוניקס זה / usr / ns-home / plugins / java / applets . במכונות Windows, מדובר ב- C: \ Program Files \ Netscape \ Server \ plugins \ Java \ applets(הערה: בשדה כניסה זה נטסקייפ נוטה לערבב ולהתאים את הקו האחורי שלה ואת קו קו נטוי קדימה. אל דאגה, נטסקייפ מטפלת בשני סוגים של קו קו נטוי באותו אופן.) קח את ספריית היישומונים המוגדרת כברירת מחדל במידת האפשר. אם תחליט להתאים אישית ולא להשתמש בברירת המחדל, הקפד לבחור בספרייה איפשהו מתחת לשורש השרת שלך ושתעתיק את כל הקבצים ממיקום ברירת המחדל למיקום המותאם אישית שלך. שמור והחל את השינויים שלך, וודא שנעצור את השרת והפעל אותו שוב כך שהשינויים ייכנסו לתוקף.

הגיע הזמן להתנסות!

בשלב זה אתה אמור להיות מסוגל להתנסות ביישומונים המסופקים על ידי נטסקייפ. הפנה את הדפדפן שלך אל // servername / server-java / FormApplet? Abc = xyz & 123 = 789. אתה אמור לראות את נתוני "קבל" מטופלים ומוחזרים ב- HTML על ידי יישומון הטופס.

אם נתקלת בשגיאת שרת, בדוק את יומן השגיאות של השרת שלך ( / usr / ns-home / httpd-hostname / logs / שגיאות או C: \ Program Files \ Netscape \ Server \ httpd-hostname \ logs \ שגיאות ). אם כתוב שהוא לא יכול להפעיל את מתורגמן Java, סיבה סבירה היא שה- CLASSPATH שלך מבלבל את Netscape. נסה להפעיל את השרת בסביבה ללא כל CLASSPATH.

יישומון נוסף לנסות הוא בכתובת // servername / server-java / Connect; עליו לטעון ולהציג //www.meer.net/barn/index.html. היישומון Connect מקשר חיבור שקעים במטרה להביא את הדף, מה שעלול ליצור שגיאת שרת אם השרת שלך עומד מאחורי חומת אש. לשלב הבא, נניח שחומת אש חסמה את השקע. אנו נערוך את קוד היישומון Connect כדי לגשת לדף אחר בשרת אינטרנט אחר.

קובץ Connect.java זמין ב"ספריית היישומונים של Java ". (הוא נמצא גם למטה.) תחילה הוא מייבא את netscape.server.applet. *.

ייבא את netscape.server.applet. *; 

חבילה זו מכילה את הכיתות הבסיסיות לפיתוח יישומונים בצד השרת. המעמד החשוב ביותר בחבילה זו הוא HttpAppletמעמד העל לכל היישומונים בצד השרת. כפי שניתן לראות ב- Connect (למטה), השיטה היחידה שיישומון בצד השרת צריך ליישם היא runהשיטה. שיטה זו מופעלת בכל פעם שהיישומון מקבל "להיט". runשיטת Connect פותחת שקע אלי "המארח" ומביאה את "הבקשה" לפני הפניית הפלט ללקוח. אנו רוצים לשנות את המשתנה "מארח" כך שהוא מפנה למכונה הנראית משרת האינטרנט שלנו. נרצה לשנות את המשתנה "בקשה" כך שהוא מפנה לדף ב"מארח "החדש.

ייבא את netscape.server.applet. *; ייבא java.io.PrintStream; ייבא java.io.InputStream; ייבא java.io.OutputStream; ייבא java.io.DataInputStream; ייבא java.net.Socket; class Connect מרחיב HttpApplet {public void run () זורק Exception {String host = "www.meer.net"; // שנה את יציאת int זה = 80; בקשת מחרוזת = "GET /barn/index.html HTTP / 1.0 \ n"; // גם זה שקע s = שקע חדש (מארח, יציאה); OutputStream os = s.getOutputStream (); PrintStream op = PrintStream חדש (os); op.println (בקשה); InputStream הוא = sam (); DataInputStream di = DataInputStream חדש (is); קו מיתרים; if (returnNormalResponse ("text / html")) {PrintStream out = getOutputStream (); out.println ("& lth1 & gtData ב-" + host + "port" + port + ""); out.println ("בקשה:" + בקשה + "
   
"); בעוד ((שורה = di.readLine ())! = null) out.println (שורה);}}}

לאחר שביצעת את השינויים "מארח" ו"בקשה ", השלב הבא הוא הידור מחדש של Connect.

תחת Windows, השתמש במהדר ה- javac הסטנדרטי שלך עם הגדרת מסלול הכיתה לכלול serv2_0.zip. javac -classpath ..\classes\serv2_0.zip Connect.java.

תחת יוניקס, Netscape מספק מהדר Java (javac) בספרייה מעל ספריית היישומונים של Java. ג'אוואק זה הוא למעשה תסריט שקורא java sun.tools.javac.Mainלעשות את ההידור. במערכות מסוימות sun.tools.javac.Mainהמהדר משתמש בשיטות 1.1 JDK חדשות כגון java.lang.Character.isJavaLetterOrDigit(), מה שעלול לגרום לבעיה לא קטנה עבור מפתחים ללא 1.1 JDK. אלטרנטיבה משובחת לחלוטין היא להשתמש במהדר ה- javac הסטנדרטי שתמיד השתמשת בו javac -classpath ../classes/serv2_0.zip Connect.java. אם ברצונך להשתמש בסקריפט ה- javac שסופק, פשוט החלף את " javac" ב- " ../javac."

ייתכן שתראה שגיאה במהלך אוסף זה שאומרת:

Connect.java:1: החבילה netscape.server.applet לא נמצאה בייבוא. ייבא את netscape.server.applet. *; ^ 1 שגיאה

אין מה לדאוג לשגיאה זו. קובץ הכיתה נוצר כרגיל ויפעל בסדר. תוכל להימנע משגיאה זו אם תסיר תווים כלליים בהצהרות הייבוא ​​שלך.

תחת יוניקס, נטסקייפ מספקת קובץ מקוון בספריית היישומונים של ג'אווה לטיפול באוסף היישומונים. למרבה הצער, הקובץ המקוון משתמש בתו הכללי '%', שהוא סיומת mk / nmake ולא תמיד זמין. קוד הבעיה מוצג למטה.

% .class:% .java ../javac -classpath ../classes/serv2_0.zip $ *. java 

חלופה היא להשתמש בכלל .suffixes. ערוך את השורה הראשונה של הקובץ שתהיה:

. תיקונים: .java .class והחלף את קווי היעד% .class ב- .java.class: javac -classpath ../classes/serv2_0.zip $ < 

יתכן שתבחין שהסרתי את הקובץ ../כך שהקובץ יפעיל את מהדר ה- javac הסטנדרטי. כדי לבדוק את הקובץ החדש הזה, שמור מחדש את קובץ Connect.java ונסה "make".

אם היית טוען מחדש את הדף // servername / server-java / Connect עכשיו, עדיין תראה את הדף "אסם". הסיבה לכך היא כי שיעורי Java נטענים לשרת בזמן ההתחלה באמצעות פונקציית init בקובץ obj.conf. כדי לטעון את השינויים החדשים, עליך להפסיק את השרת ואז להפעיל אותו שוב. במערכות מסוימות עליך להשתמש במנהל השרת כדי לבצע את העצירה וההתחלה. הפעלה מחדש של שורת הפקודה מביאה לפעמים ל"שגיאת שרת "לבקשות היישומון הבאות. לאחר שעצרת והפעלת את השרת, נסה שוב את יישומון Connect. Netscape היה צריך לטעון את קוד ה- Connect החדש כדי להציג את הדף שבחרת.

בואו נהיה רציניים לגבי API

מזל טוב! הרגע קיברת ובדקת את קוד הג'אווה הראשון שלך בצד השרת. עכשיו כדי לתת כמה מהשיטות העומדות לרשותך.

בשיטות הבאות תוכל לבצע את רוב עבודתך:

PrintStream getOutputStream () זורק IOException; 

מחזירה a PrintStream, בה תוכלו להשתמש כדי להדפיס את תגובתכם ללקוח. זה מחליף System.out.

Hashtable getFormData () זורק IOException; 

מחזיר Hashtable המאחסן את זוגות הערך-שם של בקשת ה- HTTP. מחרוזות הערך מפוענחות מהצורה המקודדת שלהן URI. זה זורק IOExceptionאם אין נתוני טופס.

מחרוזת getFormField (מחרוזת fieldName) זורק IOException; 

אתה יכול להשתמש בו getFormFieldלאחזור שדה אחד בלבד. גם זה זורק IOExceptionאם אין נתוני טופס.

boolean returnNormalResponse(String contentType) throws IOException; 

starts an HTTP response with the content type set as you specify with its parameter. It returns true if this was a "get" or "post" request and false if it was a "head" request.

public boolean returnErrorResponse(String contentType, int status, String reason) throws IOException public boolean returnErrorResponse(String contentType, int status) throws IOException 

starts an HTTP response to report an error. It takes a content type, a status (such as HttpApplet.BAD_REQUEST, which represents the standard error code 400), and an optional string giving the reason for the error.

There are dozens of other methods you can use in the development of your server-side applets. Netscape installs an API guide with its servers. You can find the guide at /usr/ns-home/bin/httpd/admin/html/manual/pg/javapi.htm under Unix or at C:\Program Files\Netscape\Server\bin\httpd\admin\html\manual\pg\javapi.htm under Windows.

Hello World!

Now let's use everything we've learned to write the (you guessed it!) Hello World server-side applet. The following applet says hello to World unless a target field is given -- in which case it says hello to the target instead.

import netscape.server.applet.HttpApplet; import java.io.IOException; import java.io.PrintStream; class Hello extends HttpApplet { /* By default, we say hello to "World" */ String helloTarget = "World"; /* run() is invoked to handle the request */ public void run() throws Exception { /* getOutputStream() allows us to talk to the client */ PrintStream out = getOutputStream(); /* Use getFormField() to find out if we are to say hello to * someone other than "World". */ String formTarget = null; try { formTarget = getFormField("target"); if (formTarget != null) { helloTarget = formTarget; } } catch (IOException e) { /* We'll ignore exceptions caused by a "missing query string" */ if (! e.getMessage().startsWith("missing query string")) { handleException(e, out); } } /* Say the hello */ if (returnNormalResponse("text/html")) { try { out.println("Hello, " + helloTarget + "!"); } catch (Exception e) { handleException(e, out); } } } private void handleException(Exception e, PrintStream out) { try { returnErrorResponse("text/html", SERVER_ERROR, "Exception thrown"); } catch (IOException ioe) {} // try to print original exception out.print("&lth1>"); out.print(e); out.print("\n"); out.print("&ltpre>"); e.printStackTrace(out); // alternative PrintStream must be specified out.print("
"); להחזיר;}}

יישומון זה בצד השרת מחלקות משנה מ- netscape.server.applet.HttpApplet ועוקף את run()השיטה בדיוק כמו כל היישומונים בצד השרת תחת Netscape. הוא מקבל במהירות את זרם הפלט שלו עם שיחה getOutputStreamאליו הוא ישתמש כדי להדפיס את "שלום" (או להשתמש בו כדי להדפיס את הסיבה לכישלון). הוא מתקשר getFormFieldלבדוק אם יש יעד חלופי לשימוש, ואז מחזיר תגובה "טקסט / HTML" רגילה, ולבסוף עושה את העבודה בפועל של הדפסת "שלום". שימו לב שהוא בודק את ערך ההחזרה returnNormalResponse()מהשיחה ולא עושה דבר אם הוא מחזיר שקר. אם לא תעשה זאת, תחזיר נתונים גם headלבקשות.