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