Đặc tả Servlet 2.4 cho biết điều này về WEB-INF (trang 70):
Một thư mục đặc biệt tồn tại trong hệ thống phân cấp ứng dụng có tên
WEB-INF
. Thư mục này chứa tất cả những thứ liên quan đến ứng dụng không có trong tài liệu gốc của ứng dụng. Các
WEB-INF
nút không phải là một phần của cây tài liệu công cộng của ứng dụng . Không có tập tin nào trong WEB-INF
thư mục có thể được phục vụ trực tiếp cho khách hàng bởi container. Tuy nhiên, nội dung của
WEB-INF
thư mục được hiển thị với mã servlet bằng cách sử dụng các cuộc gọi getResource
và getResourceAsStream
phương thức trên ServletContext
và có thể được hiển thị bằng các RequestDispatcher
cuộc gọi.
Điều này có nghĩa là các WEB-INF
tài nguyên có thể truy cập được vào trình tải tài nguyên của Ứng dụng web của bạn và không hiển thị trực tiếp cho công chúng.
Đây là lý do tại sao rất nhiều dự án đưa các tài nguyên của họ như các tệp tin JSP, JAR / thư viện và các tệp lớp hoặc tệp thuộc tính của riêng họ hoặc bất kỳ thông tin nhạy cảm nào khác vào WEB-INF
thư mục. Nếu không, họ có thể truy cập bằng cách sử dụng một URL tĩnh đơn giản (chẳng hạn để tải CSS hoặc Javascript chẳng hạn).
Các tệp tin của bạn có thể ở bất cứ đâu mặc dù từ góc độ kỹ thuật. Chẳng hạn, trong Spring, bạn có thể định cấu hình chúng WEB-INF
rõ ràng:
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
p:prefix="/WEB-INF/jsp/"
p:suffix=".jsp" >
</bean>
Các WEB-INF/classes
và WEB-INF/lib
thư mục được đề cập trong bài viết tệp WAR của Wikipedia là ví dụ về các thư mục được yêu cầu bởi đặc tả Servlet khi chạy.
Điều quan trọng là tạo sự khác biệt giữa cấu trúc của dự án và cấu trúc của tệp WAR kết quả.
Cấu trúc của dự án trong một số trường hợp sẽ phản ánh một phần cấu trúc của tệp WAR (đối với các tài nguyên tĩnh như tệp JSP hoặc tệp HTML và JavaScript, nhưng điều này không phải lúc nào cũng đúng.
Việc chuyển đổi từ cấu trúc dự án sang tệp WAR kết quả được thực hiện bởi một quá trình xây dựng.
Mặc dù bạn thường được tự do thiết kế quy trình xây dựng của riêng mình, ngày nay hầu hết mọi người sẽ sử dụng một cách tiếp cận được tiêu chuẩn hóa như Apache Maven . Trong số những thứ khác, Maven định nghĩa mặc định các tài nguyên trong bản đồ cấu trúc dự án với tài nguyên nào trong tạo phẩm kết quả (tạo phẩm kết quả là tệp WAR trong trường hợp này). Trong một số trường hợp, ánh xạ bao gồm một quy trình sao chép đơn giản trong các trường hợp khác, quy trình ánh xạ bao gồm một phép biến đổi, chẳng hạn như lọc hoặc biên dịch và các thứ khác.
Một ví dụ : WEB-INF/classes
Thư mục sau này sẽ chứa tất cả các lớp và tài nguyên java đã biên dịch ( src/main/java
và src/main/resources
) cần được tải bởi Classloader để khởi động ứng dụng.
Một ví dụ khác : WEB-INF/lib
Thư mục này sau đó sẽ chứa tất cả các tệp jar cần thiết cho ứng dụng. Trong một dự án maven, các phụ thuộc được quản lý cho bạn và maven tự động sao chép các tệp jar cần thiết vào WEB-INF/lib
thư mục cho bạn. Điều đó giải thích tại sao bạn không có một lib
thư mục trong dự án maven.