こんにちは。くまごろーです。
今サーブレット/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; }
まだまだ先は長い(-_-)