Jawaban:
requestDispatcher - forward () metode
Saat kami menggunakan
forward
metode ini, permintaan ditransfer ke sumber daya lain dalam server yang sama untuk diproses lebih lanjut.Dalam kasus
forward
, penampung web menangani semua pemrosesan secara internal dan klien atau browser tidak terlibat.Ketika
forward
dipanggil padarequestDispatcher
objek, kita meneruskan objek request dan respon, jadi objek request lama kita ada di sumber daya baru yang akan memproses permintaan kita.Secara visual, kami tidak dapat melihat alamat yang diteruskan, ini transparan.
Menggunakan
forward()
metode ini lebih cepat darisendRedirect
.Saat kita mengarahkan ulang menggunakan forward, dan kita ingin menggunakan data yang sama di sumber daya baru, kita dapat menggunakan
request.setAttribute()
karena kita memiliki objek permintaan yang tersedia.SendRedirect
Dalam kasus
sendRedirect
, permintaan ditransfer ke sumber daya lain, ke domain lain, atau ke server lain untuk diproses lebih lanjut.Saat Anda menggunakan
sendRedirect
, wadah mentransfer permintaan ke klien atau browser, sehingga URL yang diberikan di dalamsendRedirect
metode terlihat sebagai permintaan baru untuk klien.Dalam kasus
sendRedirect
panggilan, objek permintaan dan respons lama hilang karena diperlakukan sebagai permintaan baru oleh browser.Di bilah alamat, kami dapat melihat alamat baru yang dialihkan. Itu tidak transparan.
sendRedirect
lebih lambat karena diperlukan satu perjalanan bolak-balik tambahan, karena permintaan yang benar-benar baru dibuat dan objek permintaan yang lama hilang. Diperlukan dua permintaan browser.Namun
sendRedirect
, jika kita ingin menggunakan data yang sama untuk sumber daya baru, kita harus menyimpan data dalam sesi atau meneruskan dengan URL.Mana yang bagus?
Ini tergantung pada skenario metode mana yang lebih berguna.
Jika Anda ingin kontrol adalah transfer ke server atau konteks baru, dan itu diperlakukan sebagai tugas yang benar-benar baru, maka kita pergi
sendRedirect
. Umumnya, penerusan harus digunakan jika operasi dapat diulangi dengan aman saat browser memuat ulang halaman web dan tidak akan mempengaruhi hasilnya.
Dalam dunia pengembangan web, istilah "redirect" adalah tindakan mengirimkan klien sebuah respon HTTP kosong hanya dengan sebuah Location
header yang berisi URL baru dimana klien harus mengirimkan permintaan GET yang baru. Jadi pada dasarnya:
some.jsp
.Location: other.jsp
headerother.jsp
(ini tercermin di bilah alamat browser!)other.jsp
.Anda dapat melacaknya dengan perangkat pengembang bawaan / addon browser web. Tekan F12 di Chrome / IE9 / Firebug dan periksa bagian "Jaringan" untuk melihatnya.
Persis di atas dicapai oleh sendRedirect("other.jsp")
. Tidak RequestDispatcher#forward()
mengirim pengalihan. Sebaliknya, ini menggunakan konten halaman target sebagai respons HTTP.
some.jsp
.other.jsp
.Namun, seperti permintaan HTTP asli some.jsp
, URL di bilah alamat browser tetap tidak berubah. Selain itu, atribut permintaan apa pun yang disetel di pengontrol belakang some.jsp
akan tersedia di other.jsp
. Ini tidak terjadi selama pengalihan karena Anda pada dasarnya memaksa klien untuk membuat permintaan HTTP baruother.jsp
, dengan ini membuang permintaan asli some.jsp
termasuk semua atributnya.
Ini RequestDispatcher
sangat berguna dalam paradigma MVC dan / atau saat Anda ingin menyembunyikan JSP dari akses langsung. Anda dapat meletakkan JSP di /WEB-INF
folder dan menggunakan a Servlet
yang mengontrol, memproses sebelumnya dan memproses permintaan. JSP di /WEB-INF
folder tidak langsung dapat diakses oleh URL, tetapi Servlet
dapat mengaksesnya menggunakan RequestDispatcher#forward()
.
Misalnya, Anda dapat memiliki file JSP di /WEB-INF/login.jsp
dan LoginServlet
yang dipetakan pada url-pattern
dari /login
. Saat Anda memanggil http://example.com/context/login
, servlet doGet()
akan dipanggil. Anda dapat melakukan hal-hal pra- pemrosesan di sana dan akhirnya meneruskan permintaan seperti:
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
Saat Anda mengirimkan formulir, Anda biasanya ingin menggunakan POST
:
<form action="login" method="post">
Dengan cara ini servlet doPost()
akan dipanggil dan Anda dapat melakukan posting apapun proses di sana (misalnya validasi, logika bisnis, login pengguna, dll).
Jika ada kesalahan, biasanya Anda ingin meneruskan permintaan kembali ke halaman yang sama dan menampilkan kesalahan di sana di sebelah kolom masukan dan seterusnya. Anda dapat menggunakanRequestDispatcher
untuk ini.
Jika a POST
berhasil, Anda biasanya ingin mengalihkan permintaan, sehingga permintaan tidak akan dikirim kembali saat pengguna menyegarkan permintaan (mis. Menekan F5 atau menavigasi kembali ke riwayat).
User user = userDAO.find(username, password);
if (user != null) {
request.getSession().setAttribute("user", user); // Login user.
response.sendRedirect("home"); // Redirects to http://example.com/context/home after succesful login.
} else {
request.setAttribute("error", "Unknown login, please try again."); // Set error.
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response); // Forward to same page so that you can display error.
}
Dengan demikian, pengalihan menginstruksikan klien untuk mengaktifkan GET
permintaan baru di URL yang diberikan. Menyegarkan permintaan hanya akan menyegarkan permintaan yang diarahkan ulang dan bukan permintaan awal. Ini akan menghindari "pengiriman ganda" dan kebingungan serta pengalaman pengguna yang buruk. Ini juga disebut POST-Redirect-GET
pola .
The RequestDispatcher
antarmuka memungkinkan Anda untuk melakukan sisi server maju / meliputi sedangkan sendRedirect()
melakukan redirect sisi klien. Dalam pengalihan sisi klien, server akan mengirimkan kembali kode status HTTP 302
(pengalihan sementara) yang menyebabkan browser web mengeluarkan GET
permintaan HTTP baru untuk konten di lokasi yang diarahkan ulang. Sebaliknya, saat menggunakan RequestDispatcher
antarmuka, penyertaan / penerusan ke sumber daya baru ditangani sepenuhnya di sisi server.
forward
, bukan pengalihan.
Perbedaan penting utama antara metode forward () dan sendRedirect () adalah bahwa dalam kasus forward (), pengalihan terjadi di ujung server dan tidak terlihat oleh klien, tetapi dalam kasus sendRedirect (), pengalihan terjadi di ujung klien dan terlihat kepada klien.
Salah satu dari metode ini mungkin "lebih baik", yaitu lebih cocok, tergantung pada apa yang ingin Anda lakukan.
Pengalihan sisi server lebih cepat sejauh Anda mendapatkan data dari halaman berbeda tanpa melakukan perjalanan bolak-balik ke browser. Tetapi URL yang terlihat di browser masih menggunakan alamat asli, jadi Anda membuat sedikit ketidakkonsistenan di sana.
Pengalihan sisi klien lebih fleksibel sejauh dapat mengirim Anda ke server yang sama sekali berbeda, atau mengubah protokol (misalnya dari HTTP ke HTTPS), atau keduanya. Dan browser mengetahui URL baru. Tetapi dibutuhkan bolak-balik ekstra antara server dan klien.
SendRedirect()
akan mencari konten di antara server. itu lambat karena harus intim browser dengan mengirimkan URL konten. kemudian browser akan membuat permintaan baru untuk konten di dalam server yang sama atau di server lain.
RquestDispatcher
adalah untuk mencari konten di dalam server. Ini adalah proses sisi server dan lebih cepat dibandingkan dengan SendRedirect()
metode. tetapi masalahnya adalah itu tidak akan mengganggu browser di mana server itu mencari tanggal atau konten yang diperlukan, juga tidak akan meminta browser untuk mengubah URL di tab URL. sehingga menyebabkan sedikit ketidaknyamanan bagi pengguna.
Pengalihan teknis harus digunakan baik jika kita perlu mentransfer kontrol ke domain yang berbeda atau untuk mencapai pemisahan tugas.
Misal pada aplikasi pembayaran kita melakukan PaymentProcess terlebih dahulu kemudian redirect ke displayPaymentInfo. Jika klien menyegarkan browser, hanya displayPaymentInfo yang akan dilakukan lagi dan PaymentProcess tidak akan diulang. Namun jika kami menggunakan penerusan dalam skenario ini, PaymentProcess dan displayPaymentInfo akan dijalankan ulang secara berurutan, yang dapat menghasilkan data yang tidak konsisten.
Untuk skenario lain, penerusan efisien untuk digunakan karena lebih cepat daripada sendRedirect
Request Dispatcher adalah Antarmuka yang digunakan untuk mengirimkan permintaan atau respons dari sumber daya web ke sumber daya web lain. Ini terutama berisi dua metode.
request.forward(req,res)
: Metode ini digunakan untuk meneruskan permintaan dari satu sumber daya web ke sumber lain. yaitu dari satu servlet ke servlet lain atau dari satu aplikasi web ke aplikasi web lain.
response.include(req,res)
: Metode ini digunakan termasuk respon dari satu servlet ke servlet lain
CATATAN: Dengan menggunakan Request Dispatcher kita dapat meneruskan atau menyertakan permintaan atau tanggapan di server yang sama.
request.sendRedirect()
: Dengan menggunakan ini kami dapat meneruskan atau menyertakan permintaan atau tanggapan di server yang berbeda. Dalam hal ini klien mendapat intimidasi saat mengarahkan halaman tetapi dalam proses di atas klien tidak akan mendapatkan intimidasi
Cukup perbedaan antara Forward(ServletRequest request, ServletResponse response)
dan sendRedirect(String url)
adalah
meneruskan():
forward()
Metode dieksekusi di sisi server.forward ()
metode ini disediakan oleh wadah servlet.forward()
Metode lebih cepat dari sendRedirect()
metode.RequestDispatcher
antarmuka.sendRedirect ():
response.sendRedirect("..")
ke halaman index.jsp situs web. Tapi itu melewatkan file css dan beberapa teks dari halaman jsp, menyebabkan pemuatan halaman sebagian. Tetapi ketika saya membuat halaman selamat datang dari situs web menjadi index.jsp, semuanya berfungsi dengan baik dan pemuatan halaman selesai. apa yang salah dengan pengalihan?