Путаница с RequestDispatcher говорит, что адресная строка браузера не меняется - PullRequest
2 голосов
/ 10 сентября 2010

Все онлайн-ссылки и первая книга о JSP и сервлетах, которую я читаю, указывают на характеристики RequestDispatcher и Redirect (т.е. resoponse.sendRedirect ()), например:

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

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

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

С кодом ниже,

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

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

Итак ... URL изменен! (из ... / tmp3.jsp в ... / зарегистрироваться)

Может кто-нибудь объяснить мне, что они подразумевают под "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>

Ответы [ 2 ]

5 голосов
/ 10 сентября 2010

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

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

Для второго шага:

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

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

0 голосов
/ 10 сентября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...