Yanıtlar:
requestDispatcher - forward () yöntemi
forward
Yöntemi kullandığımızda, talep daha fazla işlenmek üzere aynı sunucu içindeki başka bir kaynağa aktarılır.Bu durumda
forward
, web kapsayıcısı tüm işlemleri dahili olarak gerçekleştirir ve istemci veya tarayıcı dahil değildir.Ne zaman
forward
üzerinde çağrıldığındarequestDispatcher
nesnenin bizim eski istek nesnesi bizim isteği işlemek için gidiyor yeni kaynakta mevcut olduğu, bu yüzden biz, istek ve yanıt nesneleri geçmektedir.Görsel olarak iletilen adresi göremiyoruz, şeffaf.
forward()
Yöntemi kullanmak daha hızlıdırsendRedirect
.Forward kullanarak yeniden yönlendirdiğimizde ve aynı verileri yeni bir kaynakta kullanmak istediğimizde, kullanılabilir
request.setAttribute()
bir istek nesnemiz olduğu için kullanabiliriz.SendRedirect
Durumda
sendRedirect
, talep başka bir kaynağa, farklı bir alana veya daha fazla işlem için farklı bir sunucuya aktarılır.Kullandığınızda
sendRedirect
, konteyner, isteği istemciye veya tarayıcıya aktarır, böylecesendRedirect
yöntem içinde verilen URL , istemciye yeni bir istek olarak görünür.
sendRedirect
Çağrı durumunda , tarayıcı tarafından yeni istek olarak değerlendirildiği için eski istek ve yanıt nesneleri kaybolur.Adres çubuğunda, yeni yönlendirilen adresi görebiliriz. Şeffaf değil.
sendRedirect
daha yavaştır çünkü fazladan bir gidiş dönüş gereklidir, çünkü tamamen yeni bir istek yaratılır ve eski istek nesnesi kaybolur. İki tarayıcı isteği gereklidir.Ancak içinde
sendRedirect
, aynı verileri yeni bir kaynak için kullanmak istiyorsak, verileri oturumda saklamamız veya URL ile birlikte iletmemiz gerekir.Hangisi iyi?
Hangi yöntemin daha kullanışlı olduğu senaryoya bağlıdır.
Kontrolün yeni sunucuya veya içeriğe aktarılmasını istiyorsanız ve tamamen yeni bir görev olarak kabul edilirse, o zaman gidiyoruz
sendRedirect
. Genel olarak, tarayıcı web sayfasının yeniden yüklenmesi üzerine işlem güvenli bir şekilde tekrarlanabiliyorsa ve sonucu etkilemiyorsa bir yönlendirme kullanılmalıdır.
Web geliştirme dünyasında, "yeniden yönlendirme" terimi Location
, istemciye yepyeni bir GET isteği göndermesi gereken yeni URL'yi içeren bir başlıkla boş bir HTTP yanıtı gönderme eylemidir . Yani temelde:
some.jsp
.Location: other.jsp
başlığa sahip bir HTTP yanıtı gönderirother.jsp
(bu, tarayıcı adres çubuğuna yansıtılır!)other.jsp
.Bunu web tarayıcısının yerleşik / eklenti geliştirici araç setiyle izleyebilirsiniz. Chrome / IE9 / Firebug'da F12'ye basın ve görmek için "Ağ" bölümünü kontrol edin.
Tam olarak yukarıdaki ile elde edilir sendRedirect("other.jsp")
. RequestDispatcher#forward()
Bir yönlendirme göndermez. Bunun yerine, hedef sayfanın içeriğini HTTP yanıtı olarak kullanır.
some.jsp
.other.jsp
.Ancak, orijinal HTTP isteği olduğu gibi some.jsp
, tarayıcı adres çubuğundaki URL değişmeden kalır. Ayrıca, arkadaki denetleyicide ayarlanan tüm istek öznitelikleri içinde some.jsp
mevcut olacaktır other.jsp
. Bu, bir yönlendirme sırasında olmaz, çünkü temelde istemciyi üzerinde yeni bir HTTP isteği oluşturmaya zorlarsınız, böylece tüm özniteliklerini içeren other.jsp
orijinal isteği some.jsp
atarsınız.
RequestDispatcher
MVC paradigma son derece yararlıdır ve / veya JSP doğrudan erişimden gizlemek istediğinizde. JSP'leri /WEB-INF
klasöre koyabilir Servlet
ve istekleri kontrol eden, ön işleyen ve son işleyen bir kullanabilirsiniz . /WEB-INF
Klasördeki JSP'lere URL ile doğrudan erişilemez, ancak Servlet
bunlara kullanılarak erişilebilir RequestDispatcher#forward()
.
Örneğin bir JSP dosyayı olabilir /WEB-INF/login.jsp
ve bir LoginServlet
bir üzerine eşleştirilir url-pattern
arasında /login
. Çağırdığınızda http://example.com/context/login
, sunucu doGet()
uygulaması çağrılacaktır. Orada herhangi bir ön işleme işlemi yapabilir ve son olarak isteği şu şekilde iletebilirsiniz :
request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
Bir form gönderirken normalde kullanmak istersiniz POST
:
<form action="login" method="post">
Bu şekilde sunucu doPost()
uygulaması çağrılır ve orada herhangi bir işlem sonrası işlemi yapabilirsiniz (örn. Doğrulama, iş mantığı, kullanıcının oturum açma vb.).
Herhangi bir hata varsa, normalde isteği aynı sayfaya geri iletmek ve giriş alanlarının yanında hataları görüntülemek ve bu şekilde devam etmek istersiniz . Bunun için kullanabilirsiniz RequestDispatcher
.
Bir POST
başarılı olursa, normalde isteği yeniden yönlendirmek istersiniz , böylece kullanıcı isteği yenilediğinde (örn. F5'e basarak veya geçmişte geri döndüğünde) istek yeniden gönderilmez.
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.
}
Böylelikle bir yönlendirme , müşteriye GET
verilen URL'de yeni bir istek başlatması talimatını verir . İsteğin yenilenmesi, ilk isteği değil, yalnızca yeniden yönlendirilen isteği yeniler. Bu, "çift gönderimleri" ve kafa karışıklığını ve kötü kullanıcı deneyimlerini önleyecektir. Buna POST-Redirect-GET
desen de denir .
RequestDispatcher
Arayüzü ileri bir sunucu tarafı yapmak için izin verir / oysa dahil sendRedirect()
istemci taraflı yönlendirme yapar. İstemci tarafı yeniden yönlendirmede, sunucu 302
, web tarayıcısının GET
yeniden yönlendirilen konumdaki içerik için yepyeni bir HTTP isteği göndermesine neden olan bir HTTP durum kodunu (geçici yeniden yönlendirme) geri gönderir . Bunun tersine, RequestDispatcher
arayüzü kullanırken, yeni kaynağa dahil etme / yönlendirme tamamen sunucu tarafında işlenir.
forward
yönlendirme değil.
Forward () ve sendRedirect () yöntemi arasındaki temel önemli fark, forward () durumunda, yönlendirmenin sunucu tarafında gerçekleşmesi ve istemciye görünmemesidir, ancak sendRedirect () durumunda, yönlendirme istemci tarafında gerçekleşir ve görünür müşteriye.
Ne yapmak istediğinize bağlı olarak bu yöntemlerden herhangi biri "daha iyi", yani daha uygun olabilir.
Tarayıcıya gidiş-dönüş yapmadan farklı bir sayfadan verileri aldığınız sürece, sunucu tarafı yeniden yönlendirme daha hızlıdır. Ancak tarayıcıda görülen URL hala orijinal adrestir, bu yüzden orada biraz tutarsızlık yaratıyorsunuz.
İstemci tarafı yeniden yönlendirme, sizi tamamen farklı bir sunucuya gönderebildiği veya protokolü değiştirebildiği (örneğin HTTP'den HTTPS'ye) veya her ikisini birden değiştirebildiği sürece daha çok yönlüdür. Ve tarayıcı yeni URL’nin farkındadır. Ancak sunucu ve istemci arasında fazladan bir ileri geri gitme gerektirir.
SendRedirect()
içeriği sunucular arasında arayacaktır. yavaştır çünkü içeriğin URL'sini göndererek tarayıcıya yakınlaşması gerekir. daha sonra tarayıcı aynı sunucudaki veya başka bir sunucudaki içerik için yeni bir istek oluşturacaktır.
RquestDispatcher
sanırım sunucu içindeki içeriği aramak içindir. bu, sunucu tarafı işlemidir ve SendRedirect()
yönteme göre daha hızlıdır . ama mesele şu ki, gerekli tarih veya içeriği aradığı sunucuda tarayıcıya yakınlık göstermeyecek, tarayıcıdan URL sekmesindeki URL'yi değiştirmesini de istemeyecek. bu nedenle kullanıcıya çok az rahatsızlık verir.
Kontrolü farklı bir etki alanına aktarmamız gerekirse veya görevlerin ayrılmasını sağlamak için teknik olarak yeniden yönlendirme kullanılmalıdır.
Örneğin, ödeme uygulamasında, önce Ödeme İşlemini yaparız ve ardından displayPaymentInfo'ya yönlendiririz. İstemci tarayıcıyı yenilerse, yalnızca displayPaymentInfo tekrar yapılacak ve PaymentProcess tekrarlanmayacaktır. Ancak bu senaryoda ileriye doğru kullanırsak, hem PaymentProcess hem de displayPaymentInfo sıralı olarak yeniden çalıştırılır ve bu da tutarsız verilere neden olabilir.
Diğer senaryolar için, sendRedirect'ten daha hızlı olduğu için forward kullanımı etkilidir.
İstek Dağıtıcı, isteği veya yanıtı web kaynağından başka bir web kaynağına göndermek için kullanılan bir Arayüzdür. Esas olarak iki yöntem içerir.
request.forward(req,res)
: Bu yöntem, isteği bir web kaynağından başka bir kaynağa iletmek için kullanılır. yani bir sunucu uygulamasından başka bir sunucu uygulamasına veya bir web uygulamasından başka bir web uygulamasına.
response.include(req,res)
: Bu yöntem, bir sunucu uygulamasının başka bir sunucu uygulamasına yanıtını içerir
NOT: Request Dispatcher'ı kullanarak, isteği veya yanıtları aynı sunucuda yönlendirebilir veya dahil edebiliriz.
request.sendRedirect()
: Bunu kullanarak, isteği veya yanıtları farklı sunucular arasında iletebilir veya dahil edebiliriz. Bu durumda müşteri sayfayı yeniden yönlendirirken bir intimation alır, ancak yukarıdaki süreçte müşteri intimasyon almaz.
Basitçe arasındaki fark Forward(ServletRequest request, ServletResponse response)
ve sendRedirect(String url)
bir
) (İleri:
forward()
Yöntem, sunucu tarafında yürütülür.forward ()
Yöntem, sunucu uygulaması kapsayıcısı tarafından sağlandığından , istemcinin istek protokolüne bağlı değildir .forward()
Yöntemi daha hızlı daha sendRedirect()
yöntemle.RequestDispatcher
Arayüzde beyan edilir .sendRedirect ():
response.sendRedirect("..")
Sunucu uygulamasından web sitesinin index.jsp sayfasına bir yapıyorum . Ancak bu, css dosyalarını ve jsp sayfasındaki bazı metinleri gözden kaçırarak sayfanın kısmi yüklenmesine yol açar. Ancak web sitesinin karşılama sayfasını index.jsp yaptığımda, her şey yolunda gidiyor ve sayfa yüklemeleri tamamlanıyor. yönlendirmeyle ilgili sorun nedir?