Dari Spesifikasi JSP 1.2, sangat disarankan agar JSP Standard Tag Library (JSTL) digunakan dalam aplikasi web Anda untuk membantu mengurangi kebutuhan skrip JSP di halaman Anda. Halaman yang menggunakan JSTL secara umum lebih mudah dibaca dan dipelihara.
...
Jika memungkinkan, hindari skrip JSP setiap kali pustaka tag menyediakan fungsionalitas yang setara. Ini membuat halaman lebih mudah dibaca dan dipelihara, membantu memisahkan logika bisnis dari logika presentasi, dan akan membuat halaman Anda lebih mudah untuk berevolusi menjadi halaman gaya JSP 2.0 (dukungan Spesifikasi JSP 2.0 tetapi tidak menekankan penggunaan skriplet).
...
Dalam semangat mengadopsi pola desain model-view-controller (MVC) untuk mengurangi sambungan antara tingkat presentasi dari logika bisnis, skrip JSP tidak boleh digunakan untuk menulis logika bisnis. Sebaliknya, skrip JSP digunakan jika perlu untuk mengubah data (juga disebut "objek nilai") yang dikembalikan dari pemrosesan permintaan klien ke dalam format siap-klien yang tepat. Bahkan kemudian, ini akan lebih baik dilakukan dengan servlet pengontrol depan atau tag kustom.
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:
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws ServletException, IOException {
if (((HttpServletRequest) request).getSession().getAttribute("user") == null) {
((HttpServletResponse) response).sendRedirect("login"); // Not logged in, redirect to login page.
} else {
chain.doFilter(request, response); // Logged in, just continue request.
}
}
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:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
List<Product> products = productService.list(); // Obtain all products.
request.setAttribute("products", products); // Store products in request scope.
request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); // Forward to JSP page to display them in a HTML table.
} catch (SQLException e) {
throw new ServletException("Retrieving products failed!", e);
}
}
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>
di web.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:
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String username = request.getParameter("username");
String password = request.getParameter("password");
User user = userService.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user); // Login user.
response.sendRedirect("home"); // Redirect to home page.
} else {
request.setAttribute("message", "Unknown username/password. Please retry."); // Store error message in request scope.
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to JSP page to redisplay login form with error.
}
}
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:
protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
Action action = ActionFactory.getAction(request);
String view = action.execute(request, response);
if (view.equals(request.getPathInfo().substring(1)) {
request.getRequestDispatcher("/WEB-INF/" + view + ".jsp").forward(request, response);
} else {
response.sendRedirect(view);
}
} catch (Exception e) {
throw new ServletException("Executing action failed.", e);
}
}
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:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<table>
<c:forEach items="${products}" var="product">
<tr>
<td>${product.name}</td>
<td>${product.description}</td>
<td>${product.price}</td>
</tr>
</c:forEach>
</table>
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
:
<jsp-config>
<jsp-property-group>
<url-pattern>*.jsp</url-pattern>
<scripting-invalid>true</scripting-invalid>
</jsp-property-group>
</jsp-config>
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:
<input type="text" name="foo" value="${param.foo}" />
The ${param.foo}
menampilkan hasil request.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 JSTL fn:escapeXml
berguna untuk mencegah serangan XSS .
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
...
<input type="text" name="foo" value="${fn:escapeXml(param.foo)}" />
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.