我正在开发一个网上银行应用程序,这是我陷入困境的一部分。
- >用户会在HTML页面上显示一个表单,以输入其详细信息,以创建帐户。
- >然后将详细信息输入MySQL数据库,并将用户重定向到JSP页面,在该页面中应显示他的帐号(使用MySQL自动增量功能自动生成)和秘密4位数pin(为每个用户随机生成,而不是自动递增)。
来自我的servlet的doPost()方法的代码在DB中插入值并重定向到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代码。和用户的针脚 - (last_acc_no和last_pin是我的Servlet类中的静态变量,我创建它是为了保存最后插入的帐号no和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和pin,以便我可以在JSP页面上显示它。我无法找到一种方法。
答案 0 :(得分: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>
答案 1 :(得分:0)
您是否考虑在Return SCOPE_IDENTITY()
中使用t-sql
?
int i
是否会返回帐号 - 应该是。这样您就不必担心它是数据库中最顶层的条目。严格说你只想要创建的最后一条记录是危险的。用户A和用户B可以在同一时间创建帐户并获得纠结/交叉的帐户信息。一旦你拥有了“int i”的accountNumber,你就不会有从数据库中重新获取这些信息的问题吗?
这有帮助吗?