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

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

ただいまの
回答率

87.91%

JSPにmysqlのデータが表示されない

解決済

回答 3

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 4,752

前提・実現したいこと

書籍貸出システムを作成しているのですが、 
ログインしたユーザが借りている書籍だけ表示させたいです。
しかし、データが表示されません。
エラーでもないのでどこが間違えているかわからないです。

JSP

    import="java.sql.*,javax.naming.*,javax.sql.*, java.text.SimpleDateFormat,java.util.Date"%>
<%@page import="java.util.*"%>
<%@page import="java.text.*"%>

<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql"%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

<html>
<sql:setDataSource var="db" driver="com.mysql.jdbc.Driver"
    url="jdbc:mysql://localhost/Library" user="root" password="" />
<sql:query var="rs" dataSource="${db}">
  SELECT book.book_no,book.book_name,genre.genre_name,
  lend.lend_date,book.state FROM book  LEFT JOIN lend ON book.book_no = lend.book_no LEFT JOIN
  user ON user.user_no = lend.user_no LEFT JOIN genre ON book.genre_no = genre.genre_no

  <c:if test="${!empty param['genreNo']}">
      where book.genre_no = ?
      <sql:param value="${param['genreNo']}" />
    </c:if>
  ORDER BY book.book_no;
</sql:query>
<sql:query var="rs1" dataSource="${db}">
    select * from genre
</sql:query>
<head>

<link rel="stylesheet" type="text/css" href="css/kanri_mypage.css">

<title><%=(String) session.getAttribute("user_id")%>さん用マイページ</title>
</head>
<body style="text-align: center;">

    <h2>
        ようこそ<%=(String) session.getAttribute("user_id")%>さん
    </h2>
    <form method="POST" action="user_mypage.jsp">

        <%
            Connection con = null;
            PreparedStatement ps = null;
            String sql = null;
            ResultSet rs = null;
            try {

                Context initContext = new InitialContext();
                DataSource ds = (DataSource) initContext
                        .lookup("java:comp/env/jdbc/Library");
                con = ds.getConnection();

                sql = /* "select * from book"; */
                "select book.book_no,book.book_name,book.genre_no,lend.return_date,book.state"
                        + " from lend left join book on book.book_no = lend.book_no "
                        + "where user_no = ?"; //"検索したいuser_id"
                ps = con.prepareStatement(sql);
                ps.setString(1, (String) session.getAttribute("user_id"));
                rs = ps.executeQuery();
        %>
    </form>


    <%
        GregorianCalendar cal = new GregorianCalendar();
            SimpleDateFormat format = new SimpleDateFormat("yyyy年M月d日 E曜日");
            String datestr = format.format(cal.getTime());
            out.println(datestr);
    %>
    <br>
    <br> あなたが貸出している書籍は下記の通りです。
    <br>
    <br>

    <table border="1" align="center">
        <tr>
            <th>ID</th>
            <th>書籍名</th>
            <th>ジャンル</th>
            <th>返却予定日</th>
            <th>状況</th>
        </tr>
        <tr>
            <%
                while (rs.next()) {
            %>

            <td><%=rs.getString("book_no")%></td>
            <td><%=rs.getString("book_name")%></td>
            <td><%=rs.getString("genre_no")%></td>

            <td>
                <%
                    if (rs.getString("state").equals("2")) {
                %>-<%
                    } else {
                %> <%
     if (rs.getString("return_date") == null) {
 %>-<%
     }

                 if (rs.getString("return_date") != null) {
 %><%=rs.getString("return_date")%> <%
     }
             }
 %>
            </td>

            <td>
                <%
                    if (rs.getString("state").equals("2")) {
                %>貸出不可<%
                    } else {
                %> <%
     if (rs.getString("return_date") == null) {
 %>貸出可能<%
     } else {

                     SimpleDateFormat form = new SimpleDateFormat(
                             "yyyy-MM-dd");
                     Date date = form.parse(rs.getString("return_date"));

                     if ((date.compareTo(new Date())) >= 0) {
 %>貸し出し中<%
     } else {
 %>返却遅延 <%
     }
                 }
             }
 %>
            </td>

        </tr>
        <%
            }
        %>
    </table>
    <%
        } catch (Exception e) {
            throw new ServletException(e);
        } finally {
            try {
                if (rs != null) {
                    rs.close();
                }
                if (ps != null) {
                    ps.close();
                }
                if (con != null) {
                    con.close();
                }
            } catch (Exception e) {
            }
        }
    %>
    <br>
    <form method="POST" action="book_lend.jsp">
        <input type="submit" name="reset" value="書籍貸出へ">
    </form>
    <br>
    <form method="POST" action="Login.jsp">
        <input type="submit" name="reset" value="ログアウト">
    </form>

</body>
</html>

DB

book
+---------+-----------+-------+----------+------+------------+
| book_no | book_name | state | genre_no | note | delete_flg |
+---------+-----------+-------+----------+------+------------+
|       1 | java入門  |     2 |        1 |      |          0 |
|       2 | ONE PIECE |     1 |        2 | NULL |          0 |
+---------+-----------+-------+----------+------+------------+

user
+---------+---------+------------+-----------+-----------------+----------------+----------+-------+
| user_no | user_id | first_name | last_name | first_name_kana | last_name_kana | password | admin |
+---------+---------+------------+-----------+-----------------+----------------+----------+-------+
|       1 | sato    | sato       | taro      | サトウ          | タロウ         | s        |     1 |
|       2 | user    | user       | user      | ユーザー        | ユーザー       | user     |     2 |
+---------+---------+------------+-----------+-----------------+----------------+----------+-------+

lend

+---------+---------+---------+------------+-------------+
| lend_no | user_no | book_no | lend_date  | return_date |
+---------+---------+---------+------------+-------------+
|       1 |       2 |       1 | 2016-06-16 | 2016-06-23  |
+---------+---------+---------+------------+-------------+
lend_date--->借りた日
return_date--->返却期日

追記

ちなみにDBとは接続は出来ています。
  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

checkベストアンサー

0

見た限りlendに1件だけあるレコードのuser_noが存在しないuserを指しているように見えます。
user_noは1か2しかレコードがないため、ひも付きがうまくいっていないことが原因かと思います。

蛇足

パスワードがどうも平文で保存されているように見えます。暗号化をかけて「ハッシュ値」を保存しておいて、一致を見るときは受け取ったパスワードを同じ暗号化をかけて、「ハッシュ値」の一致を確認することが望ましいです(検索でよく出てくるMD5やSHA1はクラックされやすいので、もっと強固な方式を採用してください)。参考としてSHA256の暗号化方法を貼っておきます。
https://www.websec-room.com/2013/02/27/238

追記

参考だと伝わらないようなので答えを書きます。

sql = "SELECT * FROM lend " +
    "LEFT JOIN user ON lend.user_no = user.user_no " +
    "LEFT JOIN book ON lend.book_no = book.book_no " +
    "WHERE user.user_id = ?";
ps = con.prepareStatement(sql);
ps.setString(1, (String) session.getAttribute("user_id"));
rs = ps.executeQuery();


もうすこしJDBCの使い方を勉強しましょう。前回の質問のコメントでも説明しましたが、PreparedStatementには「?」を置くことで「後から値を設定」できます。

ps.setString(1, (String) session.getAttribute("user_id"));


この行は「1」つ目の?の場所に「セッションに保存されたuser_id」を「String」で割り当てる意味です。
例えばセッションに保存されたuser_idがuserである場合、最終的にこのPreparedStatementは以下のSQLと同じ意味を持ちます。

SELECT
    *
FROM
    lend
    LEFT JOIN user ON lend.user_no = user.user_no
    LEFT JOIN book ON lend.book_no = book.book_no
WHERE user.user_id = "user"


試しにこのSQLをMySQL上で実行してみてください。
※すいません、satoは1冊も借りていないのでuserに訂正しました。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/16 11:34

    すいません。
    以前提示してくださったSQLの最後のところが分からなかったもので。。。

    キャンセル

  • 2016/06/16 11:49

    追記しました。

    キャンセル

  • 2016/06/16 11:54

    すいません、例の中のセッションに保存されたユーザをuserに訂正しました。satoは1冊も本を借りていないため、参考になっていませんでした。

    キャンセル

0

ちょっと確認ですが、JSPのソースに記載してあるSQLは、コンソールから直接入力して、想定通りに値を取得できている事を確認済みですか?

複数テーブルをjoinしていますが、ご提示頂いたDBの情報の中に genre.genre_no に相当する項目が見当たらなかったので、少し気になりました。

それと、蛇足ですが、なぜDB接続や処理のロジックまで全てをJSPの中に詰め込んでしまうのでしょうか・・・
JSP自体の演習か何かならば理解出来ますが、メンテナンス性は良くないですよね。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/16 11:36

    JSPの勉強も多少あるのでJSP主体になってしまっています。
    またgenreテーブルは掲載していませんでした。
    なのでgenre_noは存在します。

    キャンセル

0

セッションにuser_idをセットしているところがわからないので勘ですが。
lendテーブルはuser_no(数字)なのに、user_id(英数字)を検索条件に指定しているように思えます。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/06/16 11:37

    キャストすれば宜しいですか?

    キャンセル

  • 2016/06/16 11:40

    そういうことではなく。
    セッションに入っているuser_idは、userテーブルのuser_noですか?user_idですか?
    user_idなら、lendテーブルのuser_noとはマッチしないので、セッションにuserテーブルのuser_noを持つようにしないといけないのでは。

    キャンセル

  • 2016/06/16 13:23

    追記
    user_idであるなら、userテーブルからuser_noを参照できるので、リンクさせればよいですね。
    sql = "select book.book_no,book.book_name,book.genre_no,lend.return_date,book.state"
    + " from lend, user left join book on book.book_no = lend.book_no "
    + " left join user on lend.user_no = user.user_no "
    + "where user.user_id = ?"; //"検索したいuser_id"

    キャンセル

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

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

関連した質問

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