كيف يمكنني مشاركة متغير أو كائن بين اثنين أو أكثر من Servlets؟

StackOverflow https://stackoverflow.com/questions/123657

  •  02-07-2019
  •  | 
  •  

سؤال

أود أن أعرف ما إذا كانت هناك طريقة ما لمشاركة متغير أو كائن بين اثنين أو أكثر من Servlets، أعني طريقة "قياسية".أفترض أن هذه ليست ممارسة جيدة ولكنها طريقة أسهل لبناء نموذج أولي.

لا أعرف إذا كان ذلك يعتمد على التقنيات المستخدمة، لكنني سأستخدم Tomcat 5.5


أرغب في مشاركة متجه كائنات من فئة بسيطة (فقط السمات العامة، والسلاسل، والنص، وما إلى ذلك).أنوي الحصول على بيانات ثابتة كما هو الحال في قاعدة البيانات، ومن الواضح أنها ستفقد عندما يتم إيقاف Tomcat.(إنها فقط للاختبار)

هل كانت مفيدة؟

المحلول

أعتقد أن ما تبحث عنه هنا هو بيانات الطلب أو الجلسة أو التطبيق.

في servlet يمكنك إضافة كائن كسمة لكائن الطلب أو كائن الجلسة أو كائن سياق servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) {
    String shared = "shared";
    request.setAttribute("sharedId", shared); // add to request
    request.getSession().setAttribute("sharedId", shared); // add to session
    this.getServletConfig().getServletContext().setAttribute("sharedId", shared); // add to application context
    request.getRequestDispatcher("/URLofOtherServlet").forward(request, response);
}

إذا قمت بوضعه في كائن الطلب، فسيكون متاحًا للخادم الذي تتم إعادة توجيهه إليه حتى يتم الانتهاء من الطلب:

request.getAttribute("sharedId");

إذا قمت بوضعها في الجلسة، فستكون متاحة لجميع السيرفلتس من الآن فصاعدًا ولكن القيمة ستكون مرتبطة بالمستخدم:

request.getSession().getAttribute("sharedId");

حتى تنتهي الجلسة بناءً على عدم نشاط المستخدم.

تمت إعادة تعيينه بواسطتك:

request.getSession().invalidate();

أو يقوم servlet واحد بإزالته من النطاق:

request.getSession().removeAttribute("sharedId");

إذا قمت بوضعه في سياق servlet، فسيكون متاحًا أثناء تشغيل التطبيق:

this.getServletConfig().getServletContext().getAttribute("sharedId");

حتى تقوم بإزالته:

this.getServletConfig().getServletContext().removeAttribute("sharedId");

نصائح أخرى

ضعه في أحد النطاقات الثلاثة المختلفة.

الطلب - يدوم عمر الطلب

الجلسة - تدوم مدة جلسة المستخدم

التطبيق - يستمر حتى يتم إيقاف التطبيق

يمكنك الوصول إلى كل هذه النطاقات عبر متغير HttpServletRequest الذي يتم تمريره إلى الطرق التي تمتد من فئة HttpServlet

يعتمد على نطاق الاستخدام المقصود للبيانات.

إذا تم استخدام البيانات فقط على أساس كل مستخدم، مثل معلومات تسجيل دخول المستخدم، وعدد زيارات الصفحة، وما إلى ذلك.استخدم كائن الجلسة (httpservletrequest.getSession (). get/setAttribute (سلسلة [، كائن])))

إذا كانت نفس البيانات عبر عدة مستخدمين (إجمالي عدد زيارات صفحة الويب، وسلاسل العمليات، وما إلى ذلك) فاستخدم سمات ServletContext.servlet.getServletCongfig().getServletContext().get/setAttribute(String [,Object])).سيعمل هذا فقط ضمن نفس ملف الحرب/تطبيق الويب.لاحظ أن هذه البيانات لا تستمر عبر عمليات إعادة التشغيل أيضًا.

خيار آخر، مشاركة البيانات بين السياقات...

مشاركة البيانات بين servlets-on-tomcat

  <Context path="/myApp1" docBase="myApp1" crossContext="true"/>
  <Context path="/myApp2" docBase="myApp2" crossContext="true"/>

على myApp1:

  ServletContext sc = getServletContext();
  sc.setAttribute("attribute", "value");

على myApp2:

  ServletContext sc = getServletContext("/myApp1");
  String anwser = (String)sc.getAttribute("attribute");

ألا يمكنك فقط وضع الكائن في جلسة HttpSession ثم الرجوع إليه باسم السمة الخاص به في كل من السيرفلتس؟

على سبيل المثال:

getSession().setAttribute("thing", object);

... ثم في servlet آخر:

Object obj = getSession.getAttribute("thing");

إليك كيفية القيام بذلك مع جيتي.

https://stackoverflow.com/a/46968645/1287091

يستخدم سياق الخادم، حيث تتم كتابة المفردة أثناء بدء تشغيل خادم Jetty المضمن ومشاركتها بين جميع تطبيقات الويب طوال عمر الخادم.يمكن استخدامه أيضًا لمشاركة الكائنات/البيانات بين تطبيقات الويب بافتراض وجود كاتب واحد فقط للسياق - وإلا عليك أن تضع في اعتبارك التزامن.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top