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

現在の型:2019-05-09 00:00:00
想定の型:2019年05月09日(木)00:00

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)(<)", "&lt;");
todo_text = todo_text.replaceAll("(?i)(>)", "&gt;");

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);

 

今までのコードの改善方向


1.Encodeの部分がServletに移動します。

2.トランザクションの勉強、DataBaseで複数指令が確実に実行するためです。

3.caseの変数名をわかりやすくします。(Refactor)

4.DataBaseの接続確認機能を削除します。

5.無駄なサービスを削除します。(default value)

6.if...else if...else...確実にelseで終了します。

7.statusがbooleanで定義します。もしくは変数名をかわります。

8.一覧画面のディスプレイ機能がDataBaseのServletに移動します。

9.dogetとdopostの役割を理解します。

10.userとtodoのServletが分別します。

11.Encodeの機能がまとめてします。

12.for(string todo:todo_array)メソッドを使用します。

13.JSPServletの名前を変更します。

 


Servlet名を変更しました。


info.searchman.lesson.java_mysql.EditServlet -> user_todo.ModeServlet
info.searchman.lesson.java_mysql.EditServlet -> user_todo.UserBeans

(web.xml
<?xml version="1.0" encoding="ISO-8859-1"?>

<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
"http://java.sun.com/dtd/web-app_2_3.dtd">

<web-app>
<servlet>
<servlet-name>ModeServlet</servlet-name>
<servlet-class>user_todo.ModeServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ModeServlet</servlet-name>
<url-pattern>/Mode</url-pattern>
</servlet-mapping>
</web-app>


JSPのurl-pattern修正
<form action="Edit" method="POST"> -> <form action="Mode" method="POST">

JSP名を変更しました。
add_list.jsp -> add_Todo.jsp
delete_ID.jsp -> delete_User.jsp
delete_list.jsp -> delete_Todo.jsp
edit_list.jsp -> edit_Todo.jsp


・caseの変数名を変わりました。
case "add_User"
case "delete_User"
case "delete_User_confirm"
case "change_password"
ase "change_password_save"
case "user_verification"
case "add_Todo"
case "add_Todo_database"
case "delete_Todo"
case "delete_Todo_database"
case "edit_Todo"
case "edit_Todo_database"
case "logout"


・DataBaseの接続確認機能を削除しました。

・新しいエラーメッセージを作成しました。(DataBase接続できません。)
(ModeServlet)
if (value.equals("disconnect")) {
status = "DataBase接続できません。";
message = "管理者に連絡してください。";
}

(UserBeans)
catch (SQLException sQLException) {
sQLException.printStackTrace();
var = "disconnect";
return var;
}


・アカウントを作成すると、default valueを追加する機能を削除しました。
String sql2 = "INSERT INTO `company_db`.`todo` (`user_id`, `todo_text`, `finished`, `created_date`, `upload_date`) VALUES ('"
+ id + "', '買い物する', '1', '" + time + "', '" + time + "')";


・全ての変数pwをpasswordに変更しました。


・dogetとdopost
GETの場合、URL内部にパラメータが組み込まれるので、ブラウザの履歴やキャッシュが残ります。
POSTは残らないので、機密性が高いと言えなくもありませんが、結局、パケットは平文で流れるので、機密性について考える場合は、どちらにしても別途、暗号化の仕組みを取り入れる必要があります。

URLを使ったので、dogetの部分は必要です。

protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doPost(request, response);
}


・if...else if...else...確実にelseで終了します。
elseを使う必要性がないので、全部のelse ifをifに変わりました。


・変数statusの使用
if (status.equals("成功しました") && mode.equals("user_verification")
|| status.equals("成功しました") && mode.equals("delete_Todo_database")
|| status.equals("成功しました") && mode.equals("add_Todo_database")
|| status.equals("成功しました") && mode.equals("edit_Todo_database"))

使用しない問題:認証機能が失効します。
booleanで定義する問題:全てのcaseが修正しなければなりません。そして、詳しいエラーメッセージがなくなります。
新しい変数を追加する問題:四つcaseの中に、全てのifがこの変数を使用しなければなりません。

 

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

・!"#$%&'()=~<>+? というIDが登録されること
問題点:記号が影響されました。SQLが実行できません。
解決方法:特殊記号を変わります。

 

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


・アカウント削除 パスワード変更 Todo編集機能 Todo追加機能 Todo削除機能
問題点:HTMLで特殊記号が影響されました。
解決方法:特殊記号を変わります。

    String userid = shain.getId();
    String userpw = shain.getPw();
    userid = userid.replaceAll("(?i)(&)", "&amp;");
    userid = userid.replaceAll("(?i)(')", "&#039;");
    userid = userid.replaceAll("(?i)(\")", "&quot;");
    userpw = userpw.replaceAll("(?i)(&)", "&amp;");
    userpw = userpw.replaceAll("(?i)(')", "&#039;");
    userpw = userpw.replaceAll("(?i)(\")", "&quot;");
    userid = userid.replaceAll("(?i)(<)", "&lt;");
    userid = userid.replaceAll("(?i)(>)", "&gt;");
    userpw = userpw.replaceAll("(?i)(<)", "&lt;");
    userpw = userpw.replaceAll("(?i)(>)", "&gt;");

   
   
・HTMLのディスプレイ
想定結果と違いました。余計な記号を表しました。
正しい:!"#$%&'()=~<>+?
結果:+?"> !"#$%&'()=~<>+?
解決方法:特殊記号を変わります。

     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;");



・記号のアカウントは編集機能が使えません。
問題点:URLで遷移することができませんでした。
解決方法:IDとPASSWORDをエンコードします。

    String userid_utf8 = URLEncoder.encode(userid, "UTF-8");
    String userpw_utf8 = URLEncoder.encode(userpw, "UTF-8");



DataBaseの日時を修正しました。
以前:年月日だけです。
現在:時分秒を追加しました。

    Timestamp timestamp = new Timestamp(System.currentTimeMillis());
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    String time = sdf.format(timestamp);


・日時の追加
実行方法:DataBaseからデータの保存時間をもらいます。

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

・編集機能の更新日時を追加しました。

String sql = "UPDATE `todo` SET `todo_text` ='" + data + "',`upload_date` ='" + time + "' WHERE `todo_id` = '" + todoid + "'";

・改善方向
日時の型が変わります。
現在の型:2019-05-09 00:00:00
想定の型:2019年05月09日(木)00:00

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

 

・削除機能が実行すると、間違えた画面を遷移しました。

問題点:try catchがfalseの値をもらいました。

解決方法:例外処理を追加しました。

Java
public Boolean delete_list(){
        try {
            String todo= todoid.split(",");
            for(int i=1; i<=todo.length; i++)
            {
            String sql = "DELETE FROM `company_db`.`todo` WHERE  `todo_id`='" + todo[i] + "'";
           
            doDataBase(sql);
           
            }
            return true;
        }
        catch (ArrayIndexOutOfBoundsException arrayIndexOutOfBoundsException) {
            arrayIndexOutOfBoundsException.printStackTrace();
            return true;

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


・完了ボタンを追加しました。

問題点:一番目のボタンの機能があるけど、他のボタンがありませんでした。

解決方法:HTMLは目標を明確に認識しなかったので、他のボタンが実行できませんでした。混乱しないために、変数を追加しました。

(HTML)
<%int target = 1; %>
<p id="<%=target%>">
    <input type="checkbox" name="todoid" value="<%=rset.getString(1)%>@&<%=rset.getString(2)%>">
    <%String source = rset.getString(2);%>
    <%String result = URLEncoder.encode(source, "UTF-8");%>
    <a href="Edit?&mode=editlist&todoid=<%=rset.getString(1)%>&data=<%=result%>&id=<%=userid%>&pw=<%=userpw%>">
    <%String sign = rset.getString(2);%>
    <%sign = sign.replaceAll("(?i)(<)", "&lt;");%>
    <%sign = sign.replaceAll("(?i)(>)", "&gt;");%>
    <%=sign%>
</a>
    <input type="button" id="<%=target%>" value="完了" onclick="changeUnderline('<%=target%>');" />
</p>
    <%target=target+1; %>


・(CheckBox)何も選択しない時、失敗画面へ遷移します。

(Java)
case "deletelist":
        request.setAttribute("shain", shain);
        request.setAttribute("id", userid);
        request.setAttribute("pw", userpw);
        request.setAttribute("status", status);   
        String todo = request.getParameterValues("todoid");
        if (todo == null) {
            status = "削除失敗しました。";
            message = "もう一度選択してください。";
        }

        else {
        request.getRequestDispatcher("/delete_list.jsp").forward(request, response);
        }
        break;


・完了ボタンの文字が変更できません。
問題点:HTMLのIDが重複しました。

解決方法:新しい変数を追加しました。

(Javascript)
<script type="text/javascript">
    function changeUnderline(todo_id) {
        var btn_obj = document.getElementById("btn_" + todo_id);
        var text_obj = document.getElementById("text_" + todo_id);

       
        if (text_obj.style.textDecoration == "line-through") {
            text_obj.style.textDecoration = "none";
            btn_obj.value = "完了";
        } else {
            text_obj.style.textDecoration = "line-through";
            btn_obj.value = "未完了";
        }
    }
</script>

(HTML)
<p id="text_<%=rset.getString("todo_id")%>">
        <input type="checkbox" name="todoid"
            value="<%=rset.getString("todo_id")%>@&<%=rset.getString("todo_text")%>">
        <%
            String source = rset.getString("todo_text");
            String result = URLEncoder.encode(source, "UTF-8");
        %>
    <a href="Edit?&mode=editlist&todoid=<%=rset.getString("todo_id")%>&data=<%=result%>&id=<%=userid%>&pw=<%=userpw%>">
        <%
            String sign = rset.getString("todo_text");
            sign = sign.replaceAll("(?i)(<)", "&lt;");
            sign = sign.replaceAll("(?i)(>)", "&gt;");
        %>
        <%=sign%>
        </a> <input type="button" id="btn_<%=rset.getString("todo_id")%>" value="完了"
        onclick="changeUnderline('<%=rset.getString("todo_id")%>');" />
        </p>

・rset.getStringの修正

以前:rset.getString(1)

現在:rset.getString("todo_id")


・変数名を更新
分かりやすくなりました。

・PASSWORD変更と新規登録のPASSWORD確認機能を修正
(Javascript)
<script language='javascript' type='text/javascript'>
            function check(input) {
                if (input.value != document.getElementById('password').value) {
                    input.setCustomValidity('パスワードは正しくありません');
                } else {
                    input.setCustomValidity('');
                }
            }
</script>


プロジェクト構造
index.jsp ログイン画面 (完成)
new_ID.jsp 新規登録画面 (完成)
member.jsp 一覧画面 (完成)
delete_ID.jsp ID削除画面 (完成)
change_password.jsp パスワード変更画面 (完成)
add_list.jsp 追加画面 (完成)
delete_list.jsp 削除画面 (完成)
edit_list.jsp 編集画面 (完成)
result.jsp 結果画面 (完成)

ShainBeans.java メソッドの実行 (完成)
EditServlet.java ボタンで事件を選びます (完成)

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

 

・日本語のエンコード

問題点:編集画面へ遷移する時、todo_textの文字をエンコードして、URLに値を渡します。

実行方法:エンコードします。

(HTML)
<%@page import="java.io.*"%>
<%@page import="java.net.*"%>
<%String source = rset.getString(2);%>   
<%String result = URLEncoder.encode(source,"UTF-8");%>
<a href="Edit?&mode=editlist&deletebox=<%=rset.getString(1)%>&data=<%=result%>&id=<%=userid%>&pw=<%=userpw%>">


・保存機能の文字化け
問題点:日本語を保存する時、文字化けになってしまいました。

解決方法:Windows-31JUTF-8に変更しました。

Java
request.setCharacterEncoding("UTF-8");


・特殊記号のディスプレー
問題点:HTMLに特殊記号を表します。

実行方法:特殊記号を変わりました。

(HTML)
<%String sign = rset.getString(2);%>
<%sign = sign.replaceAll("(?i)(<)", "&lt;");%>
<%sign = sign.replaceAll("(?i)(>)", "&gt;");%>
<%=sign%>

・複数選択の削除できません。

問題点:Servletがページから一つだけ値をもらいます。

解決方向:複数選択する時、どうやって複数の値をもらいます?

実行方法:Servletでrequest.setAttributeの代わりにrequest.getParameterValuesを使いました。選択したtodo_idを配列になりました。


・削除画面のディスプレー

問題点:配列がどうやってSQLに代入します?

解決方法:以前の方法を捨てました(SQLから値をもらて、ページで値を表します)。現在は一覧画面から値をもらって、削除画面を表します。

(HTML)

(member.jsp
<input type="checkbox" name="todoid" value="<%=rset.getString(1)%>&<%=rset.getString(2)%>">

 

(delete_list.jsp
<%String todo = request.getParameterValues("todoid");%>
<%
    for (int i = 0; i < todo.length; i++) {
        %>
            <table border="0">
                <tr>
                    <td>
                    <%String a = todo[i]; %>
                    <%String
b =a.split("&");%>
                    <%String c = b[1]; %>
                    <%=c%>

                    </td>
                </tr>
            </table>
        <%
    }
%>


・複数削除機能

問題点:複数の値をServletに渡して、SQLに指定したtodo_idを削除します。

解決方向:Servletに処理した文字列を渡して、try catchの中にfor loopを追加します。

実行方法:文字列がsplitで指定記号にとして分別しました。

(HTML)
<% } %>
<%String d = "0";%>
<%for (int i = 0; i < todo.length; i++) {%>
<%String a = todo[i];%>
<%String b = a.split("&");%>
<%String c = b[0];%>
<%d = d + "," + c;%>
<% } %>
<input type="hidden" name="todoid" value="<%=d%>">

(JAVA)
public Boolean delete_list(){
    try {
        String todo= todoid.split(",");
        for(int i=1; i<=todo.length; i++)
        {
        String sql = "DELETE FROM `company_db`.`todo` WHERE  `todo_id`='" + todo[i] + "'";
        doDataBase(sql);
        }
        return true;
        } catch (Exception e) {
        e.printStackTrace();
        return false;
        }   
    }



未解決問題
複数削除機能が完成しましたが、間違えた画面を遷移しました。
何も選択しない時、ヒントを表します。
Loopで生成したボタンの機能が正常に実行しますか?
複数以上のボタンは複数ファンクションを作らなければなりませんか?
ログインすると、以前操作した状態を戻ります。



プロジェクト構造
index.jsp ログイン画面 (完成)
new_ID.jsp 新規登録画面 (完成)
member.jsp 一覧画面 (未完成)完了ボタン、打消し線
delete_ID.jsp ID削除画面 (完成)
change_password.jsp パスワード変更画面 (完成)
add_list.jsp 追加画面 (完成)
delete_list.jsp 削除画面 (未完成)間違えた画面
edit_list.jsp 編集画面 (完成)
result.jsp 結果画面 (完成)

ShainBeans.java メソッドの実行 (一部分完成)
EditServlet.java ボタンで事件を選びます (一部分完成)

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

 

 ・編集画面へ遷移するようにしました。

実行方法:一覧画面で生成したデータにリンクを付けながら、値を渡します。

(HTML)
<input type="checkbox" name="deletebox" value="<%=rset.getString(1)%>">
<a href="Edit?&mode=editlist&deletebox=<%=rset.getString(1)%>&data=<%=rset.getString(2)%>&id=<%=userid%>&pw=<%=userpw%>"><%=rset.getString(2)%></a>

・編集機能

実行方法:URLからtodo_idとto_textをもらいます。

(HTML)

(やった方法)
<%
    String a = request.getQueryString();
    a=a.substring(25);
    String b =a.split("&");
    String c = request.getQueryString();
    c=c.substring(33);
    String
d =c.split("&");

%>
<input type="hidden" name="id" value="<%=shain.getId()%>">
<input type="hidden" name="pw" value="<%=shain.getPw()%>">
<input type="hidden" name="deletebox" value="<%=b[0]%>">
<input required type="text" name="data" value="<%=d[0]%>">
<input type="hidden" name="mode" value="editlist_database">

(改善した方法)
<%
    ShainBeans shain = (ShainBeans) request.getAttribute("shain");
    String todo_id = request.getParameter("deletebox");
    String todo_text = request.getParameter("data");

%>
<input type="hidden" name="id" value="<%=shain.getId()%>">
<input type="hidden" name="pw" value="<%=shain.getPw()%>">
<input type="hidden" name="deletebox" value="<%=todo_id%>">
<input required type="text" name="data" value="<%=todo_text%>">
<input type="hidden" name="mode" value="editlist_database">

(Java)
public Boolean edit_list(){
    try {
        String sql = "UPDATE `todo` SET `todo_text` ='" + data + "' WHERE `todo_id` = '" + deletebox + "'";
            doDataBase(sql);
            return true;
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }
}

未解決問題:英数だけ使えます。他の文字を使うなら、エラーになってしまいます。
ブラウザーによって状況も違います。Chromeで実行するのは大丈夫ですけど、文字化けになってしまいました。Eclipseのブラウザーで実行するのはできません。
推測原因:リンクで値を渡す時、英数だけ使えます。
試した方法:URLをエンコードします。保存する時、デコードする必要性があると思います。

方法1:Tomcatの配置を変わりました。(失敗)
(Tomcat)
<Connector port="8080" protocol="HTTP/1.1"  
connectionTimeout="20000"  
redirectPort="8444"  
useBodyEncodingForURI="true" URIEncoding="UTF-8"/> 

方法2:HTMLでエンコードしました。(失敗)
(HTML)
<script type="text/javascript" charset="UTF-8">
                str1 = "<%=rset.getString(1)%>";
                str2 = "<%=rset.getString(2)%>";
                id = "<%=userid%>";
                pw = "<%=userpw%>";
                href = function(){
                location.href = encodeURI("Edit?&mode=editlist&deletebox="+str1+"&data="+str2+"&id="+id+"&pw="+pw);
                }                       
                </script>
                <a href="javascript:href()">
                <%=rset.getString(2)%>
                </a>
               
方法3:Javaでエンコードしました。(失敗)
(Java)
String str = new String(request.getParameter("data").getBytes("iso-8859-1"), "utf-8");

・ボタン事件の練習
実行方法:JSPにJavaScriptで事件を作りました。ボタンを押すと、取り消し線を付けます。もう一度押すと、取り消し線を消します。
<script type="text/javascript">
    function changeUnderline(idname) {
        var obj = document.getElementById(idname);
        if (obj.style.textDecoration == "line-through") {
            obj.style.textDecoration = "none";
            document.getElementById("test").value = "完了";
        } else {
            obj.style.textDecoration = "line-through";
            document.getElementById("test").value = "未完了";
        }
    }
</script>

<p id="target">練習</p>
<input type="button" id="test" value="完了"
onclick="changeUnderline('target');" />

問題点:URLに取り消し線を付けることができますか?(できました)
            while Loopでボタンの生成は正常に実行しますか?(できません)
            複数以上のボタンは複数ファンクションを作らなければなりませんか?(自分の方法はできません。)
            ログインすると、以前操作した状態を戻ります。

       

・複数削除
問題点:while Loopで生成したデータは値を別の方法で次のページに渡します。



プロジェクト構造
index.jsp ログイン画面 (完成)
new_ID.jsp 新規登録画面 (完成)
member.jsp 一覧画面 (未完成)完了ボタン、打消し線
delete_ID.jsp ID削除画面 (完成)
change_password.jsp パスワード変更画面 (完成)
add_list.jsp 追加画面 (完成)
delete_list.jsp 削除画面 (未完成)複数選択の削除できません
edit_list.jsp 編集画面 (未完成)英数だけ使えます。
result.jsp 結果画面 (完成)

ShainBeans.java メソッドの実行 (一部分完成)
EditServlet.java ボタンで事件を選びます (一部分完成)

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

 

・追加画面へ遷移する方法を修正しました。
問題点:追加画面にuser_idの値をもらいません。
解決方法:一覧画面に追加ボタンがリンクではなく、POSTで追加画面へ遷移します。

以前の方法
(HTML)
<input type="button" onclick="location.href='add_list.jsp'" value="追加">

現在の方法
(HTML)
<form action="Edit" method="POST">
    <input type="hidden" name="mode" value="addlist"> <input
    type="hidden" name="id" value="<%=userid%>"> <input
    type="submit" value="追加">
</form>

Java
case "addlist":
    request.setAttribute("shain", shain);
    request.getRequestDispatcher("/add_list.jsp").forward(request, response);
    break;

 

・DBテーブル側で auto_increment を定義しました。
実行方法:HeidiSQLにunique keyにとしてtodo_idを作成しました。そして、Defaultにauto_incrementを追加しました。

 

history.backの問題を修正しました。

問題点:history.back()はブラウザの戻るなので、正しく戻らない場合があります。(パスワード変更画面、ユーザー削除画面、todo追加画面、todo編集画面、todo削除画面)

解決方法:ログイン機能を利用して、全てのキャンセルボタンをPOSTで戻ります。指定画面へ戻る時、必要な属性を追加します。しないと、バッグになる場合があるかもしれません。

(HTML)

<form action="Edit" method="POST">
    <div align="center">
        <input type="hidden" name="id" value="<%=shain.getId()%>"> <input
            type="hidden" name="pw" value="<%=shain.getPw()%>"> <input
            type="hidden" name="mode" value="verification"> <input
            type="submit" value="キャンセル">
    </div>

</form>)

 


・一覧画面にログアウト機能を追加しました。
実行方法:POSTでindex画面へログアウトします。
(HTML)
<form action="Edit" method="POST">
    <input type="hidden" name="mode" value="logout"> <input
    type="submit" value="ログアウト">
</form>

Java
case "logout":
    request.getRequestDispatcher("/index.jsp").forward(request, response);
    break;


・Calendarメソッドの代わりにTimestampメソッドを使。
解決問題:現在の時間から1月を引きます。(以前のバッグ)
Java
import java.sql.Timestamp;
import java.text.SimpleDateFormat;
Timestamp timestamp = new Timestamp(System.currentTimeMillis());
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
String str = sdf.format(timestamp);


・Todo一覧の削除機能を追加しました。

実行方法:一覧画面にデータを現す時、checkboxとtodo_idの値を渡します。そして、チェックしたデータのtodo_idによって削除します。

 

(HTML)member.jsp
<input type="checkbox" name="deletebox" value="<%=rset.getString(1)%>"><%=rset.getString(2)%></td>

(HTML)delete_list.jsp
<input type="hidden" name="deletebox" value="<%=rset.getString(1)%>"><%=rset.getString(2)%>

Java)EditServlet
case "deletelist":
    request.setAttribute("shain", shain);
    request.setAttribute("id", userid);
    request.setAttribute("pw", userpw);
    request.setAttribute("status", status);
    request.setAttribute("deletebox",selection);
        try {
            conn = ds.getConnection();
            StringBuffer sql = new StringBuffer();
            sql.append("SELECT`todo_id`,`todo_text` FROM `todo` WHERE todo_id LIKE '" + selection + "'");
            System.out.println(sql);
            pstmt = conn.prepareStatement(new String(sql));
            pstmt.execute();
            rset = pstmt.executeQuery();
            request.setAttribute("select", rset);
            request.getRequestDispatcher("/delete_list.jsp").forward(request, response);
            rset.close();
            pstmt.close();
            conn.close();
            } catch (Exception e) {
            e.printStackTrace();
            } finally {
                try {
                    conn.close();
                } catch (Exception e) {
                }
            }
                request.getRequestDispatcher("/delete_list.jsp").forward(request, response);
                break;

Java)ShainsBeans
public Boolean delete_list(){
    try {
        String sql = "DELETE FROM `company_db`.`todo` WHERE  `todo_id`='" + deletebox + "'";
        doDataBase(sql);
        return true;
    } catch (Exception e) {
        e.printStackTrace();
        return false;
    }
}
    
未解決問題:複数の削除はできません。

・追加と削除が終わると、自動的に一覧画面へ戻るようにしました。
実行方法:ログイン機能を利用します。表面は一覧画面へ戻るけど、実際はもう一度ログインします。そうすると、長いコードを書くのは必要がありません。
(HTML)
<input type="hidden" name="id"
    value="<%=shain.getId()%>"> <input type="hidden" name="pw"
    value="<%=shain.getPw()%>"> <input type="hidden" name="mode"
    value="deletelist_database"> <input type="submit" value="削除">
Java
if (status.equals("成功しました") && mode.equals("verification")
    || status.equals("成功しました") && mode.equals("deletelist_database")
    || status.equals("成功しました") && mode.equals("addlist_database"
))
                
                
プロジェクト構造
index.jsp ログイン画面 (完成)
new_ID.jsp 新規登録画面 (完成)
member.jsp 一覧画面 (未完成) 完了ボタン、打消し線
delete_ID.jsp ID削除画面 (完成)
change_password.jsp パスワード変更画面 (完成)
add_list.jsp 追加画面 (完成)
delete_list.jsp 削除画面 (未完成)複数選択の削除できません
edit_list.jsp 編集画面 (未完成)編集機能
result.jsp 結果画面 (完成)

ShainBeans.java メソッドの実行 (一部分完成)
EditServlet.java ボタンで事件を選びます (一部分完成)

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

・PASSWORD確認PASSWORD確認

やった方法 : javascriptで条件式を書きましたが、うまくできません。

解決方法 : PASSWORDのINPUTの属性を追加しました。

(HTML)

onchange="this.setCustomValidity(this.validity.patternMismatch ? 'パスワードの確認が正しくありません' : ''); 

if(this.checkValidity()) form.password_two.pattern = this.value;"

 

・画面レイアウトの調整

PASSWORDの入力フォームとPASSWORDの確認入力フォームを整列します。

(HTML)

<div style="padding-left: 592px;">

問題点 : ブラウザーの画面の大きさによって位置を変わります。

解決方法 : テーブルを作成します。

(HTML)

<table border="0"><tr><td></td></tr>

 

指摘 => レイアウトは CSSで調整すること。 HTMLで調整しないようにする。 

(可能であればbootstrapを使用してほしいが、のちのちの勉強課題)

 

 

・削除画面とパスワード変更画面へ遷移しません

問題点 : EclipseブラウザーがWeb サイトはページを表示できません。(削除画面だけ)                Chromeは削除ボタンと変更ボタンを押すと、削除画面へ遷移します。

解決方法 : 違うformで定義します。

(HTML)

<form action="Edit" method="POST"> <input type="hidden" name="mode" value="delete"> <input type="hidden" name="id" value="<%=userid%>"> <input type="submit" value="アカウント削除"> </form>

<form action="Edit" method="POST"> <input type="hidden" name="mode" value="change"> <input type="hidden" name="id" value="<%=userid%>"> <input type="hidden" name="pw" value="<%=userpw%>"> <input type="submit" value="パスワード変更"> </form>

未解決点 : EclipseブラウザーがWeb サイトはページを表示できません。(削除画面だけ)

 

 

・ToDoテーブルを生成して、既定値(デフォルト値)を付きます。

問題点:自動的に日時を挿入します。

解決方法:Calendarメソッド。

JAVA

import java.util.Calendar;Calendar cal=Calendar.getInstance();

cal.get(Calendar.YEAR)cal.get(Calendar.MONTH)cal.get(Calendar.Date)
未解決バッグ:現在の時間から1月を引きます。

 

指摘 =>  Timestamp timestamp = new Timestamp(System.currentTimeMillis());

 

 

 

 

・Databaseの資料のディスプレイ

問題点 : 以前のコードと同じですが、エラーになってしまいました。

解決方法 : デバッグで問題を発見しました。値の型はDataBaseの型と違うので、データ(data)を現すことができませんでした。

(HTML)

<%=rset.getString(1)%>

 

 

・Todoの追加

方法:ID登録機能と同じ作り方

未解決問題:追加画面はIDの値をもらいません。

 

指摘=>DBテーブル側で auto_increment を定義する。

 

 

 

・現在のプロジェクト構造
index.jsp  ログイン画面 (完成)
new_ID.jsp 新規登録画面 (完成) 
member.jsp 一覧画面 (一部分完成) 
delete_ID.jsp ID削除画面 (完成)
change_password.jsp パスワード変更画面 (完成) 
add_list.jsp 追加画面 (未完成) IDの値をもらいません。
delete_list.jsp 削除画面 (未完成) 機能をまだ追加しません。
edit_list.jsp  編集画面 (未完成) 機能をまだ追加しません。
result.jsp 結果画面 (一部分完成)

ShainBeans.java メソッドの実行 (一部分完成)
EditServlet.java  ボタンで事件(イベント event)を選びます (一部分完成)