Основы сервлетов и JSP: Использовать один или два сервлета для оформления входа на сайт? - PullRequest
0 голосов
/ 07 ноября 2018

Я изучаю сервлеты и JSP, и у меня, наверное, очень простой вопрос. Я понимаю, что сервлет имеет сопоставления URL-адресов, поэтому при запросе URL-адреса соответствующий сервлет принимает запрос, обрабатывает его и, возможно, перенаправляет в JSP.

Теперь я хочу сделать страницу входа. Когда я запрашиваю URL, заканчивающийся на «... / Логин», я хочу отобразить форму с полями имени пользователя и пароля и кнопкой входа в систему. Когда кнопка нажата, я хочу, чтобы страница об успехе или неудаче отображалась.

У меня вопрос: нужны ли мне 2 URL-адреса для этой операции, один из которых будет, например, "... / Login", а другой - "... / Login / Result", а когда нажимается кнопка, сообщение будет отправлено на второй? В этом случае мне понадобятся два сервлета. Первый просто перенаправит в JSP, который содержит форму, и эта форма будет иметь:

<form action="/Result" method="post">

и второй получит запрос, содержащий данные формы, и выполнит реальную логику входа в систему и перейдет к просмотру успешного или неудачного просмотра (JSP).

Это способ сделать это или есть более простой способ входа в систему, используя один сервлет? Есть ли способ для одного сервлета отобразить начальное представление, содержащее форму, а затем при отправке этой формы отобразить последующее представление (успех / сбой)?

Ответы [ 3 ]

0 голосов
/ 07 ноября 2018

Это основано на мнении. Что бы я сделал, это

  • Иметь папку с именем login и страницу index.jsp, содержащую дизайн формы входа в систему (.../login/index.jsp). Поэтому я могу позвонить .../login/, так как нет необходимости упоминать index.jsp в URL.

folder-tree

  • Тогда у меня будет сервлет для передачи информации для проверки. Я бы предпочел, чтобы URL сервлета был .../login/controller.

  • тег формы /login/index.jsp будет выглядеть следующим образом.

    <form action="controller" method="POST">
    

Но вы можете сделать это даже с одной страницей JSP. В начале страницы вы можете проверить, передается ли информация для входа.

<%
    String username = request.getParameter("username"),
              password = request.getParameter("password");

    if(username != null && password != null){

          //validation part

          response.sendRedirect("profile.jsp"); //if login successful
          return; //make sure you add this after redirecting.
    }
%>

<!-- html part of the login page continues -->

<form action="" method="POST">

Примечание: если вы хотите удалить часть .jsp из вашего URL при отправке запроса на страницу jsp. Вы можете добавить сопоставление URL для страницы jsp в дескрипторе развертывания (web.xml).

<servlet>
    <servlet-name>Login</servlet-name>
    <jsp-file>login.jsp</jsp-file>
</servlet>

<servlet-mapping>
    <servlet-name>Login</servlet-name>
    <url-pattern>/login</url-pattern>
</servlet-mapping>

Прочитайте Url Mapping For Jsp для получения дополнительной информации.

0 голосов
/ 07 ноября 2018

Я понимаю, что сервлет имеет сопоставления URL, так что когда URL запрашивается, связанный сервлет принимает запрос, обрабатывает его и возможно переадресация на JSP.

Исправьте, но помните, что только метод doGet доступен напрямую. (т.е. вы можете запустить метод doGet сервлета, введя его в браузер)

Когда я запрашиваю URL, заканчивающийся на "... / Логин", я хочу отобразить Форма с полями имени пользователя и пароля и кнопкой входа.

Вы можете использовать метод doGet сервлета Login для перенаправления на jsp:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    RequestDispatcher rd = request.getRequestDispatcher("login.jsp");
    rd.forward(request, response);
}

Таким образом, теперь вы можете получить доступ либо к форме входа в систему либо напрямую /login.jsp, либо через метод doGet нашего сервлета входа /Login

Например, у вас может быть ссылка где-то вроде этого:

<a href="/Login">Login</a>

У меня вопрос: нужно ли мне 2 URL для этой операции, один из которых будет быть "... / Логин" и другие "... / Логин / Результат", например, и когда кнопка нажата, запрос на отправку будет отправлен на второй? В этом случае мне понадобятся два сервлета. Первый просто перешлите к JSP, который содержит форму, и эта форма будет иметь:

Нет, это было бы слишком сложно и усложнило бы управление вашим приложением. Вы можете использовать один и тот же сервлет входа в систему, чтобы перенаправить пользователя на страницу входа в систему (doGet) и обработать результаты (doPost).

Когда кнопка нажата, я хочу, чтобы страница об успехе или неудаче отображалась.

Вместо сбоя jsp, почему бы просто не оставить его на странице входа? Если пользователь по ошибке вводит свой пароль по ошибке более одного раза, ему будет досадно возвращаться на страницу входа. Что делают большинство веб-сайтов, так это то, что они отображают сообщение об ошибке на самой странице входа в систему, поэтому они могут легко просто ввести свои данные снова, не нажимая назад. И вам не нужна выделенная jsp успеха, страница успеха будет просто панель инструментов / homepage / welcomepage.

Вот хороший пример вышесказанного:

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

//get the parameters submitted by the form
String user_name = request.getParameter("username");
String user_pass = request.getParameter("password");

String url = ""; //Create a string literal that we will modify based on if the details are correct or not. 
UserDao udao = new UserDao(); //class containing all the database methods pertaining to the user table.
if(udao.isValid(user_name, user_pass)){ //UserDao has a method called isValid which returns a boolean. 

    //details are valid so forward to success page
    url = "welcome.jsp"; //set the url welcome.jsp because the details are correct. 

    //here you set your session variables and do whatever else you want to do
    HttpSession session = (request.getSession());
    session.setAttribute("username", user_name); // i can access this variable now in any jsp with: ${username}


}else{

    //details are not valid so lets forward them back to the login page with an error message
    String error = "Username or password is incorrect!";
    request.setAttribute("error", error); 
    url = "login.jsp"; //set the url login.jsp because the details are incorrect.

}

RequestDispatcher rd = request.getRequestDispatcher(url); //the url we set based on if details are correct or not
rd.forward(request, response);

}

Ваш jsp может выглядеть примерно так:

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<jsp:include flush="true" page="includes/header.jsp"></jsp:include>


<form action="../Login" method="post">

<input type="text" name="username">
<input type="password" name="password">

<input type="submit" value="Submit">

</form>

<!-- you can handle the error here also -->
<h1>${error}</h1>



<jsp:include flush="true" page="includes/footer.jsp"></jsp:include>

Метод isValid внутри класса UserDao будет выглядеть примерно так:

public boolean isValid(String username, String userpass){          
     boolean status = false;  
    PreparedStatement pst = null;  
    ResultSet rs = null;  
    try(Connection conn= DBConnection.getConnection()){
            pst = conn.prepareStatement("select * from user where username=? and userpass=?;");  
            pst.setString(1, username);  
            pst.setString(2, userpass);  
            rs = pst.executeQuery(); 
        status = rs.next();  
    } catch (SQLException e) {
        e.printStackTrace();
    }
    return status;  
}

Надеюсь, это поможет понять это лучше, если у вас есть какие-либо вопросы, не стесняйтесь задавать.

Примечание : один из ответов использует скриптлеты в своем jsp (эти <% %> вещи). Это очень не рекомендуется! Если вы хотите начать по правильному пути, не используйте скриптлеты! Подробнее о причинах здесь:

Как избежать использования кода Java в файлах JSP?

0 голосов
/ 07 ноября 2018

Как правило, вам нужно использовать несколько URL.

Это потому, что вы хотите следовать основным идиомам POST, REDIRECT, GET для большинства ваших транзакций. Это помогает усилить природу веб-приложений без сохранения состояния.

Итак, для вашего примера, вы можете сделать что-то вроде этого:

GET /Login (сопоставлено с LoginServlet) -> dispatcher.forward ("/ login.jsp"), которое отображает форму входа.

Форма будет тогда:

POST /Login с учетными данными пользователя. Обратите внимание, что URL-адрес такой же, но запрос другой: POST вместо GET.

В этот момент, если вход успешен, LoginServlet отправит HttpServletResponse.sendRedirect, скажем, «/ Welcome» (который является вашим WelcomeServlet).

Если вход в систему НЕ УДАЛЕН, то вам нужно НАПРАВИТЬ на ошибку входа в систему. Это может быть так же просто, как ваш LoginServlet с параметром «fail».

Итак, .sendRedirect ("/ Логин? Сбой"). Когда ваш LoginServlet видит параметр «fail», он пересылается в «/loginFailed.jsp".

Зачем ты это делаешь?

Просто подумайте о том, что произойдет, если пользователь сделает кнопку обновления в своем браузере. Если вы просто POST и затем перешли на JSP, при обновлении браузер снова POST (или спросит, хотите ли вы снова отправить форму, что раздражает).

При отправке перенаправления, которое вызывает новый GET, URL-адрес изменяется, и он просто перезагружает последнюю просмотренную страницу.

Наконец, вы не хотите напрямую GET JSP, а направлять их через слой сервлетов. Сервлеты - это действия в системе, JSP - это просто представления. Отправьте запросы сервлетам, дайте им понять, что это за представления.

После того, как вы сделали это пару раз, вы, возможно, захотите заглянуть в "рамки действий", которые облегчают этот тип веб-программирования.

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