Untuk apa WEB-INF digunakan dalam aplikasi web Java EE?

177

Saya sedang mengerjakan aplikasi web Java EE dengan struktur kode sumber berikut:

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

Bit yang saya tertarik adalah WEB-INF- berisi web.xml, file XML untuk mengatur servlets, konteks kabel kacang Spring dan tag JSP dan pandangan.

Saya mencoba memahami apa yang membatasi / mendefinisikan struktur ini. Misalnya, apakah file JSP harus selalu berada di dalam WEB-INFatau bisa berada di tempat lain? Dan adakah hal lain yang mungkin masuk WEB-INF? Entri file PERANG Wikipedia menyebutkan classesuntuk kelas Java dan libuntuk file JAR - tidak yakin saya sudah sepenuhnya memahami kapan ini akan diperlukan di samping lokasi file sumber lain.

Steve Chambers
sumber
1
Ini mungkin membantu: gordondickens.com/wordpress/2012/07/03/…
smwikipedia
1
FYI… Untuk mempelajari tentang bagaimana kontainer servlet memuat dari WEB-INFdan lokasi lain melihat pertanyaan, Mengontrol classpath dalam servlet , terutama Jawaban ini .
Basil Bourque

Jawaban:

216

Spesifikasi Servlet 2.4 mengatakan ini tentang WEB-INF (halaman 70):

Direktori khusus ada dalam hierarki aplikasi bernama WEB-INF. Direktori ini berisi semua hal yang berkaitan dengan aplikasi yang tidak ada dalam root dokumen aplikasi. The WEB-INFsimpul bukan bagian dari pohon dokumen publik dari aplikasi . Tidak ada file yang terkandung dalam WEB-INFdirektori yang dapat disajikan secara langsung ke klien oleh kontainer. Namun, isi WEB-INFdirektori terlihat oleh kode servlet menggunakan getResource dan getResourceAsStreammetode panggilan pada ServletContext, dan dapat diekspos menggunakan RequestDispatcherpanggilan.

Ini berarti bahwa WEB-INFsumber daya dapat diakses oleh pemuat sumber daya dari Aplikasi Web Anda dan tidak langsung terlihat oleh publik.

Inilah sebabnya mengapa banyak proyek meletakkan sumber daya mereka seperti file JSP, JAR / libraries dan file kelas mereka sendiri atau file properti atau informasi sensitif lainnya dalam WEB-INFfolder. Kalau tidak, mereka akan dapat diakses dengan menggunakan URL statis sederhana (berguna untuk memuat CSS atau Javascript misalnya).

File JSP Anda dapat berada di mana saja dari perspektif teknis. Misalnya di Spring, Anda dapat mengonfigurasinya WEB-INFsecara eksplisit:

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

The WEB-INF/classesdan WEB-INF/libfolder yang disebutkan dalam Wikipedia WAR file artikel adalah contoh folder yang dibutuhkan oleh spesifikasi Servlet saat runtime.

Penting untuk membuat perbedaan antara struktur proyek dan struktur file WAR yang dihasilkan.

Struktur proyek dalam beberapa kasus sebagian mencerminkan struktur file PERANG (untuk sumber daya statis seperti file JSP atau file HTML dan JavaScript, tetapi ini tidak selalu terjadi.

Transisi dari struktur proyek ke dalam file WAR yang dihasilkan dilakukan dengan proses build.

Meskipun Anda biasanya bebas mendesain proses pembuatan Anda sendiri, saat ini kebanyakan orang akan menggunakan pendekatan standar seperti Apache Maven . Antara lain, Maven mendefinisikan default untuk sumber daya mana dalam struktur proyek yang dipetakan ke sumber daya apa dalam artefak yang dihasilkan (artefak yang dihasilkan adalah file WAR dalam kasus ini). Dalam beberapa kasus pemetaan terdiri dari proses salinan biasa dalam kasus lain proses pemetaan mencakup transformasi, seperti penyaringan atau kompilasi dan lain-lain.

Satu contoh : WEB-INF/classesFolder nanti akan berisi semua kelas dan sumber daya java yang dikompilasi ( src/main/javadan src/main/resources) yang perlu dimuat oleh Classloader untuk memulai aplikasi.

Contoh lain : WEB-INF/libFolder nanti akan berisi semua file jar yang dibutuhkan oleh aplikasi. Dalam proyek pakar, dependensi dikelola untuk Anda dan pakar secara otomatis menyalin file jar yang diperlukan ke WEB-INF/libfolder untuk Anda. Itu menjelaskan mengapa Anda tidak memiliki libfolder di proyek pakar.

mwhs
sumber
2
Perubahan dalam Servlet 3.0 & 3.1 ( JSR 340 ) memungkinkan penyajian sumber daya statis dan JSP dari dalam JAR yang disimpan dalam WEB-INF / lib. Mengutip bagian Servlet 3.1 spesifikasi 10.5: Kecuali untuk sumber daya statis dan JSP yang dikemas dalam META-INF / sumber daya dari file JAR yang berada di direktori WEB-INF / lib, tidak ada file lain yang terkandung dalam direktori WEB-INF mungkin disajikan langsung ke klien oleh wadah. Jadi pengecualian hanya berlaku untuk: WAR> WEB-INF> lib> JARFile>resources
Basil Bourque
1
Ups, dari komentar saya di atas, perubahan itu kalimat terakhir ke: file statis dapat dilayani dari: WARFile> WEB-INF> lib> JARFile> META-INF> resources> yourStaticFilesGoHere .
Basil Bourque
@mwhs saya sarankan Anda merevisi Jawaban Anda dengan bagian Servlet 3 baru, dan label konten Anda saat ini sebagai bagian Servlet 2.
Basil Bourque
61

Ketika Anda menggunakan aplikasi web Java EE (menggunakan kerangka kerja atau tidak), strukturnya harus mengikuti beberapa persyaratan / spesifikasi. Spesifikasi ini berasal dari:

  • Wadah servlet (mis. Tomcat)
  • API Java Servlet
  • Domain aplikasi Anda
  1. Persyaratan wadah Servlet
    Jika Anda menggunakan Apache Tomcat, direktori root aplikasi Anda harus ditempatkan di folder webapp. Itu mungkin berbeda jika Anda menggunakan wadah servlet lain atau server aplikasi.

  2. Persyaratan
    Java Servlet API Java Servlet API menyatakan bahwa direktori aplikasi root Anda harus memiliki struktur berikut:

    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

Persyaratan ini ditentukan oleh Java Servlet API.

3. Domain aplikasi Anda
Sekarang setelah Anda mengikuti persyaratan wadah Servlet (atau server aplikasi) dan persyaratan Java Servlet API, Anda dapat mengatur bagian lain dari aplikasi web Anda berdasarkan apa yang Anda butuhkan.
- Anda dapat menempatkan sumber daya Anda (file JSP, file teks biasa, file skrip) di direktori root aplikasi Anda. Tetapi kemudian, orang dapat mengaksesnya langsung dari browser mereka, alih-alih permintaan mereka sedang diproses oleh beberapa logika yang disediakan oleh aplikasi Anda. Jadi, untuk mencegah sumber Anda diakses secara langsung seperti itu, Anda dapat menempatkannya di direktori WEB-INF, yang isinya hanya dapat diakses oleh server.
-Jika Anda menggunakan beberapa kerangka kerja, mereka sering menggunakan file konfigurasi. Sebagian besar kerangka kerja ini (struts, spring, hibernate) mengharuskan Anda untuk meletakkan file konfigurasinya di direktori classpath ("kelas").

Patrick B.
sumber
12

Anda harus memasukkan WEB-INF halaman apa saja, atau potongan halaman, yang Anda tidak ingin publik. Biasanya, JSP atau facelet ditemukan di luar WEB-INF, tetapi dalam hal ini mereka mudah diakses oleh pengguna mana pun. Jika Anda memiliki beberapa batasan otorisasi, WEB-INF dapat digunakan untuk itu.

WEB-INF / lib dapat berisi pustaka pihak ke-3 yang tidak ingin Anda kemas pada level sistem (JAR dapat tersedia untuk semua aplikasi yang berjalan di server Anda), tetapi hanya untuk aplikasi khusus ini.

Secara umum, banyak file konfigurasi juga masuk ke WEB-INF.

Adapun WEB-INF / kelas - ada di setiap aplikasi web, karena itu adalah folder tempat semua sumber yang dikompilasi ditempatkan (bukan JARS, tetapi dikompilasi file .java yang Anda tulis sendiri).

Artem Moskalev
sumber
4

Konvensi ini diikuti karena alasan keamanan. Misalnya, jika orang yang tidak diizinkan diizinkan untuk mengakses file JSP root langsung dari URL maka mereka dapat menavigasi seluruh aplikasi tanpa otentikasi dan mereka dapat mengakses semua data yang diamankan.


sumber
Bukankah file jsp masih mencari sesi permintaan? Dan jika tidak ada yang ditemukan, itu tidak akan menampilkan beberapa bagian dari situs.
parsecer
3

Ada konvensi (tidak perlu) menempatkan halaman jsp di bawah direktori WEB-INF sehingga tidak dapat ditautkan atau di-bookmark secara mendalam. Dengan cara ini semua permintaan ke halaman jsp harus diarahkan melalui aplikasi kami, sehingga pengalaman pengguna dijamin.

Akshay Vijay Jain
sumber