2010-09-10 7 views
2

Все онлайн ссылки и руководитель первого JSP Servlet & книгу я читала государству характеристику RequestDispatcher и Redirect (т.е. resoponse.sendRedirect()), как:Путаница с RequestDispatcher говоря адресной строке браузера не изменяется

«Запрос диспетчера» - URL-адрес в строке браузера не изменяется.

«Перенаправление» - пользователь видит новый URL-адрес в браузере.

Но согласно моему тесту, для RequestDispatcher, я вижу изменения URL, поэтому я не понимаю, что они на самом деле означают.

С ниже код,

  1. Я на http://whatever.com/tmp3.jsp и вот что говорит URL в браузере.

  2. Нажмите на кнопку для вызова сервлета, который в свою очередь он передает данные на сервер, то сервер посылает ответ обратно в браузер, так что URL в браузере теперь говорит http://whatever.com/register

Так .. URL изменилось! (от .../tmp3.jsp to .../register)

Может ли кто-нибудь объяснить мне, что они подразумевают под «URL в браузере не меняется»?

Пример:

(tmp3.jsp)

<html> 
<head> 
</head> 
<body> 
    ${message} 
    <!-- click button to send request to servlet --> 
    <form method="POST" action="register"> 
     <input type="submit" value="click!"> 
    </form> 
</body> 
</html> 

(сервлет)

package com.masatosan.tmp; 

import java.io.IOException; 

import javax.servlet.ServletException; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 


public class Tmp extends HttpServlet { 


    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     doPost(request, response); 
    } 

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
     request.setAttribute("message", "processed!"); 

     String address = "/tmp3.jsp"; 
     request.getRequestDispatcher(address).forward(request, response); 
    }//end doPost() 

}//end class 

(web.xml фрагмент) - отображение сервлета и URL

<servlet> 
    <servlet-name>test</servlet-name> 
    <servlet-class>com.masatosan.tmp.Tmp</servlet-class> 
</servlet> 
<servlet-mapping> 
    <servlet-name>test</servlet-name> 
    <url-pattern>/register</url-pattern> 
</servlet-mapping> 
+0

Я бы разместил JSP в папке '/ WEB-INF' и полностью использовал'/register'. – BalusC

+0

@BalusC: В чем причина размещения файлов jsp в/WEB-INF? Я думал/WEB-INF содержит классы и библиотеки, а файлы jsp - что-то вроде webapps/webContent/foo.jsp? –

+1

Чтобы скрыть JSP от прямого доступа. Таким образом, вы получаете более приятные URL-адреса. Вы уже отправляете запрос в JSP-файл по запросу GET. Так почему бы просто не использовать сервлет как контроллер до конца? См. Также [«Скрытые функции» JSP/Сервл] (http://stackoverflow.com/questions/2523430/hidden-features-of-jsp-servlet/2525995#2525995). Более полезную информацию и ссылки можно найти на странице [Информация о тегах сервлета] (http://stackoverflow.com/tags/servlets/info). – BalusC

ответ

5

Две вещи происходят здесь:

  • первой отправки формы в сервлет, который всегда изменяет URL
  • тогда вы решили перенаправить или направить на вид - т.е.другой (или тот же) JSP

Для второго этапа:

  • перенаправлять посылает специальный заголовок браузера, и это делает новый запрос на страницу, к которой перенаправление указывает
  • вперед делает это внутренне, в пределах того же запроса, и браузер никогда не понимает, что это не ресурс он просил

В вашем примере URL остается /register, потому что вы используете forward. Если вы используете redirect, он будет первым изменится /register, а затем она будет вернуться к tmp.jsp

+0

Спасибо! Я, наконец, понял после прочтения ответа, как 5 раз ... –

+1

@ masato-san, вам может показаться полезным наблюдать, как HTTP-заголовки отправляются браузером и сервером в таком обмене. –

+0

@matt b: Это действительно отличный момент, так как у меня есть firebug. –

0

Url не изменилась от .../register к tmp3.jsp, в то время как ответ был от последнего. С Redirect вы увидите .../tmp3.jsp в строке браузера URL.

Смежные вопросы