#java #mysql #jsp #servlets #jakarta-ee
#java #mysql #jsp #сервлеты #джакарта-ee
Вопрос:
я изучаю CRUD и login. у меня проблемы с входом в систему. я не могу заставить его работать на стороне сервлета, у меня есть интерфейс UserDao :
public interface UsersDao {
public boolean validate(String UserName, String Password);
}
Класс UsersDaoImplementation:
@Override
public boolean validate(String UserName, String Password) {
boolean status = false;
PreparedStatement preparedStatement = null;
ResultSet resultSet = null;
try {
String query = "SELECT * FROM Users WHERE UserName=? and Password=?";
preparedStatement = conn.prepareStatement( query );
preparedStatement.setString(1, UserName);
preparedStatement.setString(2, Password);
resultSet = preparedStatement.executeQuery();
status=resultSet.next();
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}finally {
if (conn != null) {
try {
conn.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (preparedStatement != null) {
try {
preparedStatement.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
if (resultSet != null) {
try {
resultSet.close();
} catch (SQLException e) {
e.printStackTrace();
}
}
}
return status;
}
для сервлета это то, что у меня есть
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");
HttpSession session = request.getSession(false);
if(session!=null)
session.setAttribute("UserName", UserName);
if (UsersDaoImplementation.validate(UserName, Password))
{
RequestDispatcher rd=request.getRequestDispatcher("/WEB-INF/views/jupiter/jupiter.jsp");
rd.forward(request,response);
}
else
{
out.print("<p style="color:red">Sorry username or password error</p>");
RequestDispatcher rd=request.getRequestDispatcher("/WEB-INF/views/system/index.html");
rd.include(request,response);
}
out.close();
}
Как правильно это сделать? и что я не делаю правильно?
Комментарии:
1.
if (UserName.equals(UserName)
… каково предполагаемое значение этого?2. если он совпадает с данными в базе данных
3. Для меня это не имеет никакого смысла. Разве строка не будет всегда равна самой себе?
4. вот почему я здесь ищу ответы
Ответ №1:
Во-первых, здесь вы берете значения имени пользователя и пароля из запроса, возможно, с html-страницы.
String UserName=request.getParameter("UserName");
String Password=request.getParameter("Password");
Затем вы сравниваете эти значения, которые вы получаете, с самими собой
if (UserName.equals(UserName)
amp;amp; Password.equals(Password))
Таким образом, он всегда будет возвращать true.
Во-вторых, внутри вашего оператора if вы вызываете свою функцию validate, но вы не используете ее возврат, вы просто вызываете ее.
dao.validate(UserName,Password);
Итак, вы, скорее всего, хотите сделать что-то вроде этого
if (dao.validate(UserName, Password) {
// user found
}
Комментарии:
1. это все еще подчеркивает dao, я не знаю, какой объект доступа к данным вызывать сейчас, поскольку все они помечены
2. что именно говорит флаг?
3. Похоже, вы не создали экземпляр dao. Вам нужно сделать что-то вроде: UsersDaoImplementation dao = new UsersDaoImplementation() , затем вызвать метод validate(), используя ваш новый объект dao.
Ответ №2:
Эти строки: if (UserName.equals(имя пользователя) amp;amp; Password.equals(пароль))
не имеет смысла, потому что сравнения не имеют функции. Вы сравнили переменную Username с самим собой.
1 - RequestDispatcher rd=request.getRequestDispatcher("/WEB-INF/views/jupiter/jupiter.jsp");
2 - rd.forward(request,response);
3 - dao.validate(UserName,Password);
На первом шаге вы перенаправляете (строка 2), после чего на следующем шаге вы проверяете (строка 3). Я думаю, что вам следует изменить строки 2 и 3.
1 - RequestDispatcher rd=request.getRequestDispatcher("/WEB-INF/views/jupiter/jupiter.jsp");
2 - dao.validate(UserName,Password);
3 - rd.forward(request,response);