การเข้าถึงคุณสมบัติ 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
คุณสามารถจัดการการกำหนดค่าของแอปพลิเคชันได้อย่างมีระเบียบในขณะที่รักษาความหลากหลายสำหรับแอปพลิเคชันเว็บและเครื่องมือบรรทัดคำสั่งที่ทำงานอย่างอิสระ
หากคุณกำลังมองหาวิธีที่มีประสิทธิภาพในการจัดการการกำหนดค่าของแอปพลิเคชันในขณะที่ยังคงรักษาโค้ดของคุณให้สะอาดและไม่ขึ้นต่อกัน นี่คือกลยุทธ์ที่ควรนำไปใช้!