هل هناك طريقة للوصول إلى خصائص web.xml من Java Bean؟

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

  •  09-06-2019
  •  | 
  •  

سؤال

هل هناك أي طريقة في Servlet API للوصول إلى الخصائص المحددة في web.xml (مثل معلمات التهيئة) من داخل فئة Bean أو Factory غير المرتبطة على الإطلاق بحاوية الويب؟

على سبيل المثال، أنا أكتب فئة Factory، وأرغب في تضمين بعض المنطق داخل Factory للتحقق من التسلسل الهرمي للملفات ومواقع التكوين لمعرفة أي منها متاح، إن وجد، لتحديد فئة التنفيذ التي سيتم إنشاء مثيل لها - على سبيل المثال،

  1. ملف الخصائص في مسار الفصل،
  2. معلمة web.xml،
  3. خاصية النظام، أو
  4. بعض المنطق الافتراضي إذا لم يكن هناك شيء آخر متاح.

أود أن أكون قادرًا على القيام بذلك دون إدخال أي إشارة إلى ServletConfig أو أي شيء مشابه لـ My Factory - يجب أن يكون الكود قادرًا على التشغيل بشكل جيد خارج حاوية Servlet.

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

إذا كنت أتذكر بشكل صحيح، .NET لديه شيء من هذا القبيل Request.GetCurrentRequest() للحصول على إشارة إلى التنفيذ الحالي Request - ولكن نظرًا لأن هذا تطبيق Java، فأنا أبحث عن شيء مشابه يمكن استخدامه للوصول إليه ServletConfig.

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

المحلول

إحدى الطرق التي يمكنك من خلالها القيام بذلك هي:

public class FactoryInitialisingServletContextListener implements ServletContextListener {

    public void contextDestroyed(ServletContextEvent event) {
    }

    public void contextInitialized(ServletContextEvent event) {
        Properties properties = new Properties();
        ServletContext servletContext = event.getServletContext();
        Enumeration<?> keys = servletContext.getInitParameterNames();
        while (keys.hasMoreElements()) {
            String key = (String) keys.nextElement();
            String value = servletContext.getInitParameter(key);
            properties.setProperty(key, value);
        }
        Factory.setServletContextProperties(properties);
    }
}

public class Factory {

    static Properties _servletContextProperties = new Properties();

    public static void setServletContextProperties(Properties servletContextProperties) {
        _servletContextProperties = servletContextProperties;
    }
}

ثم قم بما يلي في ملف web.xml الخاص بك

<listener>
    <listener-class>com.acme.FactoryInitialisingServletContextListener<listener-class>
</listener>

إذا كان تطبيقك يعمل في حاوية ويب، فسيتم استدعاء المستمع بواسطة الحاوية بمجرد إنشاء السياق.في هذه الحالة، سيتم استبدال _servletContextProperties بأي معلمات سياق محددة في web.xml.

إذا كان تطبيقك يعمل خارج حاوية الويب، فستكون _servletContextProperties فارغة.

نصائح أخرى

هل فكرت في استخدام إطار الربيع لهذا؟بهذه الطريقة، لن تحصل حبوبك على أي قوة إضافية، وسيتولى الزنبرك إعداد التكوين نيابةً عنك.

أعتقد أنه سيتعين عليك إضافة فئة تمهيد مرتبطة والتي تأخذ إشارة إلى ServletConfig (أو ServletContext) وتقوم بنسخ هذه القيم إلى فئة المصنع.على الأقل بهذه الطريقة يمكنك حزمها بشكل منفصل.

@أدوات :ممتاز، وأكثر تواضعًا - هذا شيء كنت أحاول القيام به منذ فترة

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