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-INF
atau bisa berada di tempat lain? Dan adakah hal lain yang mungkin masuk WEB-INF
? Entri file PERANG Wikipedia menyebutkan classes
untuk kelas Java dan lib
untuk file JAR - tidak yakin saya sudah sepenuhnya memahami kapan ini akan diperlukan di samping lokasi file sumber lain.
servlets
jakarta-ee
war
web-inf
Steve Chambers
sumber
sumber
WEB-INF
dan lokasi lain melihat pertanyaan, Mengontrol classpath dalam servlet , terutama Jawaban ini .Jawaban:
Spesifikasi Servlet 2.4 mengatakan ini tentang WEB-INF (halaman 70):
Ini berarti bahwa
WEB-INF
sumber 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-INF
folder. 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-INF
secara eksplisit:The
WEB-INF/classes
danWEB-INF/lib
folder 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/classes
Folder nanti akan berisi semua kelas dan sumber daya java yang dikompilasi (src/main/java
dansrc/main/resources
) yang perlu dimuat oleh Classloader untuk memulai aplikasi.Contoh lain :
WEB-INF/lib
Folder 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 keWEB-INF/lib
folder untuk Anda. Itu menjelaskan mengapa Anda tidak memilikilib
folder di proyek pakar.sumber
WAR
>WEB-INF
>lib
>JAR
File>resources
WAR
File>WEB-INF
>lib
>JAR
File>META-INF
>resources
> yourStaticFilesGoHere .Ketika Anda menggunakan aplikasi web Java EE (menggunakan kerangka kerja atau tidak), strukturnya harus mengikuti beberapa persyaratan / spesifikasi. Spesifikasi ini berasal dari:
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.
Persyaratan
Java Servlet API Java Servlet API menyatakan bahwa direktori aplikasi root Anda harus memiliki struktur berikut:
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").
sumber
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).
sumber
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
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.
sumber