Đường dẫn tệp đến tài nguyên trong thư mục war / WEB-INF của chúng tôi?


95

Tôi có một tệp trong thư mục war / WEB-INF của dự án công cụ ứng dụng của tôi. Tôi đọc trong Câu hỏi thường gặp rằng bạn có thể đọc một tệp từ đó trong ngữ cảnh servlet. Mặc dù vậy, tôi không biết cách tạo đường dẫn đến tài nguyên:

/war/WEB-INF/test/foo.txt

Làm cách nào để tạo đường dẫn đến tài nguyên đó để sử dụng với File (), giống như nó ở trên?

Cảm ơn

Câu trả lời:


138

Có một số cách để làm điều này. Miễn là tệp WAR được mở rộng (một tập hợp các tệp thay vì một tệp .war), bạn có thể sử dụng API này:

ServletContext context = getContext();
String fullPath = context.getRealPath("/WEB-INF/test/foo.txt");

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getRealPath(java.lang.String)

Điều đó sẽ cung cấp cho bạn đường dẫn hệ thống đầy đủ đến tài nguyên bạn đang tìm kiếm. Tuy nhiên, điều đó sẽ không hoạt động nếu Servlet Container không bao giờ mở rộng tệp WAR (như Tomcat). Những gì sẽ hoạt động bằng cách sử dụng các getResourcephương thức của ServletContext .

ServletContext context = getContext();
URL resourceUrl = context.getResource("/WEB-INF/test/foo.txt");

hoặc cách khác nếu bạn chỉ muốn luồng đầu vào:

InputStream resourceContent = context.getResourceAsStream("/WEB-INF/test/foo.txt");

http://tomcat.apache.org/tomcat-5.5-doc/servletapi/javax/servlet/ServletContext.html#getResource(java.lang.String)

Cách tiếp cận thứ hai sẽ hoạt động cho dù bạn sử dụng Servlet Container nào và ứng dụng được cài đặt ở đâu. Cách tiếp cận trước đây sẽ chỉ hoạt động nếu tệp WAR được giải nén trước khi triển khai.

CHỈNH SỬA: Phương thức getContext () rõ ràng là thứ bạn sẽ phải triển khai. Các trang JSP cung cấp nó dưới dạng contexttrường. Trong một servlet, bạn lấy nó từ của bạn ServletConfig, nó được chuyển vào init()phương thức của servlet . Nếu bạn lưu trữ nó tại thời điểm đó, bạn có thể nhận ServletContext bất kỳ lúc nào bạn muốn sau đó.


3
Cần chỉ ra rằng tôi cần đặt một ký tự đầu / trong đường dẫn để làm cho nó hoạt động, như sau: context.getResourceAsStream ("/ WEB-INF / test / foo.txt");
Mick Sear

1
Không hoạt động đơn giản trên appengine, vì câu hỏi được gắn thẻ.
Renascienza

2
Nó được đánh dấu là câu trả lời đúng 6 năm trước. Google đã thay đổi API của công cụ ứng dụng hoặc có lỗi trong quá trình triển khai của bạn. Nếu bạn đang chạy một Servlet tiêu chuẩn, bạn sẽ có thể sử dụng context.getResourceAsStream()biến thể.
Berin Loritsch

2
điều này có vẻ tốt, nhưng tôi đang sử dụng java 1.8 và getContext () không tồn tại theo mặc định, tệp jar nào là cần thiết để sử dụng nó?
f1wade 20/09/2016

3
ServletContext là một phần của javax.servletgói thư viện J2EE của bạn. Bạn nhận được một tham chiếu đến nó từ lớp servlet (tức là những gì mở rộng java.servlet.GenericServlet). BTW, GenericServlet bây giờ có một phương pháp để getServletContext() docs.oracle.com/javaee/6/api/javax/servlet/...
Berin Loritsch


1

Tôi biết điều này là muộn, nhưng đây là cách tôi thường làm,

ClassLoader classLoader = Thread.currentThread().getContextClassLoader();           
InputStream stream = classLoader.getResourceAsStream("../test/foo.txt");
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.