Saya baru mengenal Java EE dan saya tahu itu seperti tiga baris berikut
<%= x+1 %>
<%= request.getParameter("name") %>
<%! counter++; %>
adalah cara jadul dari pengkodean dan dalam JSP versi 2 terdapat metode untuk menghindari kode Java dalam file JSP. Bisakah seseorang tolong beri tahu saya alternatif JSP 2 baris, dan apa teknik ini disebut?
Jawaban:
Penggunaan scriptlets (
<% %>
hal - hal itu) di JSP memang sangat tidak dianjurkan sejak lahirnya taglibs (seperti JSTL ) dan EL ( Bahasa Ekspresi ,${}
hal hal itu) pada tahun 2001.Kerugian utama dari scriptlets adalah:
SunOracle sendiri juga merekomendasikan dalam konvensi pengkodean JSP untuk menghindari penggunaan scriptlet kapan pun fungsionalitas yang sama dimungkinkan oleh (tag) kelas. Berikut beberapa kutipan relevansi:Bagaimana cara mengganti scriptlets sepenuhnya tergantung pada tujuan tunggal dari kode / logika. Lebih sering kode ini ditempatkan di kelas Java yang layak:
Jika Anda ingin menjalankan kode Java yang sama pada setiap permintaan, kurang atau lebih terlepas dari halaman yang diminta, misalnya memeriksa apakah pengguna login, maka implementasikan filter dan tulis kode sesuai dengan
doFilter()
metode. Misalnya:Ketika dipetakan pada yang sesuai yang
<url-pattern>
mencakup halaman JSP yang menarik, maka Anda tidak perlu menyalin bagian yang sama dari kode keseluruhan halaman JSP.Jika Anda ingin memohon beberapa kode Java untuk preprocess permintaan, misalnya preloading beberapa daftar dari database ke layar dalam beberapa tabel, jika perlu berdasarkan beberapa parameter query, kemudian menerapkan servlet dan menulis kode sesuai dalam
doGet()
metode. Misalnya:Cara ini menangani pengecualian lebih mudah. DB tidak diakses di tengah-tengah rendering JSP, tetapi jauh sebelum JSP ditampilkan. Anda masih memiliki kemungkinan untuk mengubah respons setiap kali akses DB melempar pengecualian. Dalam contoh di atas, default halaman error 500 akan ditampilkan yang Anda tetap dapat menyesuaikan oleh
<error-page>
diweb.xml
.Jika Anda ingin memohon beberapa kode Java untuk postprocess permintaan, misalnya memproses formulir submit, kemudian menerapkan servlet dan menulis kode sesuai dalam
doPost()
metode. Misalnya:Dengan cara ini berurusan dengan tujuan halaman hasil yang berbeda lebih mudah: redisplaying bentuk dengan kesalahan validasi dalam kasus kesalahan (dalam contoh khusus ini Anda dapat menampilkan kembali menggunakan
${message}
di EL ), atau hanya mengambil ke halaman target yang diinginkan dalam hal keberhasilan.Jika Anda ingin memohon beberapa kode Java untuk mengontrol rencana eksekusi dan / atau tujuan permintaan dan respons, maka implementasikan servlet sesuai dengan Pola Pengontrol Depan MVC . Misalnya:
Atau hanya mengadopsi kerangka kerja MVC seperti JSF , Spring MVC , Wicket , dll sehingga Anda hanya berakhir dengan halaman JSP / Facelets dan kelas JavaBean tanpa perlu servlet kustom.
Jika Anda ingin memanggil beberapa kode Java untuk mengontrol aliran di dalam halaman JSP, maka Anda perlu mengambil taglib kontrol aliran (yang ada) seperti inti JSTL . Misalnya menampilkan
List<Product>
dalam tabel:Dengan tag gaya XML yang cocok dengan semua HTML itu, kodenya lebih mudah dibaca (dan dengan demikian lebih baik dikelola) daripada sekelompok skrip dengan berbagai kurung buka dan tutup ( "Di mana sih kurung penutup ini milik?" ). Sebuah bantuan mudah adalah mengonfigurasi aplikasi web Anda untuk membuat pengecualian kapan pun scriptlets masih digunakan dengan menambahkan bagian berikut ke
web.xml
:Dalam Facelets , penerus JSP, yang merupakan bagian dari Java EE yang menyediakan kerangka kerja MVC JSF , sudah tidak mungkin menggunakan skriplet . Dengan cara ini Anda secara otomatis dipaksa untuk melakukan hal-hal "dengan cara yang benar".
Jika Anda ingin memohon beberapa kode Java untuk mengakses dan menampilkan data "backend" di dalam halaman JSP, maka Anda perlu menggunakan EL (Bahasa Ekspresi),
${}
hal - hal itu. Misalnya menampilkan ulang nilai input yang dikirimkan:The
${param.foo}
menampilkan hasilrequest.getParameter("foo")
.Jika Anda ingin menjalankan beberapa kode Java utilitas langsung di halaman JSP (biasanya
public static
metode), maka Anda perlu mendefinisikannya sebagai fungsi EL. Ada fungsi taglib standar di JSTL, tetapi Anda juga dapat dengan mudah membuat fungsi sendiri . Berikut adalah contoh bagaimana JSTLfn:escapeXml
berguna untuk mencegah serangan XSS .Perhatikan bahwa sensitivitas XSS sama sekali tidak terkait dengan Java / JSP / JSTL / EL / apa pun, masalah ini perlu diperhitungkan di setiap aplikasi web yang Anda kembangkan. Masalah scriptlets adalah ia tidak menyediakan cara pencegahan bawaan, setidaknya tidak menggunakan Java API standar. Pengganti JSP Facelets telah secara implisit melepaskan HTML, jadi Anda tidak perlu khawatir tentang lubang XSS di Facelets.
Lihat juga:
sumber
<% response.getWriter().flush(); %>
antara</head>
dan<body>
untuk meningkatkan kinerja parsing halaman web di browser web. Tetapi penggunaan ini pada gilirannya benar-benar diabaikan ketika ukuran buffer output di sisi server rendah (1 ~ 2KB). Lihat juga artikel ini .Sebagai Safeguard: Nonaktifkan Scriptlets For Good
Saat pertanyaan lain sedang dibahas, Anda dapat dan selalu harus menonaktifkan scriptlets di
web.xml
deskriptor aplikasi web Anda .Saya akan selalu melakukan itu untuk mencegah pengembang menambahkan skriplet, terutama di perusahaan besar di mana Anda akan kehilangan gambaran cepat atau lambat. The
web.xml
pengaturan terlihat seperti ini:sumber
<%-- comment that i don't want in the final HTML --%>
. Saya merasa berguna untuk menggunakan ini daripada komentar HTML.<% %>
, ekspresi scriptlet<%! %>
, dan deklarasi scriptlet<%= %>
. Itu berarti arahan<%@ %>
dan komentar<%-- --%>
tetap diaktifkan dan dapat digunakan, sehingga Anda masih dapat melakukan komentar dan memasukkan.JSTL menawarkan tag untuk kondisional, loop, set, get, dll. Misalnya:
JSTL bekerja dengan atribut permintaan - mereka paling sering ditetapkan dalam permintaan oleh Servlet, yang meneruskan ke JSP.
sumber
Saya tidak yakin apakah ini benar.
Anda harus membaca sesuatu tentang MVC. Spring MVC & Struts 2 adalah dua solusi paling umum.
sumber
Anda dapat menggunakan tag JSTL bersama-sama dengan ekspresi EL untuk menghindari pencampuran kode Java dan HTML:
sumber
Ada juga kerangka kerja berbasis komponen seperti Wicket yang menghasilkan banyak HTML untuk Anda. Tag yang berakhir di HTML sangat mendasar dan hampir tidak ada logika yang tercampur. Hasilnya hampir seperti halaman HTML kosong dengan elemen HTML biasa. Kelemahannya adalah bahwa ada banyak komponen dalam API Wicket untuk dipelajari dan beberapa hal mungkin sulit dicapai di bawah kendala tersebut.
sumber
Dalam pola Arsitektur MVC, JSP mewakili lapisan Lihat. Menanamkan kode java di JSP dianggap praktik yang buruk. Anda dapat menggunakan JSTL , freeMarker , kecepatan dengan JSP sebagai "mesin template". Penyedia data untuk tag tersebut tergantung pada kerangka kerja yang Anda hadapi.
Struts 2
danwebwork
sebagai implementasi untuk Pola MVC menggunakan OGNL "teknik yang sangat menarik untuk mengekspos Properti Kacang ke JSP".sumber
Pengalaman menunjukkan bahwa JSP memiliki beberapa kekurangan, salah satunya sulit untuk menghindari pencampuran markup dengan kode aktual.
Jika Anda bisa, maka pertimbangkan untuk menggunakan teknologi khusus untuk apa yang perlu Anda lakukan. Di Java EE 6 ada JSF 2.0, yang menyediakan banyak fitur bagus termasuk menempelkan kacang Jawa bersama-sama dengan halaman JSF melalui
#{bean.method(argument)}
pendekatan.sumber
jika Anda hanya ingin menghindari kelemahan Java coding di JSP Anda dapat melakukannya bahkan dengan skrip. Cukup ikuti beberapa disiplin untuk memiliki Java minimal di JSP dan hampir tidak ada perhitungan dan logika di halaman JSP.
sumber
Belajarlah untuk menyesuaikan dan menulis tag Anda sendiri menggunakan JSTL
Perhatikan bahwa EL adalah EviL (pengecualian runtime, refactoring).
Wicket mungkin jahat juga (kinerja, sulit untuk aplikasi kecil atau tingkat tampilan sederhana)
Contoh dari java2s ,
Ini harus ditambahkan ke web.xml aplikasi web
buat File: java2s.tld di / WEB-INF /
kompilasi kode berikut ke dalam WEB-INF \ class \ com \ java2s
Mulai server dan muat bodyContent.jsp di browser
sumber
Wicket juga merupakan alternatif yang sepenuhnya memisahkan java dari html, sehingga seorang perancang dan pemrogram dapat bekerja bersama dan pada set kode yang berbeda dengan sedikit pemahaman satu sama lain.
Lihatlah Wicket.
sumber
Anda mengajukan pertanyaan yang bagus dan meskipun Anda mendapat jawaban yang baik, saya sarankan Anda menyingkirkan JSP. Ini adalah teknologi usang yang pada akhirnya akan mati. Gunakan pendekatan modern, seperti mesin templat. Anda akan memiliki pemisahan bisnis dan lapisan presentasi yang sangat jelas, dan tentunya tidak ada kode Java dalam templat, sehingga Anda dapat membuat templat langsung dari perangkat lunak pengedit presentasi web, dalam banyak kasus meningkatkan WYSIWYG.
Dan tentu saja menjauh dari filter dan pemrosesan sebelum dan sesudah, jika tidak, Anda mungkin menghadapi kesulitan dukungan / debugging karena Anda selalu tidak tahu dari mana variabel mendapatkan nilai.
sumber
untuk menghindari kode java dalam file JSP java sekarang menyediakan perpustakaan tag seperti JSTL juga java telah datang dengan JSF di mana Anda dapat menulis semua struktur pemrograman dalam bentuk tag
sumber
Tidak peduli berapa banyak Anda mencoba untuk menghindari, ketika Anda bekerja dengan pengembang lain, beberapa dari mereka masih akan lebih suka scriptlet dan kemudian memasukkan kode jahat ke dalam proyek. Oleh karena itu, menyiapkan proyek pada tanda pertama sangat penting jika Anda benar-benar ingin mengurangi kode skrip. Ada beberapa teknik untuk mengatasi hal ini (termasuk beberapa kerangka kerja yang disebutkan lainnya). Namun, jika Anda lebih suka cara JSP murni, maka gunakan file tag JSTL. Yang menyenangkan tentang ini adalah Anda juga dapat mengatur halaman master untuk proyek Anda, sehingga halaman lain dapat mewarisi halaman master
Buat halaman master yang disebut base.tag di bawah WEB-INF / tag Anda dengan konten berikut
Di halaman mater ini, saya membuat sebuah fragmen yang disebut "title", sehingga di halaman child, saya bisa memasukkan lebih banyak kode ke tempat halaman master ini. Selain itu, tag
<jsp:doBody/>
akan diganti oleh konten halaman anakBuat halaman anak (child.jsp) di folder Konten Web Anda:
<t:base>
digunakan untuk menentukan halaman master yang ingin Anda gunakan (yang base.tag saat ini). Semua konten di dalam tag di<jsp:body>
sini akan menggantikan<jsp:doBody/>
pada halaman master Anda. Halaman anak Anda juga dapat menyertakan tag lib dan Anda dapat menggunakannya secara normal seperti yang disebutkan lainnya. Namun, jika Anda menggunakan kode skrip apa pun di sini (<%= request.getParameter("name") %>
...) dan mencoba menjalankan halaman ini, Anda akan mendapatkanJasperException because Scripting elements ( <%!, <jsp:declaration, <%=, <jsp:expression, <%, <jsp:scriptlet ) are disallowed here
. Karena itu, tidak mungkin orang lain bisa memasukkan kode jahat ke dalam file jspMemanggil halaman ini dari pengontrol Anda:
Anda dapat dengan mudah memanggil file child.jsp dari controller Anda. Ini juga berfungsi baik dengan kerangka struts
sumber
Gunakan
JSTL Tag libraries
di JSP, itu akan bekerja dengan sempurna.sumber
Cukup gunakan tag JSTL dan ekspresi EL.
sumber
Jika seseorang benar-benar menentang pemrograman dalam lebih dari satu bahasa , saya sarankan GWT, secara teoritis Anda dapat menghindari semua elemen JS dan HTML, karena Google Toolkit mengubah semua klien dan kode bersama ke JS, Anda tidak akan memiliki masalah dengan mereka, jadi Anda memiliki layanan web tanpa coding dalam bahasa lain. Bahkan Anda dapat menggunakan beberapa CSS default dari suatu tempat karena diberikan oleh ekstensi (smartGWT atau Vaadin). Anda tidak perlu mempelajari lusinan anotasi.
Tentu saja jika Anda mau, Anda dapat meretas diri Anda ke kedalaman kode dan menyuntikkan JS dan memperkaya halaman HTML Anda, tetapi Anda benar-benar dapat menghindarinya jika mau, dan hasilnya akan bagus seperti yang tertulis dalam kerangka kerja lainnya. Saya katakan patut dicoba, dan GWT dasar didokumentasikan dengan baik.
Dan tentu saja banyak programmer sesama dengan ini menggambarkan atau merekomendasikan beberapa solusi lain. GWT adalah untuk orang-orang yang benar-benar tidak ingin berurusan dengan komponen web atau untuk meminimalkannya.
sumber
Ide bagus dari dunia Python adalah bahasa atribut Templat ; TAL diperkenalkan oleh Zope (oleh karena itu disebut "Zope Page Templates", ZPT) dan merupakan standar, dengan implementasi dalam PHP, XSLT dan Java juga (Saya telah menggunakan inkarnasi Python / Zope dan PHP). Di kelas bahasa templating ini, satu contoh di atas dapat terlihat seperti ini:
Kode tersebut terlihat seperti HTML biasa (atau XHTML) ditambah beberapa atribut khusus dalam ruang nama XML; itu dapat dilihat dengan browser dan aman di-tweak oleh seorang desainer. Ada dukungan untuk makro dan untuk i18n juga:
Jika terjemahan konten tersedia, mereka digunakan.
Saya tidak tahu banyak tentang implementasi Java .
sumber
ui:xxx
tag di Facelts VDL .tal:replace="structure (expression)"
atribut setiap saat.Menggunakan skriplet di JSP bukanlah praktik yang baik.
Sebagai gantinya, Anda dapat menggunakan:
Silakan merujuk ke:
sumber
Tentu, ganti
<%! counter++; %>
dengan arsitektur acara produsen-konsumen, di mana lapisan bisnis diberitahu tentang perlunya menambah penghitung, bereaksi sesuai, dan memberi tahu presenter sehingga mereka memperbarui pandangan. Sejumlah transaksi basis data terlibat, karena di masa depan kita perlu mengetahui nilai baru dan lama dari penghitung, yang telah menambahnya dan dengan tujuan apa yang dipikirkan. Jelas serialisasi terlibat, karena lapisan sepenuhnya dipisahkan. Anda akan dapat menambah penghitung Anda di atas RMI, IIOP, SOAP. Tetapi hanya HTML yang diperlukan, yang tidak Anda terapkan, karena ini adalah kasus biasa. Tujuan baru Anda adalah untuk mencapai peningkatan 250 detik di server E7, 64GB RAM Anda yang baru mengkilap.Saya memiliki lebih dari 20 tahun dalam pemrograman, sebagian besar proyek gagal sebelum sextet: Reusability Replaceability OO-kemampuan Debuggability Testability Maintainability bahkan diperlukan. Proyek lain, dijalankan oleh orang-orang yang hanya peduli dengan fungsionalitas, sangat sukses. Juga, struktur objek yang kaku, yang diterapkan terlalu dini dalam proyek, membuat kode tidak dapat disesuaikan dengan perubahan drastis dalam spesifikasi (alias gesit).
Jadi saya menganggap sebagai menunda kegiatan mendefinisikan "lapisan" atau struktur data yang berlebihan baik di awal proyek atau ketika tidak secara khusus diperlukan.
sumber
Secara teknis, JSP semua dikonversi ke Servlets selama runtime . JSP awalnya dibuat untuk tujuan decoupling logika bisnis dan logika desain, mengikuti pola MVC. Jadi JSP secara teknis semua kode java selama runtime. Tetapi untuk menjawab pertanyaan, Tag Libraries biasanya digunakan untuk menerapkan logika (menghapus kode Java) ke halaman JSP.
sumber
Jika kita menggunakan hal-hal berikut dalam aplikasi web java, kode java dapat dihilangkan dari latar depan JSP.
Gunakan arsitektur MVC untuk aplikasi web
Gunakan Tag JSP
Sebuah. Tag Standar
b. Tag Kustom
Bahasa Ekspresi
sumber
Bagaimana cara menghindari kode Java dalam file JSP?
Anda dapat menggunakan tag pustaka tab seperti JSTL di samping Bahasa Ekspresi ( EL ). Tetapi EL tidak bekerja dengan baik dengan JSP. Jadi mungkin lebih baik untuk melepaskan JSP sepenuhnya dan menggunakan Facelet .
Facelets adalah bahasa deklarasi halaman non JSP pertama yang dirancang untuk JSF (Java Server Faces) yang memberikan model pemrograman yang lebih sederhana dan lebih kuat untuk pengembang JSF dibandingkan dengan JSP. Ini mengatasi berbagai masalah yang terjadi di JSP untuk pengembangan aplikasi web.
Sumber
sumber
Menggunakan Scriptlets adalah cara yang sangat lama dan Tidak disarankan. Jika Anda ingin langsung menampilkan sesuatu di halaman JSP Anda cukup gunakan Bahasa Ekspresi (EL) bersama dengan JSTL .
Ada juga pilihan lain seperti menggunakan mesin templating seperti Velocity, Freemarker, Thymeleaf dll. Tetapi menggunakan JSP polos dengan EL dan JSTL melayani tujuan saya sebagian besar waktu dan juga tampaknya paling sederhana untuk pemula.
Juga, perhatikan bahwa ini bukan praktik terbaik untuk melakukan logika bisnis di lapisan tampilan, Anda harus melakukan logika bisnis Anda di lapisan Layanan, dan meneruskan hasil keluaran ke tampilan Anda melalui Pengontrol.
sumber
Tidak ada yang digunakan lagi teman saya, saran saya adalah untuk memisahkan pandangan (css, html, javascript, dll) dari server.
Dalam kasus saya, saya melakukan sistem saya menangani tampilan dengan Angular dan setiap data yang dibutuhkan dibawa dari server menggunakan layanan lainnya.
Percayalah, ini akan mengubah cara Anda mendesain
sumber
Gunakan backbone, kerangka javascript seperti sudut untuk desain UI dan ambil data menggunakan api sisanya. Ini akan menghapus ketergantungan java dari UI sepenuhnya.
sumber
JSP 2.0 memiliki fitur yang disebut "Tag Files" , Anda dapat menulis tag tanpa
java
kode eksternal dantld
. Anda perlu membuat.tag
file dan memasukkannya ke dalamWEB-INF\tags
Anda bahkan dapat membuat struktur direktori untuk mengemas tag Anda.Sebagai contoh:
Gunakan seperti
Anda juga dapat membaca badan tag dengan mudah
Gunakan
Sampel sangat sederhana tetapi Anda dapat melakukan banyak tugas rumit di sini. Silakan mempertimbangkan Anda dapat menggunakan tag lain (misalnya:
JSTL
yang telah mengendalikan tag sepertiif/forEcah/chosen
manipulasi teks sepertiformat/contains/uppercase
atau bahkan tag SQLselect/update
), lulus semua parameter jenis, misalnyaHashmap
, aksessession
,request
, ... dalam file tag Anda juga.File Tag sangat mudah dikembangkan karena Anda tidak perlu me-restart server saat mengubahnya, seperti file JSP. Ini membuatnya mudah untuk dikembangkan.
Bahkan jika Anda menggunakan kerangka kerja seperti Struts 2, yang memiliki banyak tag bagus, Anda mungkin menemukan bahwa memiliki tag Anda sendiri dapat mengurangi banyak kode Anda. Anda dapat meneruskan parameter tag Anda ke struts dan dengan cara ini menyesuaikan tag kerangka Anda.
Anda dapat menggunakan tag tidak hanya untuk menghindari java tetapi juga meminimalkan kode HTML Anda. Saya sendiri mencoba meninjau kode HTML dan banyak membuat tag segera setelah melihat duplikat kode mulai di halaman saya.
(Bahkan jika Anda akhirnya menggunakan java dalam kode JSP Anda, yang saya harap tidak, Anda dapat merangkum kode itu dalam tag)
sumber
Seperti yang banyak jawaban katakan, gunakan JSTL atau buat tag khusus Anda sendiri. Berikut ini penjelasan yang bagus tentang membuat tag khusus
sumber
sumber
Dengan menggunakan tag JSTL bersama dengan ekspresi EL Anda dapat menghindari ini. Letakkan hal-hal berikut di halaman jsp Anda:
sumber