java

shani321

New member
java

משהו יודע איך מקבלים ב-java את ה-session הנוכחי (בלי לשלוח אותו כפרמטר?) משהו מעין: HttpContext.Current. בדוט נט. תודה מראש
 

guznik

New member
איפה אתה?

בדף JSP אתה יכול פשוט לכתוב session (עם s קטנה ובלי סוגריים) אבל זה גועל נפש לכתוב קוד שרת ב-JSP. בתוך servlet במתודות doGet ו-doPost יש לנו את הפרמטר request, אז מקבלים את ה-session ע"י
request.getSession()​
 

shani321

New member
בעייתי

אני לא ב-jsp ולא ב-servlets. ועדיין אני רוצה לגשת לפרמטרים של ה-session בלי לשלוח את ה-session לאורך כל המערכת שלי. האם ישנה אפשרות כזו?
 

justme5

New member
אז שלח רק את הפרמטרים...

למיטב הבנתי, רק servlets (ו jsp שלמעשה הם גם סרבלטים) הם Http-aware...
 

shani321

New member
עדיין בעייתי

כיוון שיש לי תוכנה די מסובכת ואני צריכה לגשת מתוכה למשתני סביבה, רק שהם עבור session. וע"פ מה שאני יודעת יש משהו מעין זה בדוט נט : HttpContext.Current. המון תודה למי שיעזור.
 

guznik

New member
מסובכת?

אם מודול צריך לגשת למשתנים מחוץ לטווח שלו, זה עיצוב גרוע. הדבר הנכון לעשות הוא לעצב את המערכת ככה שהמתודה שלך תקבל את ה-session או את ה-request כפרמטר. את בטוחה שאת מתכוונת ל-session ולא ל-application? יש מתודה של HttpServlet שהיא ()getServletContext והיא מחזירה את ה-application.
 

shani321

New member
עיצוב גרוע?

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

guznik

New member
פרמטרים

אני מניח שהמודול שאנחנו מדברים עליו לא עושה שום פעולת HTTP באף כיוון. הדרך הכי נכונה שאני רואה היא לשלוף את כל משתני הסביבה האלה ב-servlet ולשלוח אותם כפרמטרים למתודה שצריכה אותם במודול האחר. הרעיון הוא שהמודול הזה בכלל לא ידע שמדובר במשתני session, ואם יהיה צורך תוכלי לשנות את כל שכבת ה-servlets/JSP מבלי שתהיה לזה השפעה על צורת הפעולה של המודול. אם תוכלי לפרט יותר על המערכת שלך אני אוכל לתת התייחסות יותר מדוייקת.
 

shani321

New member
אני אנסה להסביר שוב

אולי ע"י דוגמא: אנו רוצים ליצור Log file למשתמש. והבעיה היא שהכתיבה ללוג נעשית מכל מיני מקומות שאין בינהם קשר ל-jsp. הפתרון באפליקציה שאינה web-ית הוא ליצור סנגלטון עבור כל ריצה. פתרון שלא יכול לעבוד ב-web כיוון שסנגלטון כזה יהיה משותף לכל הריצות.
 

guznik

New member
OK

סבבה. אם את רוצה לוגר עבור כל session, פשוט תאתחלי אותו כשהמשתמש מתחבר ותאכסני אותו כפרמטר ב-session. למשל:
Object logger = new Object(); request.getSession().setAttribute("LOGGER", logger);​
כל פעם שתרצי להשתמש בלוגר, נניח שיש לו מתודה write אז תמשכי אותו מה-session ותקראי למתודת הכתיבה שלו, למשל:
request.getSession().getAttribute("LOGGER").write("message")​
כמובן אל תשכחי לעשות casting. כמובן שאם מודול אחר שהוא לא servlet צריך להשתמש בלוגר, צריך להעביר למתודה שמשתמשת בו את הלוגר עצמו כשקוראים למתודה הזאת מה-servlet.
 

shani321

New member
יפה אבל...

תחשוב שיש במערכת די הרבה מודולים, שאין קשר בינם לבין ה-web. האם לכל מודול כזה אני צריכה לגרור את ה-session. או להעביר לה רפרנס ללוגר?????
 

guznik

New member
או ככה או עם Singleton

אני ממליץ על הלוגר ולא על ה-session כי אחד העקרונות בעיצוב נכון הוא שמבני הנתונים המועברים כפרמטרים יהיו מטיפוס הנתונים המינימלי שמאפשר עבודה - לא מעניין אותנו שום דבר ב-session חוץ מהלוגר. לחילופין תוכלי לעבוד עם Singleton - תצטרכי לדאוג שתהיה לו איזו מתודה (לא בקונסטרקטור) שבה תאתחלי את הנתונים הקשורים למשתמש בהתחלה.
 
למעלה