2013-07-27 5 views
0

온라인 뱅킹 응용 프로그램을 개발 중입니다. 여기서 멈추는 부분은 1 부분입니다.DB에 삽입 된 마지막 행 가져 오기

-> 사용자는 세부 정보를 입력하고 계정을 만들기 위해 HTML 페이지에 양식을 표시합니다.

-> 세부 정보가 MySQL 데이터베이스에 입력되고 사용자가 계정 번호 (MySQL 자동 증가 기능을 사용하여 자동 생성됨)와 비밀 번호 4 자리가 표시되어야하는 JSP 페이지로 리디렉션됩니다 핀 (자동 증가가 아닌 모든 사용자에 대해 무작위로 생성).

JSP에 DB의 값과 리디렉션을 삽입하는 내 서블릿의의 doPost() 메소드에서 코드 sinppet은 여기 - 지금

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 코드 NO. 그리고 사용자 - 의 핀 (last_acc_no 및 last_pin 내가 더 핀 마지막으로 삽입 된 계정을 보유 만들어 내 서블릿 클래스의 정적 변수입니다.)

<% 
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 페이지에 표시 할 수 있습니다. 그리고 나는 그것에 대한 방법을 알아낼 수 없습니다. 당신의 JSP 페이지에

+0

서블릿 클래스의'static' 변수는 ** bad **입니다! 다음은 JSP에서 sriptlets를 사용하지 않는 것입니다! 질문, 왜'RequestDispatcher' 대신에'redirect()'를 사용합니까? – NINCOMPOOP

+0

@TheNewIdiot 더 나쁜 점 : OP는 데이터베이스 연결 풀을 사용하는 대신 수동으로 데이터베이스 연결을 만들고이 응용 프로그램의 모델과 컨트롤러간에 차이가 없으며 유지 관리 목적으로 계층화 된 응용 프로그램을 개발하는 데 대한 지식이 부족함을 보여줍니다. –

답변

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(); 
    } 

는 :

<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- 당신이 나에게 준 정보에 대한 고맙습니다. 나는 그것을 몰랐습니다. 하지만 서블릿에서 정적 변수를 사용할 때의 단점은 무엇인지, 그리고 JSP 페이지에서 스크립틀릿을 사용하면 안되는 이유는 무엇입니까? – plutonium1991

+0

@ plutonium1991 이는 요청 범위 속성입니다. Servelt 하나는 스레드로부터 안전하지 않을 수 있습니다. 범위 및 Servlet 스레드 안전 속성을 확인하십시오. 또한 응답을 받아들이는 것을 잊지 마라. – Elbek

0

당신은 당신의 t-sqlReturn SCOPE_IDENTITY()를 사용하여 생각 해 봤나?

int i은 계좌 번호를 반환합니다. 그렇게하면 데이터베이스의 최상위 항목에 대해 걱정할 필요가 없습니다. 엄밀히 말하면 당신이 만든 마지막 레코드를 원한다고 말하는 것은 위험합니다. 사용자 A와 사용자 B가 같은 시간에 계정을 만들고 얽힌/교차 된 계정 정보를 얻을 수 있습니다. accountNumber가 "int i"이면 데이터베이스에서이 정보를 다시 가져 오는 데 문제가 없어야합니다.

이 정보가 도움이됩니까?

+0

@ fenix- int 나는 단지 no를 반환합니다. DB에 삽입 된 레코드 수는 아마도 1 일 것입니다. 이것은 계정 번호가 아닙니다. 그리고 단순히 계정을 없애고 데이터베이스에 고정하여 사용자에게 보여 주기만하면됩니다. 은행에서 사용자의 승인을받지 않습니까? 안돼? – plutonium1991

+0

@Luiggi Mendoza- 저는 당신과 같은 전문가가 아닌 자바 기술을 배우는 학생입니다. 그리고이 프로젝트는 여름 훈련의 일부입니다. – plutonium1991

관련 문제