プログラミング中、あった問題 10

・変数statusの使用
変数statusがerror_statusに変わりました。
変数messageがerror_messageに変わりました。
新しい変数resultを追加しました。

if (result == true && mode.equals("user_verification")
|| result == true && mode.equals("delete_Todo_database")
|| result == true && mode.equals("add_Todo_database")
|| result == true && mode.equals("edit_Todo_database"))


・if...else if...else...確実にelseで終了
以前:全部のelse ifをifに変わりました。
現在:elseで終了しました。

if (userid.equals("") && userpassword.equals("")) {
error_status = "ログイン失敗しました。";
error_message = "USERNAMEとPASSWORDを入力してください。";
}
else if (userid.equals("")) {
error_status = "ログイン失敗しました。";
error_message = "USERNAMEを入力してください。";
}
else if (userpassword.equals("")) {
error_status = "ログイン失敗しました。";
error_message = "PASSWORDを入力してください。";
}else {
String value = shain.verificationData();
if (value.equals("false")) {
error_status = "ログイン失敗しました。";
error_message = "USERNAMEもしくはPASSWORDは正しくありません。";
}
else if (value.equals("disconnect")) {
error_status = "DataBase接続できません。";
error_message = "管理者に連絡してください。";
}
else {
result = true;
}
}


・Encodeの部分UserBeansに移動します。
public String getPassword() {
password = password.replaceAll("(?i)(&)", "&");
password = password.replaceAll("(?i)(')", "'");
password = password.replaceAll("(?i)(\")", """);
password = password.replaceAll("(?i)(<)", "&lt;");
password = password.replaceAll("(?i)(>)", "&gt;");
return password;
}
public String getId() {
id = id.replaceAll("(?i)(&)", "&amp;");
id = id.replaceAll("(?i)(')", "&#039;");
id = id.replaceAll("(?i)(\")", "&quot;");
id = id.replaceAll("(?i)(<)", "&lt;");
id = id.replaceAll("(?i)(>)", "&gt;");
return id;
}


・userとtodoのServletが分別しました。
実行方法:Todoの機能をTodoBeansに遷移しました。ModeServletにTodoと関連した変数を変わりました。

 

・一覧画面のディスプレイ機能がDataBaseのServletに移動します。
実行方法:UserBeansにprint_todoメソッドを追加しました。

public Boolean print_todo(HttpServletRequest request, HttpServletResponse response) {
try {
ResultSet rset = null;
conn = ds.getConnection();
StringBuffer sql = new StringBuffer();

id = id.replaceAll("(?i)(')", "''");

sql.append("SELECT `todo_id`,`todo_text`,`finished`,`upload_date` FROM `todo` WHERE user_id = '" + id + "'");

System.out.println(sql);

pstmt = conn.prepareStatement(new String(sql));

pstmt.execute();

rset = pstmt.executeQuery();

request.setAttribute("print", rset);

request.getRequestDispatcher("/member.jsp").forward(request, response);

rset.close();
pstmt.close();
conn.close();
return true;

} catch (Exception e) {
e.printStackTrace();
return false;
} finally {
try {
conn.close();
} catch (Exception e) {
}
}
}

バグ:追加や削除や編集をしたら、真白のページに遷移してしまいました。
問題点:JSPからModeServletに値を渡します。そして、ModeServletからBeansに値を渡します。UserBeansを実行したことがないので、値がありません。ですから、TodoBeansもprint_todoメソッドを追加しなければなりません。

解決方法:UserBeansとTodoBeansがprint_todoメソッドを追加しました。


if (result == true && mode.equals("user_verification"))
{
request.setAttribute("id", userid);
request.setAttribute("password", userpassword);
user.print_todo(request, response);
}
else if(result == true && mode.equals("delete_Todo_database")
|| result == true && mode.equals("add_Todo_database")
|| result == true && mode.equals("edit_Todo_database")) {
request.setAttribute("id", userid);
request.setAttribute("password", userpassword);
todo.print_todo(request, response);
}


・for(string todo:todo_array)メソッドを使用しました。
for (String todo_array : todo) {
String todo_str = todo_array.replaceAll("(?i)(')", "''");
String sql = "DELETE FROM `company_db`.`todo` WHERE `todo_id`='" + todo_str + "'";
doDataBase(sql);

}

 

トランザクションの勉強、DataBaseで複数指令が確実に実行するためです。
try {
Class.forName("com.mysql.jdbc.Driver");
conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/company_db?serverTimezone=UTC&useSSL=false",
"suser", "spass");

conn.setAutoCommit(false);
Statement statement=conn.createStatement();

//Encode
id = id.replaceAll("(?i)(')", "''");

String sql1 = "delete from user where user_id=('" + id + "')";
String sql2 = "delete from todo where user_id=('" + id + "')";
statement.executeUpdate(sql1);
statement.executeUpdate(sql2);

conn.commit();
return true;

} catch (Exception e) {
e.printStackTrace();
return false;

}

問題:どうやって確認しますか?
以前の方法は一つ一つを実行するので、デバッグで止めて、一つ一つを実行しながら、DataBaseにデータを確認します。観察した結果は最初の指令を実行したら、DataBaseのデータが削除されました。現在の方法なら、全部の指令を終わる前に、DataBaseのデータが削除されません。

 

・member.jspのEncode
BeansにEncodeメソッドを追加しました。
public Boolean Encode(){
id = id.replaceAll("(?i)(&)", "&amp;");
id = id.replaceAll("(?i)(')", "&#039;");
id = id.replaceAll("(?i)(\")", "&quot;");
id = id.replaceAll("(?i)(<)", "&lt;");
id = id.replaceAll("(?i)(>)", "&gt;");
password = password.replaceAll("(?i)(&)", "&amp;");
password = password.replaceAll("(?i)(')", "&#039;");
password = password.replaceAll("(?i)(\")", "&quot;");
password = password.replaceAll("(?i)(<)", "&lt;");
password = password.replaceAll("(?i)(>)", "&gt;");
return true;
}