Я понимаю, что сервлет имеет сопоставления 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?