resource-ref ใน web.xml ใช้สำหรับอะไร?


112

ฉันแค่สงสัยว่าเมื่อไหร่ / ทำไมคุณถึงกำหนด<resource-ref>องค์ประกอบในweb.xmlไฟล์ของคุณ?

ฉันคิดว่าจะกำหนดไว้ในเซิร์ฟเวอร์เว็บ / แอปของคุณโดยใช้ JNDI จากนั้นค้นหาการอ้างอิง JNDI ในโค้ด Java ของคุณหรือไม่

คำจำกัดความการอ้างอิงทรัพยากรดูเหมือนจะซ้ำซ้อนสำหรับฉันและฉันไม่สามารถคิดได้ว่าเมื่อใดที่จะมีประโยชน์ ตัวอย่าง:

<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>

คำตอบ:


156

คุณสามารถอ้างถึงทรัพยากรในแอปพลิเคชันของคุณได้โดยตรงโดยใช้ชื่อ JNDI ตามที่กำหนดค่าไว้ในคอนเทนเนอร์ แต่ถ้าคุณทำเช่นนั้นคุณจะต้องต่อชื่อเฉพาะคอนเทนเนอร์ลงในโค้ดของคุณ สิ่งนี้มีข้อเสียบางประการเช่นหากคุณต้องการเปลี่ยนชื่อในภายหลังด้วยเหตุผลบางประการคุณจะต้องอัปเดตการอ้างอิงทั้งหมดในแอปพลิเคชันทั้งหมดของคุณจากนั้นสร้างใหม่และปรับใช้ใหม่

<resource-ref>แนะนำชั้นของทิศทางอื่น: คุณระบุชื่อที่คุณต้องการใช้ในweb.xmlและจัดเตรียมการโยงในไฟล์คอนฟิกูเรชันเฉพาะคอนเทนเนอร์ทั้งนี้ขึ้นอยู่กับคอนเทนเนอร์

ดังนั้นนี่คือสิ่งที่เกิดขึ้นที่: ขอบอกว่าคุณต้องการที่จะค้นหาjava:comp/env/jdbc/primaryDBชื่อ คอนเทนเนอร์พบว่าweb.xmlมี<resource-ref>องค์ประกอบสำหรับjdbc/primaryDBดังนั้นจะดูในการกำหนดค่าเฉพาะคอนเทนเนอร์ซึ่งมีสิ่งที่คล้ายกับสิ่งต่อไปนี้:

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

สุดท้ายจะส่งคืนอ็อบเจ็กต์ที่ลงทะเบียนภายใต้ชื่อของjdbc/PrimaryDBInTheContainer.

ความคิดก็คือการระบุทรัพยากรในweb.xmlมีความได้เปรียบในการแยกที่นักพัฒนาบทบาทจากDeployerบทบาท กล่าวอีกนัยหนึ่งในฐานะนักพัฒนาคุณไม่จำเป็นต้องรู้ว่าทรัพยากรที่คุณต้องการจริง ๆ เรียกว่าอะไรในการใช้งานจริงและในขณะที่ผู้ชายกำลังปรับใช้แอปพลิเคชันคุณจะมีรายชื่อที่ดีเพื่อจับคู่กับทรัพยากรจริง


6
IMHO มันนอกเหนือไปจากการแยกบทบาท แนวคิดคือคุณไม่สามารถสันนิษฐานได้ว่าชื่อ jndi พร้อมใช้งานบนเซิร์ฟเวอร์ดังนั้นคุณต้องมีวิธีแมปชื่อที่ใช้ในแอปพลิเคชันของคุณกับชื่อ JNDI "จริง" ที่ผู้ใช้งานเลือกไว้
Pascal Thivent

3
สิ่งนี้ต้องเป็นข้อมูลพื้นฐานเนื่องจากฉันไม่สามารถค้นหาได้ด้วย Google แต่ถ้าฉันต้องการค้นหา "java: comp / env / jdbc / primaryDB" เหตุใดจึงมี res-ref-name "jdbc / primaryDB"
Torben

4
สำหรับสิ่งที่ฉันรู้องค์ประกอบ "jndi-name" ไม่ได้เป็นส่วนหนึ่งของ web.xml มาตรฐาน แต่เป็นตัวบ่งชี้การปรับใช้ผู้จัดจำหน่ายที่เฉพาะเจาะจง
Ramon Chiara

2
@RaviParekh เขาได้กล่าวถึง "คอนฟิกูเรชันเฉพาะคอนเทนเนอร์" ซึ่งอาจเป็น jboss-web.xml หรือ weblogic.xml หรือไฟล์อธิบายการปรับใช้เฉพาะของผู้ขายรายอื่น
abhihello123

1
เราสามารถเชื่อมโยงสิ่งนี้กับแมวตัวผู้ได้หรือไม่? ฉันหมายถึงแหล่งข้อมูลที่กำหนดใน context.xml ใน tomcat และ resource-ref ใน web.xml
Atul
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.