WEB-INF ใช้สำหรับอะไรใน Java EE เว็บแอ็พพลิเคชัน


177

ฉันกำลังทำงานกับเว็บแอปพลิเคชัน Java EE ด้วยโครงสร้างซอร์สโค้ดต่อไปนี้:

src/main/java                 <-- multiple packages containing java classes
src/test/java                 <-- multiple packages containing JUnit tests
src/main/resources            <-- includes properties files for textual messages
src/main/webapp/resources     <-- includes CSS, images and all Javascript files
src/main/webapp/WEB-INF
src/main/webapp/WEB-INF/tags
src/main/webapp/WEB-INF/views

สิ่งที่ฉันสนใจคือWEB-INFมันมีweb.xmlไฟล์ XML สำหรับตั้งค่า servlets บริบทการเดินสายสปริงของถั่วและแท็กและมุมมอง JSP

ฉันพยายามที่จะเข้าใจว่าข้อ จำกัด / กำหนดโครงสร้างนี้ เช่นไฟล์ JSP จะต้องอยู่ภายในWEB-INFหรืออาจเป็นที่อื่นได้หรือไม่ และมีอะไรอีกบ้างที่จะเข้าไปWEB-INF? รายการไฟล์ WARของ Wikipedia กล่าวถึงclassesคลาส Java และlibไฟล์ JAR - ไม่แน่ใจว่าฉันเข้าใจอย่างถ่องแท้เมื่อต้องการใช้สิ่งเหล่านี้นอกเหนือจากตำแหน่งไฟล์ต้นฉบับอื่น ๆ


1
สิ่งนี้อาจมีประโยชน์: gordondickens.com/wordpress/2012/07/03/…
smwikipedia

1
FYI …หากต้องการเรียนรู้ว่าโหลดคอนเทนเนอร์ servletจากWEB-INFและที่ตั้งอื่น ๆ ดูคำถามได้อย่างไรการควบคุม classpath ในเซิร์ฟเล็ตโดยเฉพาะคำตอบนี้
Basil Bourque

คำตอบ:


216

Servlet 2.4 สเปคกล่าวว่าเกี่ยวกับเรื่องนี้ WEB-INF (หน้า 70)

WEB-INFไดเรกทอรีพิเศษมีอยู่ในลำดับชั้นของแอพลิเคชันที่มีชื่อ ไดเรกทอรีนี้มีทุกสิ่งที่เกี่ยวข้องกับแอปพลิเคชันที่ไม่ได้อยู่ในรูทเอกสารของแอปพลิเคชัน โหนดไม่เป็นส่วนหนึ่งของต้นไม้เอกสารสาธารณะของแอพลิเคชัน ไม่มีไฟล์ที่อยู่ในไดเรกทอรีอาจถูกส่งไปยังไคลเอ็นต์โดยตรงโดยคอนเทนเนอร์ อย่างไรก็ตามเนื้อหาของ ไดเรกทอรีสามารถมองเห็นได้ด้วยโค้ด servlet โดยใช้ และการเรียกใช้เมธอดบนและอาจถูกเปิดเผยโดยใช้การโทรWEB-INFWEB-INFWEB-INFgetResourcegetResourceAsStreamServletContextRequestDispatcher

ซึ่งหมายความว่าWEB-INFทรัพยากรสามารถเข้าถึงตัวโหลดทรัพยากรของเว็บแอปพลิเคชันของคุณและไม่สามารถมองเห็นได้โดยตรงสำหรับสาธารณะ

นี่คือเหตุผลที่โครงการจำนวนมากใส่ทรัพยากรของพวกเขาเช่นไฟล์ JSP, JARs / ไลบรารีและไฟล์คลาสหรือไฟล์คุณสมบัติหรือข้อมูลที่สำคัญอื่น ๆ ในWEB-INFโฟลเดอร์ มิฉะนั้นพวกเขาจะสามารถเข้าถึงได้โดยใช้ URL คงที่ง่าย ๆ (เช่นมีประโยชน์ในการโหลด CSS หรือ Javascript เป็นต้น)

ไฟล์ JSP ของคุณสามารถอยู่ที่ใดก็ได้จากมุมมองทางเทคนิค ตัวอย่างเช่นใน Spring คุณสามารถกำหนดค่าให้WEB-INFชัดเจน:

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver"
    p:prefix="/WEB-INF/jsp/" 
    p:suffix=".jsp" >
</bean>

WEB-INF/classesและWEB-INF/libโฟลเดอร์ที่กล่าวถึงในวิกิพีเดียWAR ไฟล์บทความนี้เป็นตัวอย่างของโฟลเดอร์ที่กำหนดไว้ในข้อกำหนด Servlet ที่รันไทม์

สิ่งสำคัญคือการสร้างความแตกต่างระหว่างโครงสร้างของโครงการและโครงสร้างของไฟล์ WAR ที่เป็นผลลัพธ์

โครงสร้างของโครงการในบางกรณีจะสะท้อนโครงสร้างของไฟล์ WAR บางส่วน (สำหรับทรัพยากรแบบคงที่เช่นไฟล์ JSP หรือไฟล์ HTML และ JavaScript แต่กรณีนี้อาจไม่เสมอไป

การเปลี่ยนจากโครงสร้างโครงการเป็นไฟล์ WAR ที่เป็นผลลัพธ์จะทำโดยกระบวนการสร้าง

ในขณะที่คุณมักจะมีอิสระในการออกแบบการสร้างกระบวนการของคุณเองในปัจจุบันคนส่วนใหญ่จะใช้วิธีการมาตรฐานเช่นApache Maven เหนือสิ่งอื่นใด Maven กำหนดค่าเริ่มต้นซึ่งทรัพยากรในโครงสร้างโครงการแมปกับทรัพยากรใดในสิ่งประดิษฐ์ที่เกิดขึ้น (สิ่งประดิษฐ์ที่เกิดขึ้นคือไฟล์ WAR ในกรณีนี้) ในบางกรณีการทำแผนที่ประกอบด้วยกระบวนการคัดลอกธรรมดาในกรณีอื่น ๆ กระบวนการทำแผนที่รวมถึงการแปลงเช่นการกรองหรือการรวบรวมและอื่น ๆ

ตัวอย่างหนึ่ง : WEB-INF/classesโฟลเดอร์จะมีคลาส Java ที่คอมไพล์และทรัพยากร ( src/main/javaและsrc/main/resources) ที่คอมไพล์แล้วซึ่งจำเป็นต้องโหลดโดย Classloader เพื่อเริ่มแอปพลิเคชัน

ตัวอย่างอื่น : WEB-INF/libโฟลเดอร์จะมีไฟล์ jar ทั้งหมดที่แอปพลิเคชันต้องการในภายหลัง ในโครงการ maven การอ้างอิงได้รับการจัดการให้กับคุณและ maven จะคัดลอกไฟล์ jar ที่ต้องการไปยังWEB-INF/libโฟลเดอร์โดยอัตโนมัติ นั่นอธิบายว่าทำไมคุณไม่มีlibโฟลเดอร์ในโครงการ Maven



2
การเปลี่ยนแปลงใน Servlet 3.0 & 3.1 ( JSR 340 ) อนุญาตการให้บริการสแตติกรีซอร์สและ JSP จากภายใน JAR ที่เก็บไว้ใน WEB-INF / lib ในการอ้างอิงส่วนข้อมูลจำเพาะ Servlet 3.1 10.5: ยกเว้นทรัพยากรคงที่และ JSPs ที่บรรจุใน META- INF / ทรัพยากรของไฟล์ JAR ที่อยู่ในไดเรกทอรี WEB-INF / lib ไม่มีไฟล์อื่นที่อยู่ในไดเรกทอรี WEB-INF ให้บริการโดยตรงกับลูกค้าโดยภาชนะ ดังนั้นข้อยกเว้นใช้เฉพาะกับ: WAR> WEB-INF> lib> JARไฟล์>resources
เพรา Bourque

1
อ๊ะจากความคิดเห็นของฉันข้างต้นการเปลี่ยนแปลงว่าประโยคสุดท้ายที่: แฟ้มคงสามารถให้บริการจาก: WARไฟล์> WEB-INF> lib> JARไฟล์> META-INF> resources> yourStaticFilesGoHere
Basil Bourque

@mwhs ฉันขอแนะนำให้คุณแก้ไขคำตอบของคุณด้วยส่วน Servlet 3 ใหม่และติดป้ายกำกับเนื้อหาปัจจุบันของคุณเป็นส่วน Servlet 2
Basil Bourque

61

เมื่อคุณปรับใช้เว็บแอ็พพลิเคชัน Java EE (โดยใช้เฟรมเวิร์กหรือไม่) โครงสร้างจะต้องเป็นไปตามข้อกำหนด / ข้อกำหนดบางอย่าง ข้อกำหนดเหล่านี้มาจาก:

  • ภาชนะ servlet (เช่น Tomcat)
  • Java Servlet API
  • โดเมนแอปพลิเคชันของคุณ
  1. ข้อกำหนดคอนเทนเนอร์ Servlet
    หากคุณใช้ Apache Tomcat ต้องวางไดเรกทอรีรากของแอปพลิเคชันของคุณในโฟลเดอร์ webapp ซึ่งอาจแตกต่างกันถ้าคุณใช้คอนเทนเนอร์ servlet หรือเซิร์ฟเวอร์แอปพลิเคชันอื่น

  2. ข้อกำหนด
    Java Servlet API Java Servlet API ระบุว่าไดเรกทอรีแอปพลิเคชันรูทของคุณต้องมีโครงสร้างต่อไปนี้:

    ApplicationName
    |
    |--META-INF
    |--WEB-INF
          |_web.xml       <-- Here is the configuration file of your web app(where you define servlets, filters, listeners...)
          |_classes       <--Here goes all the classes of your webapp, following the package structure you defined. Only 
          |_lib           <--Here goes all the libraries (jars) your application need

ข้อกำหนดเหล่านี้ถูกกำหนดโดย Java Servlet API

3. โดเมนแอปพลิเคชันของคุณ- หากคุณใช้เฟรมเวิร์กพวกเขามักจะใช้ไฟล์กำหนดค่า เฟรมเวิร์กเหล่านี้ส่วนใหญ่ (struts, spring, hibernate) ต้องการให้คุณวางไฟล์การกำหนดค่าไว้ในไดเร็กทอรี classpath (ไดเรกทอรี "คลาส")
ตอนนี้คุณได้ปฏิบัติตามข้อกำหนดของ Servlet container (หรือแอพพลิเคชันเซิร์ฟเวอร์) และข้อกำหนด Java Servlet API แล้วคุณสามารถจัดระเบียบส่วนอื่น ๆ ของ webapp ของคุณตามสิ่งที่คุณต้องการ
- คุณสามารถใส่ทรัพยากรของคุณ (ไฟล์ JSP, ไฟล์ข้อความธรรมดา, ไฟล์สคริปต์) ในไดเรกทอรีรากแอปพลิเคชันของคุณ แต่แล้วผู้คนสามารถเข้าถึงพวกเขาโดยตรงจากเบราว์เซอร์ของพวกเขาแทนคำขอของพวกเขาจะถูกประมวลผลโดยตรรกะบางอย่างที่แอปพลิเคชันของคุณให้ ดังนั้นเพื่อป้องกันการเข้าถึงทรัพยากรของคุณโดยตรงเช่นนั้นคุณสามารถใส่ไว้ในไดเรกทอรี WEB-INF ซึ่งเซิร์ฟเวอร์สามารถเข้าถึงเนื้อหาได้เท่านั้น


12

คุณควรใส่ WEB-INF หน้าใด ๆ หรือบางส่วนของหน้าเว็บที่คุณไม่ต้องการให้เป็นแบบสาธารณะ โดยปกติแล้ว JSP หรือ facelets จะอยู่นอก WEB-INF แต่ในกรณีนี้ผู้ใช้สามารถเข้าถึงได้ง่าย ในกรณีที่คุณมีข้อ จำกัด การอนุญาตบางอย่าง WEB-INF สามารถนำมาใช้สำหรับการนั้น

WEB-INF / lib สามารถมีไลบรารี่ของบุคคลที่สามซึ่งคุณไม่ต้องการแพ็คที่ระดับระบบ (สามารถใช้ได้กับแอปพลิเคชันทั้งหมดที่ทำงานบนเซิร์ฟเวอร์ของคุณ) แต่สำหรับแอพพลิเคชั่นเฉพาะนี้เท่านั้น

โดยทั่วไปแล้วไฟล์การกำหนดค่าจำนวนมากก็เข้าสู่ WEB-INF เช่นกัน

สำหรับ WEB-INF / คลาส - มีอยู่ในเว็บแอพใด ๆ เพราะนั่นคือโฟลเดอร์ที่วางแหล่งข้อมูลที่รวบรวมไว้ทั้งหมด (ไม่ใช่ JARS แต่รวบรวมไฟล์. java ที่คุณเขียนด้วยตัวเอง)


4

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


ไฟล์ jsp จะยังคงค้นหาเซสชันของคำขอหรือไม่ และหากไม่พบมันก็จะไม่แสดงบางส่วนของเว็บไซต์
parsecer

3

มีข้อตกลง (ไม่จำเป็น) ในการวางเพจ jsp ภายใต้ไดเร็กทอรี WEB-INF เพื่อไม่ให้ลิงก์หรือบุ๊กมาร์กลึก วิธีนี้ทุกคำขอไปยังหน้า jsp จะต้องถูกส่งผ่านแอปพลิเคชันของเราเพื่อรับประกันประสบการณ์ผู้ใช้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.