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

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

ただいまの
回答率

90.48%

  • Java

    14073questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • MySQL

    5996questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • JSP

    945questions

    JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

jsp間で値のやり取りをするには

受付中

回答 1

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 3,590

manmos

score 45

質問です。

現在Mysqlから取得した値を一覧画面のjspで表示し、そこから入力フォームのjspに移行し、入力した値でMysqlへInsert、またはupdate文を実行するコードを作成中です。

Insertの流れは完成しているのですがUpdateの流れがうまくいかず困っています。
入力用のjspはInsertとupdateで同じものを使用し、更新の場合は移行するボタンにキー情報となる"id"の値を渡してそれを入力フォームへ表示させるようにしたいのですがこの部分で詰まっています。
以下、一覧と入力のjspとなります。

<h1>一覧</h1>
<a href="./Detail">新規</a>
<body>
 <TABLE border="1">
<TR>
<TH>No</TH>
<TH>氏名</TH>
<TH>氏名(ひらがな)</TH>
<TH>更新</TH>
<TH>削除</TH>

</TR>
<TR>
<c:forEach var="tmp" items="${list}">
<TD><c:out value="${tmp.Id}" /></TD>
<TD><c:out value="${tmp.name}" /></TD>
<TD><c:out value="${tmp.nameHiragana}" /></TD>
<TD><a href="./Detail?Id=${tmp.Id}">詳細</a></TD>
<TD><a href="./Detail?Id=${tmp.Id}" onClick="window.confirm('[${tmp.abbreviation}][${tmp.name}]を削除しますか?');">削除</a></TD>
<TR/>
</c:forEach>
</table>
<h1>更新</h1>
<form action="./Detail" method="post">
<input type="hidden" name="Id" value="id ">//DBのカラム名"id"
氏名<input type="text" name="name" size="20" maxlength="20" value="${tmp.name}" ><br>
氏名(ひらがな)<input type="text" name="nameHiragana" size="20" maxlength="20"><br>
  <input type="submit" value="登録" />
</form>
</body>


今のところ氏名の部分だけ表示させようとしていますがうまくいかないです。

どこに問題があるでしょうか、詳しい方いらっしゃればご指摘願います。

追記です。

どこの部分が必要かがわからないので関係ありそうな部分を全て記載します。
長文になって申し訳ありません・・・

public class listDao {

    private static final String url = "jdbc:mysql://localhost:3306/test";
    private static final String user = "root";
    private static final String password = "";

    private static Connection conn = null; // Connectionクラス
    private static PreparedStatement pstmt = null; // Statementクラス
    private static ResultSet rs = null; // ResultSetクラス

    public ArrayList<Listinfo> findAll(String[] args) {
        ArrayList<Listinfo> listInfos = new ArrayList<Listinfo>(); 

        // SQL文
        String sql = "SELECT * FROM e_state";

        try {
            Class.forName("com.mysql.jdbc.Driver"); 

            conn = DriverManager.getConnection(url, user, password);
            pstmt = conn.prepareStatement(sql); 
            rs = pstmt.executeQuery(); 
            while (rs.next()) {
                // 結果表からデータを取得
                Listinfo list = new Listinfo();

                list.setEmployeeId(rs.getString("id"));
                list.setName(rs.getString("name"));
            list.setNameHiragana(rs.getString("name_hiragana"));



                listInfos.add(list);

            }

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
        } finally {
            if (rs != null) {
                try {
                    rs.close();
                } catch (SQLException e) {
                }
                rs = null;
            }
            if (pstmt != null) {
                try {
                    pstmt.close();
                } catch (SQLException e) {
                }
                pstmt = null;
            }
            if (conn != null) {
                try {
                    conn.close();
                } catch (SQLException e) {
                }
                conn = null;
            }

        }
        return listInfos;
    }
package dto;

public class Listinfo {

    private String Id;
    private String name;
    private String nameHiragana;


    public String getId() { return Id; }
    public String getName() { return name; }
    public String getNameHiragana() { return nameHiragana; }


    public void setId(String Id) { this.Id = Id; }
    public void setName(String name) { this.name = name; }
    public void setNameHiragana(String nameHiragana) { this.nameHiragana = nameHiragana; }
}
package servlet;

import java.io.IOException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import Dao.listDao;
import dto.Logininfo;
import dto.Listinfo;

@WebServlet("/List")
public class List extends HttpServlet {
    private static final long serialVersionUID = 1L;

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // TODO Auto-generated method stub
        //session切れでログイン画面に戻す
        HttpSession session = request.getSession();
        Logininfo login = (Logininfo)session.getAttribute("user");
        if(login == null) {
            response.sendRedirect("./Login");
            return;

        }
        listDao daoArray = new listDao();
        ArrayList<Listinfo> listInfo = daoArray.findAll(null);
        request.setAttribute("list", listInfo);
        request.getRequestDispatcher("/WEB-INF/jsp/list.jsp").forward(request, response);

       //list.jspへ
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) {
    }
}
package servlet;

import java.io.IOException;
import java.sql.SQLException;
import java.util.ArrayList;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import Dao.listDao;
import dto.Listinfo;
import dto.Listinfo2;

/**
 * Servlet implementation class Detail
 */
@WebServlet("/Detail")
public class Detail extends HttpServlet {
    private static final long serialVersionUID = 1L;

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

    /**
     * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
     */
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    //    HttpSession session = request.getSession();

        request.setCharacterEncoding("UTF-8");    
        String Id = request.getParameter("Id");
        String name = request.getParameter("name");
        String name_hiragana = request.getParameter("nameHiragana");

        listDao dao = new listDao();        //Daoクラス生成
        try {
            dao.InsertInformation(Id, name, name_hiragana);
        } catch (ClassNotFoundException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO 自動生成された catch ブロック
            e.printStackTrace();
        }    //挿入処理}
   //     session.setAttribute("Infomation", dao);

        response.sendRedirect("./List");
}
}


Updateのsql文処理の部分はまだ用意してないです。

以上で足りるでしょうか?
宜しくお願い致します。

  • 気になる質問をクリップする

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

質問への追記・修正、ベストアンサー選択の依頼

  • argius

    2016/04/10 15:03

    コードはこれで全部ですか?ディレクティブなどの部分が無いと何が足りないのか分かりません。

    キャンセル

回答 1

0

追記ありがとうございます。

これで全部だとしたら、まずJSPにJSTLの宣言が必要ですね。
こういうのです。
<%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

それと、サーブレットから値を渡す部分、ここでいうとtmpですね。
これをスコープ変数を利用してJSPに渡す操作が必要です。

JSTLとスコープ、これが分からなければ、まずそこから勉強してみましょう。


(追記)

なんとなく分かったかもしれません。

href="./Detail?Id=${tmp.Id}"
で渡そうとしているんですね。

でも、DetailサーブレットってListにリダイレクトしてますよね。
ここは更新のJSPを出すところですか?

サーブレットは、一覧、詳細、更新をそれぞれ用意するほうが良いですね。
ひとつ足りないように思います。

一覧 list
詳細 detail
更新 update

のような感じです。

今は詳細と更新がごっちゃになっていると思います。
今のDetailサーブレットはUpdateServletにして、
あらためてDetailServletを詳細表示用に追加しましょう。
そして、更新JSPのformのアクションを、UpdateServletにします。

それと、更新のJSPを出すところですが、
tmpを引き継ぐのではなく、詳細サーブレットで再度渡されたIDのユーザーを取り出して
requestスコープに登録してあげるようにする方が良いでしょう。
request.setAttribute("tmp", user);のように。

あとできれば、変数名はtmpじゃなくてuserInfoとかの方が良いと思います。
userはログインで使ってしまっていますからね。

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

  • 2016/04/10 19:12

    サーブレットから値を渡すというと一番上の一覧画面のjspにて使用しているtmpの部分のようなものでしょうか?
    一覧画面ではレコード内のカラムを横一行にして行の最後にリンクのボタンを用意、それをレコードの数だけ表示という風にしていますが今回はその横一列の値を全て一覧画面から入力フォームに渡して初期値にしたいと考えています。

    サーブレットからjspへ渡す処理は一覧画面を構築する際に使用しましたが、jspからjspへ渡す場合も同じような処理が必要になるのでしょうか?

    キャンセル

  • 2016/04/10 19:45

    ちょっと見逃していたところがあったので、少し訂正を含めてコメントします。

    現状は、回答に書いたtaglib宣言が足りないだけだと思います。
    <c:で始まるタグはJSTLのものなので、JSTLを使えるようにしなければ、サーブレットから引き継いだ変数listが使えるようになりません。
    なので、taglibを宣言してJSTLを使えるようにすれば良いはずです。


    > サーブレットから値を渡すというと一番上の一覧画面のjspにて使用しているtmpの部分のようなものでしょうか?

    ここではlistの方ですね。サーブレットでは、
    request.setAttribute("list", listInfo);
    としてセットしているので、それを受け取れるように前述のとおりJSTLを有効にしてください。

    > サーブレットからjspへ渡す処理は一覧画面を構築する際に使用しましたが、jspからjspへ渡す場合も同じような処理が必要になるのでしょうか?

    JSPからJSPに渡すというのがどういう操作のことを指しているのか分からないので明言はできませんが、
    セッションスコープに保存しておけば、サーブレットやJSPの間で値を連携することができます。

    キャンセル

  • 2016/04/10 23:41

    読み直してみたら問題点が違っていたようなので、追記しました。

    キャンセル

  • 2016/04/10 23:45

    taglibの宣言を追加してJSTLを使えるようにしましたが変化がありません・・・

    >JSPからJSPに渡すというのがどういう操作のことを指しているのか分からないので明言はできませんが、
    セッションスコープに保存しておけば、サーブレットやJSPの間で値を連携することができます。

    一覧のJSPから更新のJSPという意味合いでした。
    値を連携するにはそれぞれのJSPに対しサーブレットから値を渡せるようにするのでしょうか、

    listDao daoArray = new listDao();
    ArrayList<Listinfo> listInfo = daoArray.findAll(null);
    request.setAttribute("list", listInfo);
    request.getRequestDispatcher("/WEB-INF/jsp/list.jsp").forward(request, response);
    //list.jspへ

    listDao daoArray = new listDao();
    ArrayList<Listinfo> listInfo = daoArray.findAll(null);
    request.setAttribute("list", listInfo);
    request.getRequestDispatcher("/WEB-INF/jsp/list.jsp").forward(request, response);
    request.getRequestDispatcher("/WEB-INF/jsp/detail.jsp").forward(request, response);
    //list.jspとdetail.jspへ

    のように書き換えればよいのでしょうか?

    ><c:で始まるタグはJSTLのものなので、JSTLを使えるようにしなければ、サーブレットから引き継いだ変数listが使えるようになりません。
    なので、taglibを宣言してJSTLを使えるようにすれば良いはずです。

    入力のJSPの氏名の部分ですが、<c:で始まるタグを用いていないのも値が初期値にならない理由なんでしょうか?

    キャンセル

  • 2016/04/11 00:12

    > taglibの宣言を追加してJSTLを使えるようにしましたが変化がありません・・・

    taglibはJSTLを使う上での大前提の話なので、それだけでできるようになるかどうかは分かりません。
    一覧の方はそれ無しで動いていたとしたら、それは謎です。
    何か設定などが違うのかもしれませんが、そこはいったん置いておきましょう。


    > 入力のJSPの氏名の部分ですが、<c:で始まるタグを用いていないのも値が初期値にならない理由なんでしょうか?

    一覧JSPの方のtmpは、<c:forEach var="tmp" items="${list}"> のところで
    listの各要素を取り出した内容が入るというように宣言されているので使えるはずですが、
    更新JSPの方ではいきなりtmpが出てきているのでそこには何も入っていないのです。


    > 値を連携するにはそれぞれのJSPに対しサーブレットから値を渡せるようにするのでしょうか、

    DetailServletでは、このようにします。

    ・同時に2つにディスパッチはできないので、detail.jspだけにします。
    ・DAOはfindAllだけでなく、findByIdというメソッドを追加して、ひとつのユーザーだけを取り出せるようにしたほうが良いですね。

    listDao dao = new listDao();
    Listinfo userInfo = dao.findById(id); // idはリクエストパラメーターから取得
    request.setAttribute("tmp", userInfo);
    request.getRequestDispatcher("/WEB-INF/jsp/detail.jsp").forward(request, response);


    それと、DTOのListinfoは名前が分かりにくいですね。ListInfoが表しているのはリストでは無くユーザー1人の情報なのですから。
    Userか、せめてUserInfoにしたほうが良いでしょう。

    キャンセル

  • 2016/04/13 01:07

    間が空いてしまい申し訳ありません。
    コメントの追記を拝見しました。

    今やっているのは課題として要件をこなさなければならないものでしてサーブレットを規定以上に増やせないんです・・・
    なのでどうしても今あるものに書き加えて完成させたいです。

    それから
    listDao dao = new listDao();
    Listinfo userInfo = dao.findById(id); // idはリクエストパラメーターから取得
    request.setAttribute("tmp", userInfo);
    request.getRequestDispatcher("/WEB-INF/jsp/detail.jsp").forward(request, response);
    というのはDetailのサーブレットのdoGetメゾットに追加して、
    // idはリクエストパラメーターから取得
    というのは同じくDetailにあるdoPostメソッドから取得する、ということでよろしいんでしょうか?
    今このように追加してみているのですが、
    dao.findById(id);
    の(id)に、idを変数に解決できません、と出てしまいます。
    コードの書き方はこれであっているでしょうか?

    キャンセル

  • 2016/04/13 01:29

    なるほど、課題の要件なのですね。

    そうなると却って難しくなりますね。
    とりあえず今コメントいただいているところから片づけていきましょうか。

    > // idはリクエストパラメーターから取得
    > というのは同じくDetailにあるdoPostメソッドから取得する、ということでよろしいんでしょうか?

    そうです。


    > 今このように追加してみているのですが、
    > dao.findById(id);
    > の(id)に、idを変数に解決できません、と出てしまいます。
    > コードの書き方はこれであっているでしょうか?

    いいえ、そこはfindByIdメソッドをlistDaoクラスに追加しないといけません。

    メソッドも追加できないとなると...正直どういう答えを想定しているのか読めませんが、
    findAllしたリストの中からIDに一致するものをひとつだけ取り出すようにするのかな。

    キャンセル

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

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

関連した質問

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

  • Java

    14073questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

  • MySQL

    5996questions

    MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

  • JSP

    945questions

    JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。