MENU

【サーブレット&JSP】ツイートアプリを作っていて苦戦したこと

こんにちは。くまごろーです。
サーブレット/JSPで、今までのおさらいを兼ねた試作アプリを作っています。
今まで実装した機能を羅列するとこんな感じです。
 
 ・ 会員登録
 ・ ログインログアウト
 ・ ツイート一覧表示
 ・ ツイート投稿
 ・ ツイート一覧のユーザー名をクリックするとユーザー詳細画面に遷移
 ・ ツイート一覧のツイートをクリックすると、該当ツイートの詳細画面に遷移
 
列挙してみるとシンプルなのですが、中々すんなりとはいきませんでした。
今回はかなり苦戦したところをまとめました。

 
 
1 ツイート一覧から、ユーザー(ツイート)詳細画面に遷移する
 
 そのツイートを投稿したユーザー、もしくはツイート自体の詳細ページに遷移するには、ユーザー/ツイートを特定するための引数でサーブレットクラスに渡さなきゃいけない。そこまでは思い付いたんですが、どうやって渡すかがわからず悩みました。
結局、URLパラメータに入力して渡すという形をとりました。
コードは下記の通りですが、URL内でjavaのメソッドを実行する方法がよくわからず、無駄に時間を浪費しました(-"-)

jspファイル>

 ~中略~
<% for(WrittenPost writtenPost : writtenPostList){ %>
<p>
  <a href="/testJavaApp/UserServlet?userId=<%= writtenPost.getUserId()%>">
      <%= writtenPost.getName() %>
  </a><a href="/testJavaApp/PostsServlet?postId=<%= writtenPost.getPostId()%>">
    <%= writtenPost.getText() %>
  </a>
</p>
<% } %>
 ~中略~

 
servletファイル>

protected void doGet(HttpServletRequest request, HttpServletResponse response) 
  throws ServletException, IOException {
    //リクエストパラメータからユーザーIDを取得
    String userId = request.getParameter("userId");

    //アカウントを取得
    User user = new User(userId);
    FindLogic bo = new FindLogic();
    Account userAccount = bo.getUserInfo(user);
    request.setAttribute("userAccount", userAccount);

    RequestDispatcher dispatcher = 
        request.getRequestDispatcher("/WEB-INF/jsp/user.jsp");
    dispatcher.forward(request, response);
  }

 
 
 
2 DBに保存されたツイート一覧を取得して、アプリケーションスコープに保存したい
 
 ツイートをDBに保存できるようにするところまではいけたんですが、そこからどうやってツイート一覧を引き出し、アプリケーションスコープに保存するのか結構考えました。で、結局

 1 arrayListを用意
 2 SELECT文を実行し、変数に格納する
 3 while文でツイートを1行ずつ「WrittenPost」インスタンスに格納する
 4 格納したツイートを「add」メソッドでListに追加

 
という形をとりました。

public ArrayList<WrittenPost> loadPost() {

  //arrayListを用意
  List<WrittenPost> writtenPostList= new ArrayList<WrittenPost>();

  //データベースへ接続
  try (Connection conn = 
          DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS)) {

    //SELECT文を準備
    String sql = "SELECT ID, NAME, TEXT, USER_ID FROM POST";
    PreparedStatement pStmt = conn.prepareStatement(sql);
    //SQL文を実行し、結果を「rs」に格納
    ResultSet rs = pStmt.executeQuery();

    while(rs.next()) {
      WrittenPost writtenPost = new WrittenPost();
      writtenPost.setPostId(rs.getInt("ID"));
      writtenPost.setName(rs.getNString("NAME"));
      writtenPost.setText(rs.getNString("TEXT"));
      writtenPost.setUserId(rs.getNString("USER_ID"));
      //ListにPostをaddしていく
      writtenPostList.add(writtenPost);
    }

  } catch (SQLException e) {
    e.printStackTrace();
    return null;
  }
  //見つかったpost、またはnullを返す
  return (ArrayList<WrittenPost>) writtenPostList;
}

まだまだ先は長い(-_-)