2010-05-31 28 views
7

Tôi là người mới trong phát triển web với Java. Tôi đang phát triển một dịch vụ web và tôi đã chọn REST/Jersey cho dịch vụ đó.Jersey/ServletContext và tải tài nguyên khi khởi động

Tôi muốn bắt đầu một số nội dung khi khởi động dịch vụ và giữ chúng tất cả trong suốt vòng đời của dịch vụ.

Câu hỏi đầu tiên: Là người xây dựng của Jersey Servlet là một nơi tốt để làm điều đó?

Về cơ bản, những gì tôi muốn làm là tải tệp config.ini nằm trong thư mục WEB-INF của tôi. Theo dõi this help, tôi hiểu rằng tôi cần ServletContext để tải tệp của tôi dưới dạng tài nguyên.

Tuy nhiên, nó không phải là rõ ràng với tôi làm thế nào để có được điều này ServletContext trong một Jersey Servlet, vì nó không phải là thực sự là một thể hiện của một servlet, mà đúng hơn là một POJO với một số chú thích. Tôi muốn thử this tip, nhưng thuộc tính "ngữ cảnh" là null trong hàm tạo. Tôi nghĩ rằng Jersey có thể điền nó sau hàm tạo. Đúng ?

Vậy làm cách nào để thực hiện điều này?

Đây là mã của tôi cho đến nay:

/** Main REST servlet */ 
@Path("/") 
public class Servlet { 

    // ---------------------------------------------------- 
    // Constants      
    // ---------------------------------------------------- 

    static private final String CONFIG_PATH = "/WEB-INF/config.ini"; 

    // ---------------------------------------------------- 
    // Attributes      
    // ---------------------------------------------------- 

    /** Context */ 
    @Context ServletContext context; 

    // ---------------------------------------------------- 
    // Constructor      
    // ---------------------------------------------------- 

    /** Init the servlet */ 
    public Servlet() { 

     // Load config.ini from WEB-INF 
     Config.config = new Config(
       this.context.getResourceAsStream(CONFIG_PATH)); 

     // FAIL! this.context is null ... 

    } 

    // ---------------------------------------------------- 
    // URI Handlers      
    // ---------------------------------------------------- 

    /** Welcome page */ 
    @GET 
    @Path("/") 
    @Produces(MediaType.TEXT_HTML) 
    public String welcome() { 
     return "<h1>Hi there.</h1>"; 
    } 
} 

Bất kỳ trợ giúp sẽ được nhiều đánh giá cao. Cảm ơn trước,

Raphael

Trả lời

7

Tôi không quen thuộc với Jersey, nhưng nói chung trong một ứng dụng web Java, tôi nghĩ rằng điều phải làm sẽ là để tạo ra một ContextListener.

Trình nghe ngữ cảnh là lớp thực hiện giao diện javax.servlet.ServletContextListener và được định cấu hình trong tệp web.xml của bạn. Nó có một phương thức được thực hiện khi ứng dụng lần đầu tiên được mã hóa vào vùng chứa của bạn và một ứng dụng khác được thực hiện khi ứng dụng bị dừng, vì vậy đây là nơi lý tưởng để đặt một số công cụ khởi tạo một lần và dọn dẹp mọi thứ trước ứng dụng được dừng lại.

Vì vậy, các bước như sau:

  1. tạo lớp Listener của bạn, thực hiện các phương pháp contextInitialized (ServletContextEvent SCE). Trong phương thức này, bạn nhận được một ServeltContextEvent có phương thức getServletContext() cho phép bạn truy cập vào ServletContext.
  2. Cấu hình Listener của bạn trong web.xml của bạn

Bạn sẽ tìm thấy thông tin bổ sung ở đây: tutorial

Hoặc trên Sun, er, trang web của Oracle.

Nhân tiện, nếu tệp của bạn nằm trong tệp JAR, tôi không chắc chắn rằng phương pháp ServletContext là cách tốt nhất để tải nó.Tôi nghĩ rằng bạn đang tốt hơn off với somethinbg như:

this.getClass().getClassLoader().getResourceAsStream("com.company.my.file.properties"); 
+0

Xin chào, cảm ơn sự giúp đỡ của bạn. Điều này có vẻ rõ ràng hơn theo cách này, và điều này hoạt động! –

+0

Không chắc chắn những gì bạn đã làm như thế này không hoạt động: Jersey ăn nó và mã, như được viết trong hướng dẫn, không bao giờ được gọi dưới một servlet Jersey ReST. –

8

Sử dụng một ContextListener không phải là cách JAX-RS để làm điều này-- các ContextListener là "lớp tiếp theo xuống," vì nó là, trong API servlet.

Bạn có thể đặt các tuyên bố chú thích trong các tham số nhà xây dựng và nó sẽ được chuyển đến các nhà xây dựng:

public Servlet(@Context ServletContext context) { 

Sử dụng chú thích @Context cho một thành viên dữ liệu khởi mà thành viên sau khi đối tượng được xây dựng, như bạn được phát hiện.

Cách khác để thực hiện việc này là di chuyển khởi tạo đối tượng Config thành một số loại cuộc gọi init và chỉ khởi tạo nó khi cần, tức là khởi tạo lười. Sau đó, thành viên dữ liệu ServletContext sẽ đã được thiết lập bởi khung công tác Jersey.

Chúc may mắn!

Kirk

+0

Bạn có thể khai báo rằng là thuộc tính của lớp trong trường hợp nhiều phương thức cần nhận cùng một ... Nó được tiêm tự động và dễ dàng hơn. Không cần phải vượt qua nó trong constructor! –

Các vấn đề liên quan