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

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

新規登録して質問してみよう
ただいま回答率
85.48%
MySQL

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

JSP

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

Java

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

Q&A

1回答

12687閲覧

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

manmos

総合スコア55

MySQL

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

JSP

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

Java

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

0グッド

0クリップ

投稿2016/04/10 05:55

編集2016/04/10 07:02

質問です。

現在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文処理の部分はまだ用意してないです。

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

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

argius

2016/04/10 06:03

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

回答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 06:54

編集2016/04/10 14:40
argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

manmos

2016/04/10 10:12

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

2016/04/10 10:45

ちょっと見逃していたところがあったので、少し訂正を含めてコメントします。 現状は、回答に書いたtaglib宣言が足りないだけだと思います。 <c:で始まるタグはJSTLのものなので、JSTLを使えるようにしなければ、サーブレットから引き継いだ変数listが使えるようになりません。 なので、taglibを宣言してJSTLを使えるようにすれば良いはずです。 > サーブレットから値を渡すというと一番上の一覧画面のjspにて使用しているtmpの部分のようなものでしょうか? ここではlistの方ですね。サーブレットでは、 request.setAttribute("list", listInfo); としてセットしているので、それを受け取れるように前述のとおりJSTLを有効にしてください。 > サーブレットからjspへ渡す処理は一覧画面を構築する際に使用しましたが、jspからjspへ渡す場合も同じような処理が必要になるのでしょうか? JSPからJSPに渡すというのがどういう操作のことを指しているのか分からないので明言はできませんが、 セッションスコープに保存しておけば、サーブレットやJSPの間で値を連携することができます。
argius

2016/04/10 14:41

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

2016/04/10 14: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:で始まるタグを用いていないのも値が初期値にならない理由なんでしょうか?
argius

2016/04/10 15: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にしたほうが良いでしょう。
manmos

2016/04/12 16: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を変数に解決できません、と出てしまいます。 コードの書き方はこれであっているでしょうか?
argius

2016/04/12 16:29

なるほど、課題の要件なのですね。 そうなると却って難しくなりますね。 とりあえず今コメントいただいているところから片づけていきましょうか。 > // idはリクエストパラメーターから取得 > というのは同じくDetailにあるdoPostメソッドから取得する、ということでよろしいんでしょうか? そうです。 > 今このように追加してみているのですが、 > dao.findById(id); > の(id)に、idを変数に解決できません、と出てしまいます。 > コードの書き方はこれであっているでしょうか? いいえ、そこはfindByIdメソッドをlistDaoクラスに追加しないといけません。 メソッドも追加できないとなると...正直どういう答えを想定しているのか読めませんが、 findAllしたリストの中からIDに一致するものをひとつだけ取り出すようにするのかな。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問