Resource-ref trong web.xml được sử dụng để làm gì?


112

Tôi chỉ tự hỏi khi nào / tại sao bạn sẽ xác định một <resource-ref>phần tử trong web.xmltệp của mình ?

Tôi đã nghĩ rằng nó sẽ được xác định trong máy chủ web / ứng dụng của bạn bằng cách sử dụng JNDI và sau đó tra cứu tham chiếu JNDI trong mã Java của bạn?

Định nghĩa resource-ref có vẻ hơi thừa đối với tôi và tôi không thể nghĩ ra khi nào nó có thể hữu ích. Thí dụ:

<resource-ref>
  <description>Primary database</description>
  <res-ref-name>jdbc/primaryDB</res-ref-name>
  <res-type>javax.sql.DataSource</res-type>
  <res-auth>CONTAINER</res-auth>
</resource-ref>

Câu trả lời:


156

Bạn luôn có thể tham chiếu trực tiếp đến các tài nguyên trong ứng dụng của mình bằng tên JNDI của chúng như được định cấu hình trong vùng chứa, nhưng nếu bạn làm như vậy, về cơ bản bạn đang nối tên dành riêng cho vùng chứa vào mã của mình. Điều này có một số nhược điểm, ví dụ: nếu bạn muốn thay đổi tên sau này vì lý do nào đó, bạn sẽ cần cập nhật tất cả các tham chiếu trong tất cả các ứng dụng của mình, sau đó xây dựng lại và triển khai lại chúng.

<resource-ref>giới thiệu một lớp hướng dẫn khác: bạn chỉ định tên bạn muốn sử dụng trong web.xml và, tùy thuộc vào vùng chứa, cung cấp liên kết trong tệp cấu hình dành riêng cho vùng chứa .

Vì vậy, đây là những gì sẽ xảy ra : giả sử bạn muốn tra cứu java:comp/env/jdbc/primaryDBtên. Vùng chứa nhận thấy rằng web.xml có một <resource-ref>phần tử cho jdbc/primaryDB, vì vậy, nó sẽ xem xét cấu hình dành riêng cho vùng chứa, chứa một cái gì đó tương tự như sau:

<resource-ref>
  <res-ref-name>jdbc/primaryDB</res-ref-name>
  <jndi-name>jdbc/PrimaryDBInTheContainer</jndi-name>
</resource-ref>

Cuối cùng, nó trả về đối tượng được đăng ký dưới tên của jdbc/PrimaryDBInTheContainer.

Ý tưởng là việc chỉ định tài nguyên trong web.xml có lợi thế là tách vai trò nhà phát triển khỏi vai trò người triển khai . Nói cách khác, với tư cách là một nhà phát triển, bạn không cần phải biết tài nguyên cần thiết của mình thực sự được gọi là gì trong quá trình sản xuất, và với tư cách là người triển khai ứng dụng, bạn sẽ có một danh sách tên đẹp để ánh xạ đến tài nguyên thực.


6
IMHO, nó không chỉ tách rời các vai trò. Ý tưởng là bạn không thể cho rằng tên jndi có sẵn trên máy chủ, vì vậy bạn cần có cách ánh xạ tên được sử dụng trong ứng dụng của mình với tên JNDI "thực" do người triển khai chọn.
Pascal Thivent

3
Điều này phải là cơ bản, vì tôi không thể tìm thấy nó bằng Google, nhưng nếu tôi muốn tra cứu "java: comp / env / jdbc / primaryDB", thì tại sao lại là res-ref-name "jdbc / primaryDB"?
Torben

4
Theo những gì tôi biết, phần tử "jndi-name" KHÔNG phải là một phần của web.xml tiêu chuẩn, mà là phần tử mô tả triển khai của nhà cung cấp cụ thể.
Ramon Chiara,

2
@RaviParekh, ông đã đề cập đến "cấu hình chứa cụ thể", nó có thể là JBoss-web.xml hoặc weblogic.xml hoặc bất kỳ nhà cung cấp cụ thể tập tin mô tả triển khai khác
abhihello123

1
Chúng ta có thể liên hệ điều này với tomcat không? Tôi nguồn dữ liệu trung bình theo quy định tại context.xml trong tomcat và tài nguyên-ref trong web.xml
Atul
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.