プログラミング中、あった問題 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)(<)", "&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;
}


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)(&)", "&amp;");
    userid = userid.replaceAll("(?i)(')", "&#039;");
    userid = userid.replaceAll("(?i)(\")", "&quot;");
    userid = userid.replaceAll("(?i)(<)", "&lt;");
    userid = userid.replaceAll("(?i)(>)", "&gt;");
    userpassword = userpassword.replaceAll("(?i)(&)", "&amp;");
    userpassword = userpassword.replaceAll("(?i)(')", "&#039;");
    userpassword = userpassword.replaceAll("(?i)(\")", "&quot;");
    userpassword = userpassword.replaceAll("(?i)(<)", "&lt;");
    userpassword = userpassword.replaceAll("(?i)(>)", "&gt;");

    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)(&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;)", ">");

            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)(&amp;)", "&");
    userpassword = userpassword.replaceAll("(?i)(&amp;)", "&");
%>

・日時機能を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)(&)", "&amp;");
todo_text = todo_text.replaceAll("(?i)(')", "&#039;");
todo_text = todo_text.replaceAll("(?i)(\")", "&quot;");
todo_text = todo_text.replaceAll("(?i)(<)", "&lt;");
todo_text = todo_text.replaceAll("(?i)(>)", "&gt;");

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)(&)", "&amp;");
    todo_text = todo_text.replaceAll("(?i)(')", "&#039;");
    todo_text = todo_text.replaceAll("(?i)(\")", "&quot;");
    todo_text = todo_text.replaceAll("(?i)(<)", "&lt;");
    todo_text = todo_text.replaceAll("(?i)(>)", "&gt;");
   
    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");