基本上,a具有一个注册接口,该接口应清空字段和某些条件,并且如果数据库中存在记录,则首先检查文本字段是否为空,如下所示:
private void confirmActionPerformed(java.awt.event.ActionEvent evt) {
// String f= "jdbc:derby://localhost:1527/BStest";
String name=username.getText();
String gender=null;
String passw=String.valueOf(pass.getPassword());
String repassw=String.valueOf(repass.getPassword());
String phone2=phone.getText();
String emaill=email.getText();
boolean checkage=false,checknum=false,checkcap=false,checklaw=false,checkemail=false,checkdomain=false;
boolean checklen=false,checkbfat=false,checkpass=false,checkchar=false,checkgender=false;
boolean checkempty=true;
if(name.isEmpty()){//is text field empty
checkempty=false;
JOptionPane.showMessageDialog(null,"Add a username!");}
if(passw.isEmpty()){//is text field empty
checkempty=false;
JOptionPane.showMessageDialog(null,"Add a Password!");}
if(!repassw.equals(passw)){//confirmed password is the same for password
checkempty=false;
JOptionPane.showMessageDialog(null,"Type password Again!");
}
if(phone2.isEmpty()){//is text field empty
checkempty=false;
JOptionPane.showMessageDialog(null,"Add Phone number !");
}
if(emaill.isEmpty()){//is text field empty
checkempty=false;
JOptionPane.showMessageDialog(null,"Add email please !");
}
if (!m.isSelected()&& !female.isSelected()){//no gender selected
checkempty=false;
JOptionPane.showMessageDialog(null,"Choose a gender !!");}
else if (m.isSelected()&& female.isSelected()){//both selected it shoud be only one
checkempty=false;
JOptionPane.showMessageDialog(null,"Select only One !!");}
if(age.getText().isEmpty()){//is age text field has no input
checkempty=false;
JOptionPane.showMessageDialog(null,"Enter your age !!");}
第二次检查每个文本字段的条件,如下面的注释所示
if (m.isSelected()){// is female or male selected
checkgender=true;
gender="Male";
}
else if (female.isSelected()){
checkgender=true;
gender="Female";
}
int agee =Integer.parseInt(age.getText());
char c,c2=emaill.charAt(0);
String zereofive=phone2.substring(0, 2);//start with 05
String bfat = emaill.substring(0,emaill .indexOf("@"));//digits berfore @
String domain = emaill.substring(emaill .indexOf("@") + 1);//check domain
if(Character.isLetter(c2))//is first char off email iis letter
checkchar=true;
else
JOptionPane.showMessageDialog(null,"Emails only start with letters");
if (phone2.length()==10 && zereofive.equals("05"))//check length of phone number
checklen=true;
else
JOptionPane.showMessageDialog(null,"enter 10 digits for the phone number and starts with 05");
if(bfat.length()>=6 || bfat.length()<=15){//check digits before @
checkemail=true;
}
if(domain.equals("gmail.com") || domain.equals("hotmail.com")){//check domain of email
checkdomain=true;
}
else
JOptionPane.showMessageDialog(null,"Email domain is wrong");
if(agee>=18)//only can register in 18 or above
checkage=true;
else
JOptionPane.showMessageDialog(null,"You can't register because you are under 18. ");
if(passw.length()>7){// password at least 8 digit at least one captial and one small letter
checklen=true;
for (int i=0;i<passw.length();i++){
c=passw.charAt(i);
if(Character.isDigit(c))
checknum=true;
else if (Character.isUpperCase(c))
checkcap=true;
else if (Character.isLowerCase(c))
checklaw=true;
if(checknum && checkcap && checklaw )
checkpass=true;
}}
if(checkpass)//check of all 3 crietria of pass word is coorrect
checkpass=true;
else
JOptionPane.showMessageDialog(null,"password must be at least 8 digits \n at least 1 Upper Case letter \n at least 1 Lower Case letter \n at least 1 number \n");
最后,如果符合条件并且不存在记录,则最后存储在数据库中
PreparedStatement reg,exist;
String query="INSERT INTO customer (Cu_name, Cu_password, Cu_age, Cu_gender, Cu_email, Cu_phone) VALUES (?, ?, ?, ?, ?, ?)";//enter user info in database
String record_exists="SELECT * FROM customer where Cu_name=? and Cu_password= ? and Cu_age=? and Cu_gender=? and Cu_email=? and Cu_phone=?";
try{
String f= "jdbc:derby://localhost:1527/BStest";
Connection connection = DriverManager.getConnection(
f, "meme", "Moudhi102");
reg=connection.prepareStatement(query);
exist=connection.prepareStatement(record_exists);
reg.setString(1, name);
reg.setString(2, passw);
reg.setInt(3, agee);
reg.setString(4, gender);
reg.setString(5, emaill);
reg.setString(6, phone2);
exist.setString(1, name);
exist.setString(2, passw);
exist.setInt(3, agee);
exist.setString(4, gender);
exist.setString(5, emaill);
exist.setString(6, phone2);
rs=exist.executeQuery();
if(rs==null){
if(checkpass &&checkage && !checkdomain && !checkemail && !checklen && checkchar && !checkgender && checkempty ){//if all criteria justified then add it to database
reg.executeUpdate();
JOptionPane.showMessageDialog(null,"Complete! new user added !! ");
}
}else//else it can't be added
{
JOptionPane.showMessageDialog(null, "Record already exists");
}
}
catch(SQLException ex){
JOptionPane.showMessageDialog(null,ex);
}
问题是,如果数据库中已经存在记录,并且如果我输入了年龄+电话+电子邮件中的空文本,则不会显示消息,它会显示消息为空,但在NetBeans本身中会显示错误消息输出区域如下
java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:592)
at java.lang.Integer.parseInt(Integer.java:615)
at event_system.Sign_up.confirmActionPerformed(Sign_up.java:275)
at event_system.Sign_up.access$000(Sign_up.java:20)
at event_system.Sign_up$1.actionPerformed(Sign_up.java:70)
at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:2022)
at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2348)
at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:402)
at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:259)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:252)
at java.awt.Component.processMouseEvent(Component.java:6533)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3324)
at java.awt.Component.processEvent(Component.java:6298)
at java.awt.Container.processEvent(Container.java:2236)
at java.awt.Component.dispatchEventImpl(Component.java:4889)
at java.awt.Container.dispatchEventImpl(Container.java:2294)
,并且不执行这三个字段的编码部分,并且如果不符合条件并且其他字段输入正常,则即使显示密码也显示其消息,这表明存在连续的记录消息,并且无法注册检查/填写您信息。请帮助我,我被卡住了,无法弄清
答案 0 :(得分:0)
请先处理您的异常,然后再考虑处理其他问题,因为这将阻止从异常的角度运行代码的其他部分,因此是此时所有问题的根本原因。
您不能将Null字符串(“”)传递给Integer#parseInt()方法:
int agee = Integer.parseInt(age.getText());
如果要包含年龄的文本字段为空,则JTextField#getText()方法将返回Null字符串(“”)。如果您将其提供给Integer#parseInt()方法(如上面的代码中所述)或 以外的任何其他值,则{{3} }生成。您需要注意这种可能的情况,并且可能只需要使用NumberFormatException(也称为条件运算符)即可。
int agee = age.getText().trim().equals("") ? 0 : Integer.parseInt(age.getText().trim());
但是,这没有涵盖在“年龄”文本字段中可能意外提供字母字符的事实。要解决该问题,最好做以下事情:
String theAge = age.trim().getText();
int agee = 0;
// Regular Expression used to ensure a Integer
// Numerical String value was supplied.
if (theAge.matches("\\d+")) {
agee = Integer.parseInt(theAge);
}
在上面的代码行中,如果Age文本字段不包含任何内容或空格,则为 agee 变量提供一个整数0值,否则 Integer.parseInt( ) 方法与“文本字段”的内容一起使用,以填充 age 变量。
附带说明:
对于每个文本字段,您都使用大量布尔标志,以确保有效性和其他目的。据我所知,您实际上不需要任何一个,因为您正在检查所有字段,并且您的要求是实际上填写所有这些字段:
boolean checkage=false, checknum=false, checkcap=false, checklaw=false,
checkemail=false,checkdomain=false;
boolean checklen=false, checkbfat=false, checkpass=false, checkchar=false,
checkgender=false;
boolean checkempty=true;
我会摆脱所有这些,并且根本不使用标志。如果在代码中的任何时候,您的任何文本字段在 confirmActionPerformed()事件中均不满足有效性,则不应从数据库读取任何内容或将其写入数据库。由于检查了这些字段的有效性,并且其中任何一个都失败了,您只需要通过消息框显示事实,然后当用户选择“确定”按钮时,我们将焦点放在当前正在检查的文本字段(age.requestFocus();
)上,然后退出带有return;
语句的事件。除非您所有的文本字段均通过有效性,否则永远无法访问数据库代码。您的事件代码可能如下所示:
private void confirmActionPerformed(java.awt.event.ActionEvent evt) {
// String f= "jdbc:derby://localhost:1527/BStest";
String name = username.getText().trim();
String gender = null;
String passw = String.valueOf(pass.getPassword());
String repassw = String.valueOf(repass.getPassword());
String phone2 = phone.getText().trim();
String emaill = email.getText().trim();
// NAME
//is Name text field empty
if (name.isEmpty()) {
JOptionPane.showMessageDialog(null, "Add a username!");
username.requestFocus();
return;
}
// PASSWORD
//is Password field empty
if (passw.isEmpty()) {
JOptionPane.showMessageDialog(null, "Add a Password!");
pass.requestFocus();
return;
}
/* A Regular Expression is used here to ensure your desired
password rules apply - Minimum of 8 characters in length,
at least 1 Uppercase Letter, at least 1 Lowercase letter,
at least 1 digit. */
if (!passw.matches("^(?=.*[a-z])(?=.*[A-Z])(?=.*\\d)[a-zA-Z\\d]{8,}$")) {
JOptionPane.showMessageDialog(null, "Password must be:\n\n"
+ "- At least 8 characters in length,\n"
+ "- Contain at least 1 Uppercase letter,\n"
+ "- Contain at least 1 Lowercase letter,\n"
+ "- Contain at least 1 number.");
pass.requestFocus();
return;
}
// confirmed password is the same for password
if (!repassw.equals(passw)) {
JOptionPane.showMessageDialog(null, "Type password Again!");
repass.requestFocus();
return;
}
// PHONE
//is phone text field empty
if (phone2.isEmpty()) {//is text field empty
JOptionPane.showMessageDialog(null, "Add Phone number !");
phone.requestFocus();
return;
}
// starts with 05
String zereofive = phone2.substring(0, 2);
// check length of phone number
if (phone2.length() != 10 && !zereofive.equals("05")) {
JOptionPane.showMessageDialog(null, "enter 10 digits for the phone number and starts with 05");
phone.requestFocus();
return;
}
// E-MAIL
//is E-Mail text field empty
if (emaill.isEmpty()) {
JOptionPane.showMessageDialog(null, "Add email please !");
email.requestFocus();
return;
}
// E-Mail
char c, c2 = emaill.charAt(0);
String bfat = emaill.substring(0, emaill.indexOf("@"));//digits berfore @
String domain = emaill.substring(emaill.indexOf("@") + 1);//check domain
// is first char off email a letter
if (!Character.isLetter(c2)) {
JOptionPane.showMessageDialog(null, "Emails can only start with letters!");
email.requestFocus();
return;
}
//check digits before @
if (bfat.length() < 6 || bfat.length() > 15) {
JOptionPane.showMessageDialog(null, "Invalid digits in Email address!");
email.requestFocus();
return;
}
//check domain of email
if (!domain.equals("gmail.com") && !domain.equals("hotmail.com")) {
JOptionPane.showMessageDialog(null, "Email domain is wrong!");
email.requestFocus();
return;
}
// GENDER
//no gender selected
if (!m.isSelected() && !female.isSelected()) {
JOptionPane.showMessageDialog(null, "Choose a Gender!!");
return;
}
//both Genders are selected where it shoud be only one
else if (m.isSelected() && female.isSelected()) {
JOptionPane.showMessageDialog(null, "Select only One Gender!!");
return;
}
// is female or male selected
if (m.isSelected()) {
gender = "Male";
}
else if (female.isSelected()) {
gender = "Female";
}
// AGE
//is Age text field empty
String theAge = age.trim().getText();
if (theAge.isEmpty()) {
JOptionPane.showMessageDialog(null, "Enter your age !!");
age.requestFocus();
return;
}
int agee = 0; // Default
// Regular Expression used to ensure a Integer
// Numerical String value was supplied.
if (theAge.matches("\\d+")) {
agee = Integer.parseInt(theAge);
}
// only 18 + can register
if (agee < 18) {
JOptionPane.showMessageDialog(null, "You can't register because you are under 18!");
age.requestFocus();
return;
}
// DATABASE
Connection connection = null;
PreparedStatement reg, exist;
ResultSet rs = null;
String query = "INSERT INTO customer (Cu_name, Cu_password, Cu_age, Cu_gender, Cu_email, Cu_phone) VALUES (?, ?, ?, ?, ?, ?)";//enter user info in database
String record_exists = "SELECT * FROM customer where Cu_name=? and Cu_password= ? and Cu_age=? and Cu_gender=? and Cu_email=? and Cu_phone=?";
try {
String f = "jdbc:derby://localhost:1527/BStest";
connection = DriverManager.getConnection(f, "meme", "Moudhi102");
reg = connection.prepareStatement(query);
exist = connection.prepareStatement(record_exists);
reg.setString(1, name);
reg.setString(2, passw);
reg.setInt(3, agee);
reg.setString(4, gender);
reg.setString(5, emaill);
reg.setString(6, phone2);
exist.setString(1, name);
exist.setString(2, passw);
exist.setInt(3, agee);
exist.setString(4, gender);
exist.setString(5, emaill);
exist.setString(6, phone2);
rs = exist.executeQuery();
if (rs == null) {
reg.executeUpdate();
JOptionPane.showMessageDialog(null, "Complete! new user added !! ");
}
// User Already Exists In Database
else {
JOptionPane.showMessageDialog(null, "User already exists");
}
}
catch (SQLException ex) {
JOptionPane.showMessageDialog(null, ex);
}
finally {
if (reg != null) {
reg.close();
}
if (rs != null) {
rs.close();
}
if (connection != null) {
connection.close();
}
}
}
在查询数据库记录中特定用户的重复记录时,年龄不一定是在查询WHERE子句中使用的一个很好的条件。它仅强制每个记录仅在一年内有效的事实。事物会发生变化,年龄,电子邮件,电话号码等都是可以经常变化的事物。如果仅使用名称和密码来确保访问有效性(在大多数情况下就足够了),而其余标准仅用于指示需要对用户数据帐户进行更新,则该概念显然没有错。
您应该考虑对“提供的密码”进行散列,这是存储在数据库中的散列。当用户提供密码时,该密码将被散列并与已经存储在数据库中的散列进行比较。包括您自己在内的任何人都不应该知道密码的真实含义。只有用户应该知道密码可能是什么。 Ternary Operator为此很好。要使用此库对密码进行哈希处理:
进口:
import org.mindrot.jbcrypt.BCrypt;
import static org.mindrot.jbcrypt.BCrypt.hashpw;
类成员变量:
// Define the BCrypt WORKLOAD to use when generating
// password hashes. 10-31 is a valid value.
private static final int WORKLOAD = 12;
要散列明文密码以便存储在数据库中:
/**
* This method can be used to generate a string representing an account
* password suitable for storing in a database. It will be an OpenBSD-style
* crypt(3) formatted hash string of length=60 The BCrypt WORKLOAD is
* specified in the above static variable, a value from 10 to 31. A WORKLOAD
* of 12 is a very reasonably safe default. This automatically handles
* secure 128-bit salt generation and storage within the hash.
*
* @param password_plaintext The account's plaintext password as provided
* during account creation, or when changing an
* account's password.
*
* @return String - a string of length 60 that is the bcrypt hashed password
* in crypt(3) format.
*/
public static String hashPassword(String password_plaintext) {
String salt = BCrypt.gensalt(WORKLOAD);
String hashedPassword = hashpw(password_plaintext, salt);
return hashedPassword;
}
要使用数据库中存储的哈希值检查纯文本密码,请执行以下操作:
/**
* This method can be used to verify a computed hash from a plaintext (e.g.
* during a login request) with that of a stored hash from a database. The
* password hash from the database must be passed as the second argument.
*
* @param passwordAsPlainText The accounts plaintext password, as provided
* during a login request
*
* @param storedEncryption The accounts stored password hash, retrieved
* from the authorization database
*
* @return boolean - true if the password matches the password of the stored
* hash, false otherwise
*/
/*
public static boolean checkPassword(String passwordAsPlainText, String storedEncryption) {
boolean passwordVerification;
if (null == storedEncryption || !storedEncryption.startsWith("$2a$")) {
throw new java.lang.IllegalArgumentException(
"Invalid encryption provided for comparison");
}
passwordVerification = checkpw(passwordAsPlainText, storedEncryption);
return passwordVerification;
}