После отправки HTML-формы действие сервлета появляется в URL-адресе, а не в файле JSP. - PullRequest
2 голосов
/ 07 мая 2011

Я создал простую страницу входа. Если пользователь ввел правильное имя пользователя и пароль, страница будет перенаправлена ​​на страницу успеха, в противном случае она будет перенаправлена ​​на страницу индекса. На странице входа я получил форму отправки действия сервлету. Как только сервлет подтвердит ввод, он будет отправлен на соответствующую страницу JSP. Моя проблема заключалась в том, что имя действия все еще было в URL после отправки. Это правильно?

package com.123.www;

import java.io.IOException;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

public class Login extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public Login() {
        super();
    }

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException 
    {

        response.setContentType("text/html");

        //PrintWriter out = response.getWriter();

        String userName = request.getParameter("username");

        String passWord = request.getParameter("password");

        RequestDispatcher view = null ;

        if((userName=="")&&(passWord==""))
        {
            view = request.getRequestDispatcher("index.jsp");
        }
        else
        {   
            HttpSession session = request.getSession(true);
            session.setAttribute("name",userName);
            view = request.getRequestDispatcher("success.jsp");
        }

        view.forward(request, response);

    }

}

Ответы [ 2 ]

2 голосов
/ 07 мая 2011

Диспетчеризация происходит на стороне сервера, а не на стороне клиента. Форвард в основном сообщает сервлет-контейнеру, какое представление использовать для представления результата. Его местоположение действительно не отображается в адресной строке браузера клиента. Это произойдет только тогда, когда вы используете перенаправление вместо response.sendRedirect(). Редирект в основном говорит веб-браузеру запускать новый GET-запрос в указанном месте. При этом адресная строка браузера изменится на новый URL.

Просто скройте представление (файл JSP) в папке /WEB-INF, чтобы конечный пользователь больше не мог получить к нему прямой доступ, и снова используйте тот же сервлет, чтобы показать форму входа через doGet() и продолжить обработку входа Форма для отправки через doPost(). Если вы не реализуете doGet(), тогда будет отображаться HTTP Status 405 - метод HTTP GET не поддерживается этим URL .

@WebServlet("/login")
public class LoginServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Just show form.
        request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // Process form submit.
        // ...

        if (success) {
            response.sendRedirect("home");
        } else {
            request.getRequestDispatcher("/WEB-INF/login.jsp").forward(request, response);
        }
    }

}

Таким образом, вы можете получить страницу входа по номеру http://example.com/context/login и отправить по тому же URL.

Вы можете сделать то же самое для всех других URL-адресов одним сервлетом с помощью шаблона front controller . Это всего лишь небольшая работа, и именно поэтому существуют рамки MVC:)

Смотри также:

1 голос
/ 07 мая 2011

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

Вы когда-нибудь слышали о Spring Framework? Это обеспечивает отличный каркас для создания веб-приложений.

...