Struktur folder aplikasi web Java

18

Sebagai pemula untuk J2EE, saya baru-baru ini mulai mengembangkan proyek saya sendiri dari awal menggunakan Core of J2EE: Servlets & Jsps.

Saya tidak dapat mengevaluasi apakah struktur folder proyek saya benar atau tidak. Ini adalah struktur folder proyek saya. masukkan deskripsi gambar di sini

Sebelum mengajukan pertanyaan, saya akui bahwa saya tidak dapat menjawab atau tidak membenarkan jika seseorang bertanya kepada saya, mengapa jenis struktur folder ini. Pertanyaannya: Apakah ini pertanda baik untuk menempatkan jsps saya di luar web-inf. Jika tidak, mengapa demikian? Jika ya mengapa?

Apakah ada konvensi struktur folder standar untuk aplikasi web J2EE, saya tahu maven telah memunculkan beberapa standar tapi tetap saja, kita dapat menyesuaikan sesuai kebutuhan yang saya percaya.

Saya telah melakukan sedikit googling dan menemukan dua referensi 1 2

di mana dalam jawaban tidak pada halaman yang sama, dari mana saya tidak bisa menarik kesimpulan apa pun.

Apa poin yang harus dipertimbangkan ketika meletakkan struktur folder untuk aplikasi web J2EE, yang penting di mana seharusnya Jsps, konten statis harus masuk ke & mengapa?

srk
sumber
Saya sangat menyarankan Anda meneliti teori MVC - artikel wikipedia memiliki beberapa sumber yang bagus. Jika Anda ingin bereksperimen dengan MVC di webapp Java, Stripes adalah kerangka kerja ringan yang sangat baik yang dapat memberi Anda gambaran arsitektur.
Michael K
1
Berikut ini perawatan yang lebih spesifik tentang cara kerja MVC di webapps.
Michael K
Sebagai bacaan tambahan: Konvensi organisasi file Webapp (struktur pengembangan)
informatik01

Jawaban:

7

Struktur standar untuk file WAR adalah:

/META-INF
   Standard jar stuff like manifest.xml
/WEB-INF
  web.xml
  /classes
    /com...etc.
  /lib

Maven membuat ini untuk Anda menggunakan src / main / java, sumber daya, webapp, dan dependensi Anda (menempatkannya di / lib) di maven-webapp-plugin , tetapi itulah implementasinya. Hal penting untuk disadari adalah bahwa apa pun yang Anda masukkan ke WEB-INF tidak dapat diakses secara eksternal , sedangkan semua yang ada di direktori root WAR adalah untuk publik.

Umumnya Anda tidak ingin memasukkan banyak ke dalam root, karena Anda ingin aplikasi Anda menangani semua akses menggunakan servlet dan filter yang Anda tentukan di web.xml. Adalah umum untuk melihat index.html (atau .jsp) di root yang dialihkan ke servlet, misalnya tindakan Struts .

Implementasi MVC khas seperti Stripes atau Struts merekomendasikan terhadap pengguna mengakses JSP secara langsung, lebih memilih bahwa JSP hanya untuk tampilan. Mereka merekomendasikan membuat pengendali yang meneruskan ke JSP setelah memproses permintaan, dan JSP hanya memberikan hasilnya. Misalnya, mengirimkan formulir untuk /loginmenjalankan tindakan yang memproses permintaan login, membuat sesi pengguna, dan meneruskan pengguna ke tampilan login dari halaman utama JSP.

Michael K.
sumber
5

Jawaban yang biasa untuk "apa jalan yang benar?" atau "apakah ini jalan yang benar?" adalah ..... itu tergantung .

Yang bisa saya lakukan adalah memberi tahu Anda pro dan kontra untuk ide-ide spesifik. Yang berikut adalah 100% pendapat saya. Saya tidak tahu persyaratan atau aturan khusus. Saya yakin seseorang akan tidak setuju dengan saya.

JSP

Mari kita bekerja apakah akan menempatkan JSP di WEB-INF atau tidak.

Kelebihan menempatkan JSP di WEB-INF:

  • Anda mengontrol bagaimana JSP dijalankan. Jika Anda ingin JSP menjadi parameter dan dapat digunakan kembali (yang benar-benar sulit dengan JSP), Anda dapat memasukkannya ke WEB-INF dan menggunakan servlet atau pengontrol aksi Struts atau pengontrol depan lainnya untuk melakukan pra-pemrosesan dan kemudian memberikan kontrol ke JSP, meneruskan dalam konteks lingkungan yang tepat (seperti atribut permintaan, pemeriksaan keamanan, sanitasi parameter, dll.)
  • Anda dapat secara terprogram atau bahkan pada tingkat firewall atau IDS memblokir permintaan HTTP ke * .jsp untuk mengurangi kemungkinan seseorang mengunggah JSP ke root web dan kemudian dapat menjalankan kode sebagai server web. Mereka harus menulis JSP yang sudah ada secara berlebihan. Bukan keuntungan keamanan yang besar, tetapi itu membuat kompromi sedikit lebih sulit.
  • Menegakkan kebiasaan baik, seperti MVC, pengontrol depan, filter servlet, injeksi dependensi, dll. Sebagai kebalikan dari JSP besar yang melakukan semua pekerjaan itu sendiri dan sulit untuk dibaca / dipelihara.

Kontra menempatkan JSP di WEB-INF:

  • Anda tidak dapat mengakses halaman secara langsung, bahkan jika itu adalah halaman mandiri sederhana yang tidak memerlukan pemrosesan di muka. Ini karena file di bawah / WEB-INF tidak dapat ditampung oleh wadah servlet.

File statis

Dalam hal file yang murni statis seperti HTML, gambar, stylesheet, javascript, dll. Letakkan di bawah root web (my_app dalam kasus Anda), tetapi BUKAN / WEB-INF (karena tidak dapat diakses).

Tata letak keseluruhan

Adapun tata letak direktori secara keseluruhan, itu agak tergantung pada proses build Anda. Saya suka menyimpan segala sesuatu di bawah "src" atau "sumber" karena itu membuat jelas file apa yang dihasilkan oleh bangunan dan mana yang merupakan file sumber murni. mainmemungkinkan Anda memisahkan kode tes seperti kelas junit dari kode sumber utama Anda, yang juga bagus. Tetapi jika Anda tidak memiliki tes unit (oh tidak!), Maka itu perbedaan yang tidak berarti.

Di sisi lain, jika Anda tidak memanipulasi root web sama sekali selama membangun (seperti jika itu semua JSP dan file statis), maka mungkin Anda menyimpannya di tingkat atas, suka /webrootatau /deploydan salin file sesuai kebutuhan, seperti File .class atau .jar. Ini adalah kebiasaan manusia (terutama pengembang) untuk mengatur secara berlebihan. Pertanda pengorganisasian yang berlebihan adalah memiliki banyak folder dengan hanya satu folder.

Apa yang Anda Tunjukkan

Anda telah mengindikasikan bahwa Anda mengikuti konvensi yang ditetapkan oleh pakar, jadi jika Anda sudah menggunakan pakar, tetap saja dengan tata letak itu. Sama sekali tidak ada yang salah dengan tata letak yang Anda uraikan.

Brandon
sumber
1

Nah, src / main / webapp Anda pasti mengingatkan saya pada sebuah proyek pakar. Yang mana yang bagus.

Untuk my_app / jsps saya tidak yakin. Pengembang biasanya meninggalkan jsp mereka di folder webapp, atau jika Anda ingin melakukan sedikit pemetaan url, di direktori webapp / jsp.

!Peringatan! : Anda seharusnya tidak pernah menaruh file jsp di web-inf. WEB-INF Anda hanya boleh berisi file xml untuk mengonfigurasi situs web Anda. Ingat, jsp Anda adalah halaman web atau bagian dari halaman web.

Anda dapat menggunakan nama folder seperti templat, sebagian ... apa pun yang terasa baik untuk Anda. Seharusnya mudah ditemukan untuk orang asing. Hanya pisahkan berbagai jenis konten seperti halaman penuh, template, tampilan sebagian ...

Brice Ruppen
sumber
src / main / webapp berisi file tata letak WAR standar dan dibaca oleh maven-war-plugin ketika mengkompilasi Java webapp.
Michael K
1
Tidak ada alasan mengapa Anda tidak boleh meletakkan JSP di WEB-INF, selama Anda telah mengkonfigurasi servlet di web.xml Anda yang pada akhirnya akan meneruskannya ke mereka. Ini adalah cara standar untuk mengimplementasikan aplikasi Struts - semua permintaan melalui servlet Struts, yang memetakannya ke tindakan dan kemudian ke JSP.
Michael K
Saya setuju dengan fakta bahwa jsp tidak boleh diakses secara langsung dan mencegah yang seharusnya dianggap praktik yang baik. Tetapi ada cara lain untuk melakukan itu.
Brice Ruppen
1

Saya setuju dengan Brice . Saya pemula juga di J2EE, tapi saya pikir lebih baik bekerja dengan mudah dan jelas pada awalnya.

Folder root adalah WEBAPP, dan Anda harus membuat struktur web Anda berpikir bahwa sebagian besar halaman akan ditemukan di sana. Jika tidak, saat halaman berkomunikasi di antara mereka, Anda mungkin tidak dapat mengelola hubungan file tanpa kesalahan.

musef
sumber
1

Sebenarnya aplikasi WAR dapat dibangun tanpa WEB-INF/web.xml. Dimungkinkan untuk membuat aplikasi WAR dengan hanya kelas Java di dalamnya.

Sumber: Elemen Descriptor Penerapan web.xml

Dengan penjelasan Java EE, deskriptor penggunaan web.xml standar adalah opsional. Menurut spesifikasi servlet 3.0 di http://jcp.org/en/jsr/detail?id=315 , anotasi dapat didefinisikan pada komponen Web tertentu, seperti servlet, filter, pendengar, dan penangan tag.

Jadi saat ini dimungkinkan untuk membangun PERANG daripada yang terlihat seperti JAR dengan .warekstensi :)

Menjawab pertanyaan Anda, struktur WAR tergantung pada kebutuhan Anda.

http://en.wikipedia.org/wiki/WAR_(Sun_file_format)

Ny
sumber