SORU
12 Ocak 2010, Salı


requestDispatcher Arayüzü Vs sendRedirect

RequestDispatcher arayüzü sendRedirect() arasındaki farkı bilebilirim.

CEVAP
12 Ocak 2010, Salı


İlk olarak, terim "yönlendirme" web geliştirme dünya eylem Gönderen istemci boş bir HTTP yanıtı ile sadece Location Başlık ile orada yeni bir URL üzerinde ki istemci göndermek yepyeni bir GET isteği. Temelde böylece:

  • İstemci some.jsp için bir HTTP isteği gönderir.
  • Server Location: other.jsp Başlık ile tekrar bir HTTP yanıtı gönderir
  • İstemci other.jsp bir HTTP isteği (bu tarayıcı Adres yansıyan olsun bar!) gönderir
  • Server other.jsp içerik ile geri HTTP yanıtı gönderir.

Bu Tarayıcıda bu dahili/eklenti geliştirici araç ile takip edebilirsiniz. Basın/9/Firebug ve kontrol Krom F12 "Ağ" görmek bölüm.

Aynen yukarıdaki sendRedirect("other.jsp") elde edilir. RequestDispatcher#forward() yönlendirme göndermez. Bunun yerine, HTTP yanıt olarak hedef sayfanın içeriğini kullanır.

  • İstemci some.jsp için bir HTTP isteği gönderir.
  • Server other.jsp içerik ile geri HTTP yanıtı gönderir.

Ancak özgün HTTP isteği some.jsp, tarayıcı Adres (URL olarak bar değişmeden kalır.


RequestDispatcher doğrudan erişim JSP şey gizlemek istediğinizde MVC paradigma ve/veya son derece yararlıdır. /WEB-INF JSP klasörüne koy ve kontrol eden Servlet, preprocesses ve postprocesses istekleri kullanabilirsiniz. /WEB-INF JSP klasör URL tarafından doğrudan erişilebilir değil, ama Servlet onları RequestDispatcher#forward() ile ulaşabilirsiniz.

Örneğin /login url-pattern bir eşlenmiş /WEB-INF/login.jsp LoginServlet bir JSP dosyası var. http://example.com/context/login sunucu doGet() çağırdığınızda çağrılacak. Herhangi birini yapabilirsiniz . ben^>preve nihayet işleme şeylerileriistek gibi:

request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);

Bir form gönderdiğinizde, normalde POST kullanmak istiyor:

<form action="login" method="post">

Bu şekilde sunucu uygulaması doPost() çağrılacak ve herhangi yapabilirsiniz . ben^>postorada işleme şeyleri (örneğin doğrulama, iş mantığı, kullanıcının oturum açma, vb.).

Eğer herhangi bir hata varsa, o zaman normalilerigeri aynı sayfaya istek ve hataları var giriş alanları için bir sonraki ve benzeri görüntüler. Bunun için RequestDispatcher kullanabilirsiniz.

Eğer POST başarılı olursa, normal olarakyönlendirmekistek kullanıcı isteği yeniler, tekrar olmayacak bu yüzden bu isteği, (örneğin F5 tuşuna basarak ya da tarihin geri gezinme).

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.
}

Biryönlendirmekböylece bildirir verilen URL GET yeni bir istek yangın için istemci. Yenileme isteği o zaman sadece yeniden yönlendirilen istek ve ilk istek değil tazelememe yardımcı olur. Bu "çift gönderir" ve karışıklık ve kötü bir kullanıcı deneyimi. kaçının Bu da POST-Redirect-GET pattern denir.

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Elliot Davin

    Elliot Davin

    28 Kasım 2008
  • optionalinfo

    optionalinfo

    29 EKİM 2005
  • VvCompHelpvV

    VvCompHelpvV

    4 EYLÜL 2007