Форвард не меняет URL в адресной строке браузера - PullRequest
11 голосов
/ 10 февраля 2012

Я только начинаю с Servlets / JSP / JSTL, и у меня есть что-то вроде этого:

<html>
<body>
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<jsp:directive.page contentType="text/html; charset=UTF-8" />

<c:choose>
  <c:when test='${!empty login}'>
    zalogowany
  </c:when>
<c:otherwise>
   <c:if test='${showWarning == "yes"}'>
        <b>Wrong user/password</b>
    </c:if>
    <form action="Hai" method="post">
    login<br/>
     <input type="text" name="login"/><br/>
     password<br/>
     <input type="password" name="password"/>
     <input type="submit"/>
     </form>
  </c:otherwise>
</c:choose>
</body>
</html>

и в моем методе doPost

protected void doPost(HttpServletRequest request, HttpServletResponse response) 
        throws ServletException, IOException 
{
    HttpSession session=request.getSession();
    try
    {
        logUser(request);
    }
    catch(EmptyFieldException e)
    {
        session.setAttribute("showWarning", "yes");
    } catch (WrongUserException e) 
    {
        session.setAttribute("showWarning", "yes");
    }
    RequestDispatcher d=request.getRequestDispatcher("/index.jsp");
    System.out.println("z");
    d.forward(request, response);
}

но что-то не работает, потому что я хотел что-то вроде этого:

  1. , если у пользователя был активный сеанс и он был зарегистрирован в системе "zalogowany", должно отображаться
  2. иначе форма регистрации

проблема в том, что я делаю, эти форварды не помещают меня в index.jsp, который находится в корневой папке моего проекта, у меня все еще есть в адресной строке Projekt / Hai.

1 Ответ

24 голосов
/ 10 февраля 2012

Если это действительно ваша проблема only

проблема в том, что я делаю, эти форварды не помещают меня в index.jsp, который находится вкорневая папка моего проекта, у меня все еще есть в моей адресной строке Projekt / Hai.

, тогда я должен вас разочаровать: это полностью по спецификации.Форвард в основном говорит серверу использовать данную JSP для представления результатов.Это не говорит клиенту, чтобы отправить новый HTTP-запрос на данный JSP.Если вы ожидаете изменения в адресной строке клиента, вы должны указать клиенту отправить новый HTTP-запрос.Вы можете сделать это, отправив перенаправление вместо форварда.

Итак, вместо

RequestDispatcher d=request.getRequestDispatcher("/index.jsp");
System.out.println("z");
d.forward(request, response);

do

response.sendRedirect(request.getContextPath() + "/index.jsp");

Альтернативой является избавление от/index.jsp URL в целом и используйте /Hai URL все время.Вы можете добиться этого, спрятав JSP в папке /WEB-INF (чтобы конечный пользователь никогда не мог открыть ее напрямую, и вынужден использовать для этого URL-адрес сервлета), а также реализовать doGet() сервлета для отображения JSP.:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.getRequestDispatcher("/WEB-INF/index.jsp").forward(request, response);
}

Таким образом, вы можете просто открыть http://localhost:8080/Project/Hai и увидеть выходные данные страницы JSP, и форма просто отправит на тот же URL, поэтому URL в адресной строке браузерав принципе не изменится.Я бы, возможно, только изменил /Hai на что-то более разумное, например /login.

См. Также:

...