Вперед не изменить URL-адрес в адресной строке браузера
Я только начинаю с сервлетов / 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>
и в моем методе допост
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);
}
но что-то не работает, потому что я хотел что-то вроде этого:
- если пользователь имел активный сеанс и был зарегистрирован в системе "zalogowany", должен показать
- в противном случае форма регистрации
проблема в том, что я делаю, эти форварды не ставят меня в индекс.JSP, который находится в корневой папке из моего проекта у меня все еще есть в адресной строке Projekt/Hai.
1 ответов
если это действительно ваш только
проблема в том, что я делаю, эти форварды не ставят меня в индекс.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
.