phương thức init()

Và một vài điều nhỏ hữu ích khác. Tất nhiên, tôi đang nói về việc khởi tạo servlet. Như bạn đã biết, sau khi máy chủ web đã tạo đối tượng servlet và đặt nó vào vùng chứa, nó sẽ gọi phương thức init() của servlet . Bạn có thể ghi đè phương thức này và khởi tạo bất cứ thứ gì bạn cần trong đó.

Tại sao không sử dụng hàm tạo?

Bởi vì quá trình tạo một servlet diễn ra như sau:

  • Chúng tôi tạo một đối tượng kế thừa từHttpServlet
  • Tạo một đối tượngServletContext, thêm biến servlet của nó
  • Tạo một đối tượngServletConfig, thêm biến servlet của nó
  • Máy chủ web đính kèm servlet vào vùng chứa
  • Gọi phương thức init()

Trong hàm tạo của servlet của bạn, rất nhiều biến nội bộ của nó vẫn chưa được khởi tạo. Vùng chứa không biết gì về servlet của bạn, servlet của bạn không biết gì về ngữ cảnh của nó. Tôi nghĩ mọi thứ đều rõ ràng ở đây.

Hãy viết một servlet, khi được khởi tạo, sẽ tìm thấy một tệp thuộc tính với các cài đặt:

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

Ở đây chúng ta tạo một đối tượngCủa cảivà tải dữ liệu từ tệp config.properties vào đó . Chà, trong tương lai bạn có thể ra khỏi đối tượngCủa cảicác tùy chọn khác nhau như dữ liệu để truy cập cơ sở dữ liệu, vd.

Cách tải tệp thuộc tính chính xác

Nhân tiện, nếu servlet của bạn không chạy trên máy tính thì sao?

Giả sử họ đã viết nó ở đây và nó chạy trên một máy chủ ở một nơi nào đó trên thế giới. Hoặc nhiều máy chủ. Làm cách nào để tải tệp thuộc tính chính xác trong trường hợp này?

Câu hỏi hay. Thông thường, khi chạy, một servlet chỉ biết đường dẫn tương đối của các tệp thuộc tính chứ không biết đường dẫn tuyệt đối của nó, bởi vì các tệp chiến tranh của servlet có thể được lưu trữ ở bất kỳ đâu.

Vì vậy, chúng ta cần tìm ra đường dẫn lưu trữ servlet của chúng ta (servlet đã được khởi tạo) và thêm một đường dẫn tương đối vào đó :)

Nó trông giống như thế này:

String path = absoluteServletParh + "relative path";

Và, như mọi khi, một nhiệm vụ cơ bản như vậy thường có một chữ “nhưng” nho nhỏ của riêng nó. servlet của bạn và tệp thuộc tính của nó được lưu trữ bên trong kho lưu trữ :) Tất nhiên là không nhất thiết, nhưng nó sẽ xảy ra. tệp thuộc tính thường được lưu trữ bên trong tệp jar hoặc tệp chiến tranh.

Tức là tệp của bạn có thể không có đường dẫn vật lý trên đĩa. Nhưng vì vùng chứa có thể tải servlet của bạn nên rất có thể nó cũng có thể tải tệp thuộc tính của bạn.

Để làm điều này, bạn cần lấy đối tượng trình nạp lớp (Trình tải lớp) và yêu cầu anh ấy tải tệp của bạn lên. Đây là những gì nó sẽ trông giống như:

ClassLoader loader = Thread.currentThread().getContextClassLoader();
InputStream stream = loader.getResourceAsStream("/config.properties");

Properties prop = new Properties();
prop.load(stream);

Phương thức getConfig()

Nhân tiện, không phải tất cả các tham số đều có thể được chuyển đến servlet trong các tệp thuộc tính. Ví dụ: servlet của bạn tương tác với các servlet khác trong ứng dụng web phân tán.

Sau đó, bạn cần đảm bảo rằng bộ chứa chuyển tất cả thông tin cần thiết tới servlet của bạn khi nó gọi phương thức init() của nó . Hơn nữa, anh ấy chỉ làm điều đó.

Servlet của bạn (hãy nhớ rằng nó được kế thừa từ lớp HttpServlet ) có phương thức getServletConfig() . trả về một đối tượngServletConfig, được tạo và khởi tạo bởi vùng chứa. Đối tượng này có các phương thức sau:

getInitParameterNames() Trả về danh sách tên tham số servlet
getInitParameter(Tên chuỗi) Trả về một tham số servlet theo tên của nó
getServletName() Trả về tên riêng của servlet
getServletContext() Trả về một đối tượngServletContext

Hãy viết một servlet trả về danh sách các tham số của nó từServletConfig'MỘT. Đặt chúng ở đó sẽ thông qua tệp 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>

Một servlet có thể lấy các tham số của nó bằng cách sử dụng mã:

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