2013-07-27 3 views
0

Я разрабатываю онлайн-приложение для банковских операций, и это 1 часть, где я застрял.Извлечь последнюю строку, вставленную в БД

-> Пользователям показана форма на HTML-странице, чтобы ввести их данные, чтобы создать учетную запись.

-> Затем данные вводятся в базу данных MySQL, и пользователь перенаправляется на страницу JSP, где ему должен быть указан номер его учетной записи (сгенерированный автоматически с использованием функции автоматического увеличения MySQL) и секретный 4-значный pin (генерируется случайным образом для каждого пользователя, а не путем автоматического увеличения).

Код sinppet из метода моего сервлета doPost() для вставки значений в БД и перенаправление JSP является здесь-

try { 
Class.forName("com.mysql.jdbc.Driver"); 
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/inb", "root", "root"); 

//The user's password has to be converted into a salted hash before storing in the database. 
String hashed_password=CreateDigest.getPasswordDigest(request.getParameter("password")); 

PreparedStatement ps=con.prepareStatement("insert into inb.users values (NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); 
     ps.setString(1, request.getParameter("name1")); 
     ps.setString(2, request.getParameter("name2")); 
     ps.setString(3, request.getParameter("name3")); 
     ps.setString(4, request.getParameter("dob")); 
     ps.setInt(5, Integer.parseInt(request.getParameter("age"))); 
     ps.setString(6, request.getParameter("email")); 
     ps.setString(7, request.getParameter("mobnum")); 
     ps.setString(8, request.getParameter("address1")); 
     ps.setString(9, request.getParameter("address2")); 
     ps.setString(10, request.getParameter("pannum")); 
     ps.setString(11, request.getParameter("aadhar")); 
     ps.setString(12, hashed_password); 
     ps.setString(13, request.getParameter("acc_bal")); 
     ps.setInt(14, pin); 

      int i=ps.executeUpdate(); 


    //Check if records have been actually been inserted or not. 
     if (i>0) { 
      response.sendRedirect("AccountOpened.jsp"); 
     } 

    } catch (ClassNotFoundException | SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

Теперь это код JSP для отображения учетной записи нет. и штифт USER- (last_acc_no и last_pin статические переменные в моем Servlet класс, который я создан, чтобы держать последнюю вставленную счет нет и пин-код.)

<% 
String acc_no=CreateAccount.last_acc_No; 
int pin=CreateAccount.last_pin; 
%> 
<h3>Congratulations ! Your account has been created.</h3>. 
<br/><br/> 
Your Account Number Is : <b> <%= acc_no %> </b> 
<br/><br/> 
Your Secret PIN No. Is : <b> <%= pin %> </b> 

Теперь я хочу, чтобы получить ACCOUNT_NO и пин-код последнего вставленного пользователя, чтобы я мог показать его на странице JSP. И я не могу найти способ для этого.

+0

'static' переменные в классе сервлетов ** плохо **! Следующая вещь - не использовать sriptlets в JSP! Вопрос: почему вы используете 'redirect()' вместо 'RequestDispatcher'? – NINCOMPOOP

+0

@TheNewIdiot, что еще хуже: OP создает соединение с базой данных вручную вместо использования пула соединений с базой данных, и нет никакой разницы между Model и Controller в этом приложении, а также показывает отсутствие знаний о разработке многоуровневых приложений для целей обслуживания. –

ответ

0
try { 
Class.forName("com.mysql.jdbc.Driver"); 
Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/inb", "root", "root"); 

//The user's password has to be converted into a salted hash before storing in the database. 
String hashed_password=CreateDigest.getPasswordDigest(request.getParameter("password")); 

PreparedStatement ps=con.prepareStatement("insert into inb.users values (NULL, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", , Statement.RETURN_GENERATED_KEYS); 
     ps.setString(1, request.getParameter("name1")); 
     ps.setString(2, request.getParameter("name2")); 
     ps.setString(3, request.getParameter("name3")); 
     ps.setString(4, request.getParameter("dob")); 
     ps.setInt(5, Integer.parseInt(request.getParameter("age"))); 
     ps.setString(6, request.getParameter("email")); 
     ps.setString(7, request.getParameter("mobnum")); 
     ps.setString(8, request.getParameter("address1")); 
     ps.setString(9, request.getParameter("address2")); 
     ps.setString(10, request.getParameter("pannum")); 
     ps.setString(11, request.getParameter("aadhar")); 
     ps.setString(12, hashed_password); 
     ps.setString(13, request.getParameter("acc_bal")); 
     ps.setInt(14, pin); 

      int i=ps.executeUpdate(); 


    //Check if records have been actually been inserted or not. 
      ResultSet rs = ps.getGeneratedKeys(); 
      if(rs.next()) 
      { 
       int id = rs.getInt(1); 
      request.setAttribute("id", id); 
      request.setAttribute("pin", pin); 
      request.getRequestDispatcher("AccountOpened.jsp").forward(request, response); 
     } 

    } catch (ClassNotFoundException | SQLException e) { 
     // TODO Auto-generated catch block 
     e.printStackTrace(); 
    } 

на странице JSP:

<h3>Congratulations ! Your account has been created.</h3>. 
<br/><br/> 
Your Account Number Is : <b> <%= request.getAttribute("id")%> </b> 
<br/><br/> 
Your Secret PIN No. Is : <b> <%= request.getAttribute("pin") %> </b> 
+0

@ elbek- Это сработало. Большое спасибо. – plutonium1991

+0

@ TheNewIdiot- Thanx за информацию, которую вы мне дали, я этого не знал. Но можете ли вы, пожалуйста, рассказать мне, каковы недостатки использования статических переменных в сервлете, и почему мы не должны использовать скрипты на странице JSP? – plutonium1991

+0

@ plutonium1991, это атрибуты области запроса. Servelt не может быть потокобезопасным. Проверьте атрибуты областей видимости и сервлетов. Aslo не забудьте принять ответ – Elbek

0

Рассматривали вы используете Return SCOPE_IDENTITY() в вашем t-sql?

Это int i, возвращающий номер счета - это должно быть. Таким образом, вам не нужно беспокоиться о том, что это самая верхняя запись в вашей базе данных. Опасно строго сказать, что вам нужна последняя запись, которая была создана. Пользователь A и пользователь B могут создавать учетную запись примерно в одно и то же время и получать информацию о запутанной/перекрестной учетной записи. Как только у вас есть accountNumber для «int i», у вас не должно возникнуть проблемы с перехватом этой информации из базы данных?

Помогает ли это?

+0

@ fenix- int i только возвращает no. записей, вставленных в БД, что, скорее всего, 1. Это не учетная запись. И я просто хочу получить учетную запись no и вывести из базы данных, чтобы показать ее пользователю. Не будет ли банк давать пользовательское согласие. нет ему ?? – plutonium1991

+0

@Luiggi Mendoza- Я студент, изучающий Java-технологии, а не профессионалы, подобные вам. И этот проект является частью моей летней подготовки. – plutonium1991

Смежные вопросы