質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

88.82%

JSPとServletの遷移についての質問です。情報処理途中の例外について。

受付中

回答 1

投稿

  • 評価
  • クリップ 0
  • VIEW 434

kisara

score 10

1 「createUserv_ver2.jsp」にデータを入力、「CreateUserServlet.java」にデータを引き渡す。
2 「CreateUserServlet.java」に格納されたデータを「createUserConfirmv_ver2.jsp」で表示。登録ボタンを押して、データを「CreateUserServlet2.java」に引き渡す。
3 「CreateUserServlet2.java」に引き渡されたデータを、「CreateUserDAO」によってデータベースに登録。また、それに従って生成されたIDを「createUserSuccess.jsp」によって表示。

というプロセスで個人情報の処理を行いたいのですが、2と3の間で例外が発生してしまいます。
プログラム上の問題には違いないのですが、現在の私の知識では原因を発見できませんでした。
もしよろしければ、どなたかご教授いただけると大変うれしく思います。

createUserv_ver2.jsp
(省略)
<title>新規登録フォームトップ</title>

(省略)
    }
}
</script>
</head>
<body>
<h1>新規会員登録</h1><br>

<p>新規登録を行います。以下の情報を入力してください。</p>
<p>※英数字は半角で入力してください。</p>

<form action="./CreateUserServlet" method="post">


名前  <input type="text" size="10" name="userName"><br>
郵便番号  <input type="text" size="10" name="userPost"><br>
住所  <input type="text" size="100" name="userAddress"><br>
電話番号  <input type="text" size="15" name="userTel"><br>
email  <input type="text" size="50" name="userEmail"><br>
生年月日(西暦)  
<select name="userBirthYear">
<script type="text/javascript">loop(1900,2018)</script>
</select><select name="userBirthMonth">
<script type="text/javascript">loop(1,12)</script>
</select><select name="userBirthDay">
<script type="text/javascript">loop(1,31)</script>
</select><br>


<br>
<br>
<br>
パスワードを設定します。任意の文字列を入力してください(4文字以上)。<br>
<input type="password" size="20" name="userPassword" value="0000"><br>
もう一度入力してください。<br>
<input type="password" size="20" name="userPassword2" value="0000"><br>
<br>
<br>
<input type="submit" value="次へ" >
<br>
<br>

<a href ="top.jsp">トップへ戻る</a>


</form>

</body>
</html>
CreateUserServlet.java
(省略)

@WebServlet("/CreateUserServlet")
public class CreateUserServlet extends HttpServlet {





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


        //リクエストパラメーターの取得
        request.setCharacterEncoding("UTF-8");


        String userName=request.getParameter("userName");
        String userPost=request.getParameter("userPost");
        String userAddress=request.getParameter("userAddress");
        String userTel=request.getParameter("userTel");
        String userEmail=request.getParameter("userEmail");
        String userBirthYear=request.getParameter("userBirthYear");
        String userBirthMonth=request.getParameter("userBirthMonth");
        String userBirthDay=request.getParameter("userBirthDay");
        String userPassword=request.getParameter("userPassword");
        String userPassword2=request.getParameter("userPassword2");



        //パラメータチェック(教科書178ページ参照)
        if(userName.isEmpty()||userPost.isEmpty()||userAddress.isEmpty()||userTel.isEmpty()||userEmail.isEmpty()
                ||userPassword.isEmpty()||userPassword2.isEmpty()||userPassword.length()<=3) {
            request.setAttribute("message","空欄があります。または、パスワードの文字数が足りません。");
            RequestDispatcher rd=request.getRequestDispatcher("/error.jsp");
            rd.forward(request,response);



        }else {

            CreateUserBean cubean = new CreateUserBean();
            cubean.setUserName(userName);
            cubean.setUserPost(userPost);
            cubean.setUserAddress(userAddress);
            cubean.setUserTel(userTel);
            cubean.setUserEmail(userEmail);

            cubean.setUserBirthYear(userBirthYear);
            cubean.setUserBirthMonth(userBirthMonth);
            cubean.setUserBirthDay(userBirthDay);

            cubean.setUserBirthday(StringToSqlDate.convertDate(userBirthYear,userBirthMonth,userBirthDay));
            cubean.setUserPassword(userPassword);


        HttpSession session = request.getSession();

        session.setAttribute("profile",cubean);
        RequestDispatcher rd = request.getRequestDispatcher("/createUserConfirmv_ver2.jsp");
        rd.forward(request,response);
        }
    }


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

        doGet(request, response);
    }
}
createUserConfirmv_ver2.jsp
(省略)
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>新規登録フォームトップ</title>

(省略)
</head>
<body>
<h1>会員登録確認</h1><br>

<p>以下の情報が入力されました。問題がなければ、「登録」ボタンによって処理を終了してください。入力ミスがあるがある場合は、前頁から訂正してください。</p>
<p>※英数字は半角で入力してください。</p>



<p>名前  ${profile.getUserName()}</p>
<p>郵便番号  ${profile.getUserPost()}</p>
<p>住所  ${profile.getUserAddress()}</p>
<p>電話番号  ${profile.getUserTel()}</p>
<p>email  ${profile.getUserEmail()}</p>
<p>生年月日(西暦)  </p>
<p>${profile.getUserBirthYear()}年 ${profile.getUserBirthMonth()}月 ${profile.getUserBirthDay()}</p>
<p style="text-indent:-9999px;">パスワード:${profile.getUserPassword()}</p>

<br>

<form method="post">
<button type="submit" name="go" onclick="location.href='./CreateUserServlet2'">登録</button>
<button type="submit" name="return" onclick="location.href='./createUserv_ver2'">前頁に戻る</button>

<br>
<br>
<br>


<a href ="top.jsp">トップへ戻る</a>


</form>

</body>
</html>
CreateUserServlet2.java
(省略)

@WebServlet("/CreateUserServlet2")
public class CreateUserServlet2 extends HttpServlet {
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {



        request.setCharacterEncoding("UTF-8");


        String userName=request.getParameter("userName");
        String userPost=request.getParameter("userPost");
        String userAddress=request.getParameter("userAddress");
        String userTel=request.getParameter("userTel");
        String userEmail=request.getParameter("userEmail");
        String userBirthYear=request.getParameter("userBirthYear");
        String userBirthMonth=request.getParameter("userBirthMonth");
        String userBirthDay=request.getParameter("userBirthDay");
        String userPassword=request.getParameter("userPassword");

        CreateUserBean cubean = new CreateUserBean();
        cubean.setUserName(userName);
        cubean.setUserPost(userPost);
        cubean.setUserAddress(userAddress);
        cubean.setUserTel(userTel);
        cubean.setUserEmail(userEmail);
        cubean.setUserBirthday(StringToSqlDate.convertDate(userBirthYear,userBirthMonth,userBirthDay));
        cubean.setUserPassword(userPassword);

        cubean.setSqlUserBirthday(userBirthYear, userBirthMonth, userBirthDay);
        System.out.println(cubean.getUserBirthday());
        try {

        //CreateUserDAOの呼び出し

        CreateUserDAO dao = new CreateUserDAO();
        dao.CreateUser(userName,userPost,userAddress,userTel,userEmail,userPassword,(Date) cubean.getUserBirthday());


        System.out.print("完了");


        ShowIdDAO daoId = new ShowIdDAO();
        request.setAttribute("yourId",daoId);
            gotoPage(request, response, "/createUserSuccess.jsp");


        }catch(Exception e){
            e.printStackTrace();
            request.setAttribute("message", "内部エラーが発生しました");
            gotoPage(request,response,"error.jsp");
        }
    }




    private void gotoPage(HttpServletRequest request,
            HttpServletResponse response, String page) throws ServletException,
            IOException{
        RequestDispatcher rd= request.getRequestDispatcher(page);
        rd.forward(request, response);
    }
}
CreateUserDAO.java
(省略)


public class CreateUserDAO {
    private Connection con;

    public CreateUserDAO()throws DAOException{
    getConnection();
    System.out.println("データベースに接続しました");
    }

    public void CreateUser(String userName,String userPost,String userAddress,String userTel,String userEmail,
            String userPassword, Date userBirthday) throws DAOException{

        if(con==null)
            getConnection();

    PreparedStatement st=null;


    try{
        String sql="INSERT INTO userinfo("
                + "user_name,user_post,user_address,user_tel,user_email,user_password,user_birthday) "
                + "VALUES(?,?,?,?,?,?,?)";
        st = con.prepareStatement(sql);

        st.setString(1,userName);
        st.setString(2,userPost);
        st.setString(3,userAddress);
        st.setString(4,userTel);
        st.setString(5,userEmail);
        st.setString(6,userPassword);
        st.setDate(7,userBirthday);


        st.executeUpdate();
        st.close();


        return;

    }catch(Exception e) {
        e.printStackTrace();
        throw new DAOException("レコードの操作に失敗しました。");
    }finally {
        try {

            if(st!=null)
                st.close();

        }catch(Exception e) {
            throw new DAOException("リソースの開放に失敗しました");
        }
    }
    }

        private void getConnection() throws DAOException{
            try {
                // JDBCドライバの登録
                Class.forName("org.postgresql.Driver");
                // URL,ユーザ名,パスワード設定
                String url = "jdbc:postgresql:webbook";
                String user = "postgres";
                String password = "himitu";
                // データベース接続
                con = DriverManager.getConnection(url, user, password);

            }catch(Exception e) {
                e.printStackTrace();
                throw new DAOException("接続に失敗しました。");
            }
        }



    }
ShowIdDAO
(省略)

public class ShowIdDAO {
    private Connection con;

public ShowIdDAO()throws DAOException{
        getConnection();
}
    // 現在最新行のIDを表示するメソッド
    public long showCurrId() throws DAOException{

        PreparedStatement st=null;
        ResultSet rs=null;
        try {
            String sql="SELECT currval('userinfo_user_id_seq')";
            st = con.prepareStatement(sql);
            rs = st.executeQuery();

            int currId = 0;
            while(rs.next()) {
                currId = rs.getInt(sql);
            }
        return currId;

    }catch(Exception e) {
        e.printStackTrace();
        throw new DAOException("レコードの操作に失敗しました。");
    }finally {
        try {
            if(rs!=null)
                rs.close();
            if(st!=null)
                st.close();

        }catch(Exception e) {
            throw new DAOException("リソースの開放に失敗しました");
        }
    }
}

        private void getConnection() throws DAOException{
            try {
                // JDBCドライバの登録
                Class.forName("org.postgresql.Driver");
                // URL,ユーザ名,パスワード設定
                String url = "jdbc:postgresql:webbook";
                String user = "postgres";
                String password = "himitu";
                // データベース接続
                con = DriverManager.getConnection(url, user, password);

            }catch(Exception e) {
                e.printStackTrace();
                throw new DAOException("接続に失敗しました。");
            }
        }



    }
createUserSuccess.jsp
(省略)

<p>あなたの会員IDは${yourId}です。<p>
<p><a href ="top.jsp">トップページ</a>へ戻ってください。<p>


</body>
</html>
  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

0

formタグにaction属性がなにも指定されていなければ(または空文字)自身に対して送信します。
/CreateUserServlet2を指定する必要があるのでは。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2019/05/27 16:47

    ご回答いただきありがとうございます。
    actionで「CreateUserServlet2.java」を指定してみます。
    助かりました。

    キャンセル

  • 2019/05/27 16:49

    動作確認して完全解決してから「解決済み」にしてくださいね。
    でないと回答の意味がないですし、「それっぽいアドバイスが得られたら終了」では資産になりません。
    別質問の回答も理解が間違っているため「解決済み」としてはいけないと思います。
    https://teratail.com/questions/191554

    キャンセル

  • 2019/05/27 16:58

    件の質問については、例の私の認識で動作してしまったため解決済みとしてしまいました。
    改めて学びなおします。

    キャンセル

15分調べてもわからないことは、teratailで質問しよう!

  • ただいまの回答率 88.82%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る