การเข้าถึงคุณสมบัติ web.xml จาก Java Bean: คู่มือปฏิบัติ

เมื่อพัฒนาแอปพลิเคชัน Java โดยเฉพาะอย่างยิ่งแอปพลิเคชันที่ถูกออกแบบมาให้ทำงานในทั้งสภาพแวดล้อมเว็บและที่ทำงานแบบสแตนด์อโลน คุณอาจพบว่าตัวเองต้องการเข้าถึงคุณสมัติที่กำหนดไว้ในไฟล์ web.xml อย่างไรก็ตามนี่อาจเป็นเรื่องที่ยุ่งยาก โดยเฉพาะอย่างยิ่งถ้าคุณต้องการให้คอมโพเนนต์ไม่ขึ้นกับ Servlet container ในโพสต์บล็อกนี้ เราจะพูดถึงปัญหานี้และนำเสนอวิธีแก้ไขที่ชัดเจนและเป็นขั้นตอน

ปัญหา

นักพัฒนา Java มักจะต้องเข้าถึงข้อมูลการกำหนดค่าที่เก็บไว้ในไฟล์ web.xml—พารามิเตอร์ที่สำคัญต่อการทำงานของแอปพลิเคชัน—ในขณะที่ยังคงรักษาสถาปัตยกรรมที่สะอาด ไฟล์นี้อาจมีความเกี่ยวข้องเป็นพิเศษสำหรับคลาส Factory ซึ่งคุณไม่ต้องการ เชื่อมโยงตรรกะของคุณโดยตรงกับ Servlet API ในกรณีเช่นนี้ การพึ่งพา ServletConfig หรือวัตถุที่เฉพาะเจาะจงกับเว็บอื่น ๆ อาจนำไปสู่ข้อจำกัดและอุปสรรค

คุณอาจต้องการรวมตรรกะในคลาส Factory ของคุณเพื่อตรวจสอบหลายแหล่งการกำหนดค่าในลำดับชั้น:

  • ไฟล์ properties ใน classpath
  • พารามิเตอร์การเริ่มต้นจาก web.xml
  • คุณสมบัติของระบบ
  • การตั้งค่าเริ่มต้นถ้าไม่มีการกำหนดค่าอื่น ๆ

เป้าหมายคือการออกแบบระบบที่ทำงานได้อย่างราบรื่นทั้งภายในเว็บคอนเทนเนอร์และนอก เช่น ในบริบทของบรรทัดคำสั่ง

วิธีแก้ปัญหา

เพื่อแก้ปัญหานี้อย่างมีระเบียบ คุณสามารถใช้ ServletContextListener นี่คือวิธีการดำเนินการทีละขั้นตอน

ขั้นตอนที่ 1: สร้าง ServletContextListener

ลิสต์เซอร์นี้จะทำงานโดยอัตโนมัติเมื่ออินสแตนซ์แอปพลิเคชันถูกเริ่มต้นและสามารถดึงคุณสมัติที่กำหนดไว้ใน web.xml นี่คือการใช้งาน:

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);
    }
}

ขั้นตอนที่ 2: กำหนดคลาส Factory

ถัดไป เราจำเป็นต้องมีคลาส Factory ที่เรียบง่ายซึ่งจะเก็บคุณสมัติเหล่านี้เพื่อการเข้าถึงในภายหลัง:

public class Factory {

    static Properties _servletContextProperties = new Properties();

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

ขั้นตอนที่ 3: อัปเดต web.xml

ตอนนี้เพื่อรวมลิสต์เซอร์นี้กับแอปพลิเคชันเว็บของคุณ คุณต้องลงทะเบียนมันใน web.xml ของคุณ:

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

วิธีการทำงาน

  • เมื่อแอปพลิเคชันเว็บถูกปรับใช้ FactoryInitialisingServletContextListener จะถูกเรียกใช้โดยเว็บคอนเทนเนอร์
  • ในระหว่างการทำงานของวิธี contextInitialized มันจะรวบรวมพารามิเตอร์ของบริบททั้งหมดที่กำหนดไว้ใน web.xml และเติมลงในวัตถุ Properties
  • วัตถุ Properties จะถูกเก็บไว้ใน Factory ซึ่งสามารถเข้าถึงได้ทุกจุดในแอปพลิเคชันของคุณ

รันนอกเว็บคอนเทนเนอร์

หากแอปพลิเคชันของคุณทำงานนอกเว็บคอนเทนเนอร์จริงๆ _servletContextProperties จะยังคงว่างเปล่า ซึ่งช่วยให้แอปพลิเคชันของคุณรักษาฟังก์ชันการทำงานโดยไม่ต้องพึ่งพา Servlet API อย่างหนัก

สรุป

วิธีนี้ให้วิธีที่สะอาดและมีประสิทธิภาพในการเข้าถึงคุณสมัติ web.xml จาก Java Bean หรือคลาส Factory โดยไม่ต้องเชื่อมโยงโค้ดของคุณกับ Servlet container อย่างใกล้ชิด โดยการใช้ ServletContextListener คุณสามารถจัดการการกำหนดค่าของแอปพลิเคชันได้อย่างมีระเบียบในขณะที่รักษาความหลากหลายสำหรับแอปพลิเคชันเว็บและเครื่องมือบรรทัดคำสั่งที่ทำงานอย่างอิสระ

หากคุณกำลังมองหาวิธีที่มีประสิทธิภาพในการจัดการการกำหนดค่าของแอปพลิเคชันในขณะที่ยังคงรักษาโค้ดของคุณให้สะอาดและไม่ขึ้นต่อกัน นี่คือกลยุทธ์ที่ควรนำไปใช้!