init() วิธีการ
และสิ่งเล็ก ๆ น้อย ๆ ที่มีประโยชน์อื่น ๆ แน่นอน ฉันกำลังพูดถึงการเริ่มต้นเซิร์ฟเล็ต ดังที่คุณทราบแล้ว หลังจากที่เว็บเซิร์ฟเวอร์สร้างวัตถุเซิร์ฟเล็ตและวางไว้ ในคอนเทนเนอร์ เว็บเซิร์ฟเวอร์จะเรียกใช้เมธอดinit() ของเซิร์ฟเล็ต คุณสามารถแทนที่วิธีนี้และเริ่มต้นสิ่งที่คุณต้องการ
ทำไมไม่ใช้ตัวสร้าง?
เนื่องจากกระบวนการสร้างเซิร์ฟเล็ตเป็นดังนี้:
- เราสร้างวัตถุที่สืบทอดมาจากhttpServlet
- สร้างวัตถุบริบทเซิร์ฟเล็ตเพิ่มตัวแปรเซิร์ฟเล็ต
- สร้างวัตถุการกำหนดค่าเซิร์ฟเล็ตเพิ่มตัวแปรเซิร์ฟเล็ต
- …
- เว็บเซิร์ฟเวอร์แนบเซิร์ฟเล็ตกับคอนเทนเนอร์
- เรียกใช้ เมธอด init()
ในตัวสร้างของเซิร์ฟเล็ตของคุณ ตัวแปรภายในจำนวนมากยังไม่ได้เริ่มต้น คอนเทนเนอร์ไม่รู้อะไรเลยเกี่ยวกับเซิร์ฟเล็ตของคุณ เซิร์ฟเล็ตของคุณไม่รู้อะไรเลยเกี่ยวกับบริบทของมัน ฉันคิดว่าทุกอย่างชัดเจนที่นี่
มาเขียนเซิร์ฟเล็ตที่เมื่อเตรียมใช้งาน ค้นหาไฟล์คุณสมบัติพร้อมการตั้งค่า:
public class PropertiesServlet extends HttpServlet {
public init() {
try (InputStream input = new FileInputStream("c:/path/to/config.properties")) {
Properties prop = new Properties();
prop.load(input);
String databaseURL = prop.getProperty("db.url");
String databaseUser = prop.getProperty("db.user ");
String databasePassword = prop.getProperty("db.password");
}
}
}
ที่นี่เราสร้างวัตถุคุณสมบัติและโหลดข้อมูลจาก ไฟล์config.propertiesเข้าไป ในอนาคตคุณสามารถออกจากวัตถุได้คุณสมบัติตัวเลือกต่างๆ เช่น ข้อมูลในการเข้าถึงฐานข้อมูล เช่น
วิธีโหลดไฟล์คุณสมบัติอย่างถูกต้อง
อย่างไรก็ตาม จะเกิดอะไรขึ้นหากเซิร์ฟเล็ตของคุณไม่ทำงานบนคอมพิวเตอร์ของคุณ
สมมติว่าพวกเขาเขียนมันที่นี่ และมันทำงานบนเซิร์ฟเวอร์ที่ไหนสักแห่งในส่วนอื่นของโลก หรือหลายเซิร์ฟเวอร์ จะโหลดไฟล์คุณสมบัติอย่างถูกต้องในกรณีนี้ได้อย่างไร?
คำถามที่ดี. โดยปกติ เมื่อรันเซิร์ฟเล็ตจะรู้เฉพาะพาธสัมพัทธ์ของไฟล์คุณสมบัติ ไม่ใช่พาธสัมบูรณ์ เนื่องจากไฟล์ servlet war สามารถเก็บไว้ที่ใดก็ได้
ดังนั้นเราต้องค้นหาเส้นทางที่เก็บเซิร์ฟเล็ตของเรา (เซิร์ฟเล็ตได้รับการเริ่มต้นแล้ว) และเพิ่มเส้นทางสัมพัทธ์เข้าไป :)
ดูเหมือนว่า:
String path = absoluteServletParh + "relative path";
และเช่นเคย งานพื้นฐานดังกล่าวมักมีคำว่า "แต่" เพียงเล็กน้อย เซิร์ฟเล็ตและไฟล์คุณสมบัติของคุณถูกเก็บไว้ในไฟล์เก็บถาวร :) ไม่จำเป็นแน่นอน แต่มันเกิดขึ้น ไฟล์คุณสมบัติมักจะถูกเก็บไว้ในไฟล์ jar หรือ war
นั่นคือ ไฟล์ของคุณอาจไม่มีฟิสิคัลพาธบนดิสก์ แต่เนื่องจากคอนเทนเนอร์สามารถโหลดเซิร์ฟเล็ตของคุณได้ จึงน่าจะสามารถโหลดไฟล์คุณสมบัติของคุณได้เช่นกัน
ในการทำเช่นนี้ คุณต้องได้รับวัตถุตัวโหลดคลาส (ตัวโหลดคลาส) และขอให้เขาอัปโหลดไฟล์ของคุณ นี่คือสิ่งที่จะมีลักษณะ:
ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("/config.properties");
Properties prop = new Properties();
prop.load(stream);
เมธอด getConfig()
อย่างไรก็ตาม ไม่สามารถส่งพารามิเตอร์ทั้งหมดไปยังเซิร์ฟเล็ตในไฟล์คุณสมบัติได้ ตัวอย่างเช่น เซิร์ฟเล็ตของคุณโต้ตอบกับเซิร์ฟเล็ตอื่นในเว็บแอปพลิเคชันแบบกระจาย
จากนั้นคุณต้องแน่ใจว่าคอนเทนเนอร์ส่งข้อมูลที่จำเป็นทั้งหมดไปยังเซิร์ฟเล็ตของคุณเมื่อเรียกใช้เมธอดinit () ยิ่งกว่านั้นเขาทำอย่างนั้น
เซิร์ฟเล็ตของคุณ (โปรดจำไว้ว่าสืบทอดมาจากคลาสHttpServlet ) มี เมธอด getServletConfig() ซึ่งส่งคืนวัตถุการกำหนดค่าเซิร์ฟเล็ตสร้างและเริ่มต้นโดยคอนเทนเนอร์ วัตถุนี้มีวิธีการต่อไปนี้:
getInitParameterNames() | ส่งคืนรายชื่อพารามิเตอร์เซิร์ฟเล็ต |
getInitParameter(ชื่อสตริง) | ส่งคืนพารามิเตอร์เซิร์ฟเล็ตตามชื่อ |
getServletName() | ส่งคืนชื่อของตัวเองของเซิร์ฟเล็ต |
getServletContext() | ส่งกลับวัตถุบริบทเซิร์ฟเล็ต |
มาเขียนเซิร์ฟเล็ตที่ส่งคืนรายการพารามิเตอร์จากการกำหนดค่าเซิร์ฟเล็ต'อ. วางไว้ที่นั่นผ่านไฟล์ web.xml:
<web-app>
<servlet>
<servlet-name>Print-Servlet</servlet-name>
<servlet-class>PrintServlet</servlet-class>
<init-param>
<param-name>jdbc-driver</param-name>
<param-value>sun.jdbc.odbc.JdbcOdbcDriver</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name>Print-Servlet</servlet-name>
<url-pattern>/print</url-pattern>
</servlet-mapping>
</web-app>
เซิร์ฟเล็ตสามารถรับพารามิเตอร์โดยใช้รหัส:
public class PrintServlet extends HttpServlet {
public void init() {
ServletConfig config = this.getServletConfig();
Enumeration<String> initParameterNames = config.getInitParameterNames();
while (initParameterNames.hasMoreElements()){
String key = initParameterNames.nextElement();
System.out.println("%s: %s\n", key, config.getInitParameter(key));
}
}
}
GO TO FULL VERSION