プログラミング中、あった問題 11
・変数名error_statusがerror_message01に変更しました。
以前
String error_status = (String) request.getAttribute("error_status");
String error_message = (String) request.getAttribute("error_message");
現在
String error_message01 = (String) request.getAttribute("error_message01");
String error_message02 = (String) request.getAttribute("error_message02");
・バグ:記号アカウントのTodo一覧画面のディスプレイ機能は失効しました。
問題点:値を渡す方法は問題があります。
推測原因:Encodeの機能は不完全です。
原因:SQLの値が変わりました。。
解決方法:不要なコードを削除しました。
id = id.replaceAll("(?i)(')", "''");
・バグ:編集機能と削除機能が失効しまいました。
問題点:Encodeは不完全です。
解決方法:デバッグで一つ一つを修正しました。
悪い点:コードは読みづらいです。
以前のEncodeメソッドを削除しました。
public Boolean Encode(){
id = id.replaceAll("(?i)(&)", "&");
id = id.replaceAll("(?i)(')", "'");
id = id.replaceAll("(?i)(\")", """);
id = id.replaceAll("(?i)(<)", "<");
id = id.replaceAll("(?i)(>)", ">");
password = password.replaceAll("(?i)(&)", "&");
password = password.replaceAll("(?i)(')", "'");
password = password.replaceAll("(?i)(\")", """);
password = password.replaceAll("(?i)(<)", "<");
password = password.replaceAll("(?i)(>)", ">");
return true;
}
ModeServletにModeによって指定のメソッドを実行します。
if (result == true && mode.equals("user_verification")
||result == true && mode.equals("add_Todo_database")
||result == true && mode.equals("delete_Todo_database")){
userid = userid.replaceAll("(?i)(&)", "&");
userid = userid.replaceAll("(?i)(')", "'");
userid = userid.replaceAll("(?i)(\")", """);
userid = userid.replaceAll("(?i)(<)", "<");
userid = userid.replaceAll("(?i)(>)", ">");
userpassword = userpassword.replaceAll("(?i)(&)", "&");
userpassword = userpassword.replaceAll("(?i)(')", "'");
userpassword = userpassword.replaceAll("(?i)(\")", """);
userpassword = userpassword.replaceAll("(?i)(<)", "<");
userpassword = userpassword.replaceAll("(?i)(>)", ">");
if(mode.equals("user_verification")) {
request.setAttribute("id", userid);
request.setAttribute("password", userpassword);
user.print_todo(request, response);
}
if(mode.equals("add_Todo_database")) {
request.setAttribute("id", userid);
request.setAttribute("password", userpassword);
todo.print_todo(request, response);
}
if(mode.equals("delete_Todo_database")) {
request.setAttribute("id", userid);
request.setAttribute("password", userpassword);
todo.todo_delete_back(request, response);
}
}
else if(result == true && mode.equals("edit_Todo_database")){
request.setAttribute("id", userid);
request.setAttribute("password", userpassword);
todo.todo_edit_back(request, response);
}
・バグに対応して、コードを修正しました。
public Boolean print_todo(HttpServletRequest request, HttpServletResponse response) {
try {
ResultSet rset = null;
conn = ds.getConnection();
StringBuffer sql = new StringBuffer();
//赤いところは各機能のバグによって修正した部分です。
id = id.replaceAll("(?i)(&)", "&");
id = id.replaceAll("(?i)(')", "'");
id = id.replaceAll("(?i)(")", "\"");
id = id.replaceAll("(?i)(<)", "<");
id = id.replaceAll("(?i)(>)", ">");
password = password.replaceAll("(?i)(&)", "&");
password = password.replaceAll("(?i)(')", "'");
password = password.replaceAll("(?i)(")", "\"");
password = password.replaceAll("(?i)(<)", "<");
password = password.replaceAll("(?i)(>)", ">");
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) {
}
}
}
・Todo.jspにキャンセルボタンが失効しました。
問題点:値を二回でエンコードしました。
解決方法:もう一度文字列を置換して、正常な値を戻します。
<%
userid = userid.replaceAll("(?i)(&)", "&");
userpassword = userpassword.replaceAll("(?i)(&)", "&");
%>
・日時機能をServletに遷移する方法がわかりません。
member.jspにResultSetで定義した値をもらって、JSPに値をStringで変換して、結果が表示されます。
私ができると思う方法はResultSetで定義した値を変わります。しかし、この方法で実行すると、DataBaseの値も変わります。
・ArrayでResultSetの型から値を変換します。
実行方法:日時機能がBeansに遷移しました。そして、arrayで値をもらって、member.jspに渡します。
問題点:arrayの長さは定義しなければなりません。しかし、whileでDataBaseからもらって、いくつの資料がわかりません。ループが終わった前に、長さがわかることができません。もし、arrayの中にnullがあるなら、ページが真白になってしまいました。
//赤いところは問題点
String array_todo_text = new String[2];
String array_upload_date = new String[2];
String array_todo_id = new String[2];
int counter = 0;
while (rset.next()) {
String todo_text = rset.getString("todo_text");
todo_text = todo_text.replaceAll("(?i)(&)", "&");
todo_text = todo_text.replaceAll("(?i)(')", "'");
todo_text = todo_text.replaceAll("(?i)(\")", """);
todo_text = todo_text.replaceAll("(?i)(<)", "<");
todo_text = todo_text.replaceAll("(?i)(>)", ">");
array_todo_text[counter]=todo_text;
String upload_date = rset.getString("upload_date");
upload_date = upload_date.replaceFirst("(?i)(-)", "年");
upload_date = upload_date.replaceFirst("(?i)(-)", "月");
upload_date = upload_date.replaceFirst("(?i)( )", "日");
upload_date = upload_date.substring(0,16);
int YEAR = Integer.parseInt(upload_date.substring(0,4));
int MONTH = Integer.parseInt(upload_date.substring(5,7));
int DATE = Integer.parseInt(upload_date.substring(8,10));
MONTH = MONTH-1;
DATE = DATE-1;
String week = new String[7];
week[0] = "日";
week[1] = "月";
week[2] = "火";
week[3] = "水";
week[4] = "木";
week[5] = "金";
week[6] = "土";
Calendar YEAR_MONTH_DATE = Calendar.getInstance();
YEAR_MONTH_DATE.set( Calendar.YEAR,YEAR );
YEAR_MONTH_DATE.set( Calendar.MONTH,MONTH );
YEAR_MONTH_DATE.set( Calendar.DAY_OF_MONTH,DATE );
int DAY_OF_WEEK = YEAR_MONTH_DATE.get( Calendar.DAY_OF_WEEK );
upload_date = upload_date.substring(5,11) + "(" + week[DAY_OF_WEEK]+ ")" + upload_date.substring(11,16);
array_upload_date[counter]=upload_date;
array_todo_id[counter]=rset.getString("todo_id");
counter++;
}
・Arraylistの使用
上記問題の解決方法:Arraylistで値をもらって、最後にarrayに渡します。
List<String>list_todo_text = new ArrayList<>();
List<String>list_upload_date = new ArrayList<>();
List<String>list_todo_id = new ArrayList<>();
while (rset.next()) {
String todo_text = rset.getString("todo_text");
todo_text = todo_text.replaceAll("(?i)(&)", "&");
todo_text = todo_text.replaceAll("(?i)(')", "'");
todo_text = todo_text.replaceAll("(?i)(\")", """);
todo_text = todo_text.replaceAll("(?i)(<)", "<");
todo_text = todo_text.replaceAll("(?i)(>)", ">");
list_todo_text.add(todo_text);
String upload_date = rset.getString("upload_date");
upload_date = upload_date.replaceFirst("(?i)(-)", "年");
upload_date = upload_date.replaceFirst("(?i)(-)", "月");
upload_date = upload_date.replaceFirst("(?i)( )", "日");
upload_date = upload_date.substring(0,16);
int YEAR = Integer.parseInt(upload_date.substring(0,4));
int MONTH = Integer.parseInt(upload_date.substring(5,7));
int DATE = Integer.parseInt(upload_date.substring(8,10));
MONTH = MONTH-1;
DATE = DATE-1;
String week = new String[7];
week[0] = "日";
week[1] = "月";
week[2] = "火";
week[3] = "水";
week[4] = "木";
week[5] = "金";
week[6] = "土";
Calendar YEAR_MONTH_DATE = Calendar.getInstance();
YEAR_MONTH_DATE.set( Calendar.YEAR,YEAR );
YEAR_MONTH_DATE.set( Calendar.MONTH,MONTH );
YEAR_MONTH_DATE.set( Calendar.DAY_OF_MONTH,DATE );
int DAY_OF_WEEK = YEAR_MONTH_DATE.get( Calendar.DAY_OF_WEEK );
upload_date = upload_date.substring(5,11) + "(" + week[DAY_OF_WEEK]+ ")" + upload_date.substring(11,16);
list_upload_date.add(upload_date);
list_todo_id.add(rset.getString("todo_id"));
}
String todo_text=(String)list_todo_text.toArray(new String[0]);
String upload_date=(String)list_upload_date.toArray(new String[0]);
String todo_id=(String)list_todo_id.toArray(new String[0]);
最後のArrayListがArrayに変換する理由はJSPに定義した型がわからないので、Arrayに変換しました。
String todo_text = (String) request.getAttribute("todo_text");
String upload_date = (String) request.getAttribute("upload_date");
String todo_id = (String[]) request.getAttribute("todo_id");