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

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

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

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

4回答

4653閲覧

顧客登録の更新処理によるformの値をintに変換

ryoga4869

総合スコア17

Java

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

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2019/07/19 04:55

編集2022/01/12 10:55

顧客登録画面の更新処理を作成しております。
顧客データの一覧をjspで表示し一覧のレコード横にある更新ボタンの押下でレコードのIDを取得しUpdate.java(servlet)でIDのレコードformに初期値として表示し、更新の処理をしようとしております。
DB接続は全てDAOクラスに一任しております。

Update.java

package servlet; import java.io.IOException; import java.util.List; import javax.servlet.RequestDispatcher; 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 model.GetMutterListLogic; import model.GetSelectUpListLogic; import model.Mutter; import model.PostUpLogic; @WebServlet("/Update") public class Update extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //SelectUprListを取得しリクエストスコープへ保存 GetSelectUpListLogic getSelectUpListLogic = new GetSelectUpListLogic(); List<Mutter> selectUpList = getSelectUpListLogic.execute(); request.setAttribute("selectUpList", selectUpList); //MutterList(全件)を取得しリクエストスコープへ保存 GetMutterListLogic getMutterListLogic = new GetMutterListLogic(); List<Mutter> mutterList = getMutterListLogic.execute(); request.setAttribute("mutterList", mutterList); //フォワード RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/update.jsp"); dispatcher.forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { int id = 0; String str = request.getParameter("id"); id = Integer.parseInt(str); //リクエストパラメータを取得 request.setCharacterEncoding("UTF-8"); int id = request.getParameter("id"); String name = request.getParameter("name"); String tel = request.getParameter("tel"); String gender = request.getParameter("gender"); //更新リストに追加 Mutter mutter = new Mutter(id, name, tel, gender); PostUpLogic postUpLogic = new PostUpLogic(); postUpLogic.execute(mutter); //MutterList(全件)を取得しリクエストスコープへ保存 GetMutterListLogic getMutterListLogic = new GetMutterListLogic(); List<Mutter> mutterList = getMutterListLogic.execute(); request.setAttribute("mutterList", mutterList); //フォワード RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/main.jsp"); dispatcher.forward(request, response); } }

MutterDAO.java

package DAO; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; import model.Mutter; public class MutterDAO { //データベース接続に使用する情報 private final String JDBC_URL ="jdbc:h2:tcp://localhost/~/kadai/kadai"; private final String DB_USER = "sa"; private final String DB_PASS = " "; public List<Mutter> findAll() { List<Mutter> mutterList = new ArrayList<>(); //データベースへ接続 try { Connection conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS); //select文を追加 String sql = "SELECT ID, NAME, TEL, GENDER FROM MUTTER ORDER BY ID DESC"; PreparedStatement pStmt = conn.prepareStatement(sql); //select文を実行し、結果表を取得 ResultSet rs = pStmt.executeQuery(); //結果表に格納されたレコードの内容を //Mutterインスタンスに設定し、ArrayListインスタンスに追加 while (rs.next()) { int id = rs.getInt("ID"); String name = rs.getString("NAME"); String tel = rs.getString("TEL"); String gender = rs.getString("GENDER"); Mutter mutter = new Mutter(id, name, tel, gender); mutterList.add(mutter); } } catch (SQLException e) { e.printStackTrace(); return null; } return mutterList; } public boolean create(Mutter mutter) { //データベースへ接続 try { Connection conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS); //INSERT文の準備 String sql = "INSERT INTO MUTTER(NAME, TEL, GENDER) VALUES (?, ?, ?)"; PreparedStatement pStmt = conn.prepareStatement(sql); //INSERT文中の「?」に使用する値を設定しSQLを完成 pStmt.setString(1, mutter.getName()); pStmt.setString(2, mutter.getTel()); pStmt.setString(3, mutter.getGender()); //INSERT文を実行(resultには追加された行数が代入される) int result = pStmt.executeUpdate(); if (result !=1) { return false; } } catch (SQLException e) { e.printStackTrace(); return false; } return true; } public boolean update(Mutter mutter) { //データベースへ接続 try { Connection conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS); //INSERT文の準備 String sql = "UPDATE MUTTER SET NAME=?, TEL=?, GENDER=? WHERE ID=?"; PreparedStatement pStmt = conn.prepareStatement(sql); //UPDATE文中の「?」に使用する値を設定しSQLを完成 pStmt.setString(1, mutter.getName()); pStmt.setString(2, mutter.getTel()); pStmt.setString(3, mutter.getGender()); //INSERT文を実行(resultには追加された行数が代入される) int result = pStmt.executeUpdate(); if (result !=1) { return false; } } catch (SQLException e) { e.printStackTrace(); return false; } return true; } public List<Mutter> findOne() { List<Mutter> selectUpList = new ArrayList<>(); //データベースへ接続 try { Connection conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS); //select文を追加 String sql = "SELECT * FROM MUTTER WHERE ID=?"; PreparedStatement pStmt = conn.prepareStatement(sql); //select文を実行し、結果表を取得 ResultSet rs = pStmt.executeQuery(); //結果表に格納されたレコードの内容を //Mutterインスタンスに設定し、ArrayListインスタンスに追加 rs.next(); int id = rs.getInt("ID"); String name = rs.getString("NAME"); String tel = rs.getString("TEL"); String gender = rs.getString("GENDER"); Mutter mutter = new Mutter(id, name, tel, gender); selectUpList.add(mutter); } catch (SQLException e) { e.printStackTrace(); return null; } return selectUpList; } }

Mutter.java(Model)

package model; import java.io.Serializable; public class Mutter implements Serializable { private int id; //id private String name; //名前 private String tel; //電話番号 private String gender; //性別 public Mutter(){} public Mutter(String name, String tel, String gender){ this.name = name; this.tel = tel; this.gender = gender; } public Mutter(int id, String name, String tel, String gender) { this.id = id; this.name = name; this.tel = tel; this.gender = gender; } public Mutter(int id) { this.id = id; } public int getId() { return id; } public String getName() { return name; } public String getTel() { return tel; } public String getGender() { return gender; } }

Update.javaで取得したIDをintに変換処理をしていますが
int id = request.getParameter("id");
に、エラーが出て直りません。。。
Stringからintへの変換処理に問題があるのでしょうか?
それとも他に間違った箇所があるのでしょうか?
IDによるレコードの取得もできておりません。
分かりにくい文章ではありますがご教授願います。

質問の追記です。
servletを以下のように変更した場合java.lang.NumberFormatExceptionのエラーが投げられます。
IDはAuto-incrementで生成しているので整数以外の文字列は反映されないはずなのですが...

package servlet; import java.io.IOException; import java.util.List; import javax.servlet.RequestDispatcher; 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 model.GetMutterListLogic; import model.GetSelectUpListLogic; import model.Mutter; import model.PostUpLogic; @WebServlet("/Update") public class Update extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //リクエストパラメータの戻り値の型を変更 request.setCharacterEncoding("UTF-8"); String str = request.getParameter("id"); int id = Integer.parseInt(str); //SelectUprListを取得しリクエストスコープへ保存 GetSelectUpListLogic getSelectUpListLogic = new GetSelectUpListLogic(); List<Mutter> selectUpList = getSelectUpListLogic.findOne(id); request.setAttribute("selectUpList", selectUpList); //MutterList(全件)を取得しリクエストスコープへ保存 GetMutterListLogic getMutterListLogic = new GetMutterListLogic(); List<Mutter> mutterList = getMutterListLogic.execute(); request.setAttribute("mutterList", mutterList); //フォワード RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/update.jsp"); dispatcher.forward(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //リクエストパラメータを取得 request.setCharacterEncoding("UTF-8"); String str = request.getParameter("id"); int id = Integer.parseInt(str); String name = request.getParameter("name"); String tel = request.getParameter("tel"); String gender = request.getParameter("gender"); //更新リストに追加 Mutter mutter = new Mutter(id, name, tel, gender); PostUpLogic postUpLogic = new PostUpLogic(); postUpLogic.execute(mutter); //MutterList(全件)を取得しリクエストスコープへ保存 GetMutterListLogic getMutterListLogic = new GetMutterListLogic(); List<Mutter> mutterList = getMutterListLogic.execute(); request.setAttribute("mutterList", mutterList); //フォワード RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/main.jsp"); dispatcher.forward(request, response); } }

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

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

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

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

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

ryoga4869

2019/07/19 07:04

はい。他の方から教えて頂いた意見も参考にし解決できました。
m.ts10806

2019/07/19 07:06

他の方・とはいってもその質問には私一人しかコメントしてませんが・・
ryoga4869

2019/07/19 07:10

リアルの先輩?にも助けを頂きました。
m.ts10806

2019/07/19 07:24

そのあたり含めて当該質問の回答にどのように解決したか具体的に記載してください。 あとできれば問題は1つ1つ着実に解決していくようにしてください。 https://teratail.com/help/question-tips#questionTips4-2 あれも気になるこれも気になるでは頭がスパゲティ状態になって整理不可となるので。 言っては何ですが、あまり進んでる感がないので・・
ryoga4869

2019/07/19 07:38

申し訳ございません。すでにスパゲッティでした。 作業も進んでは戻ってを繰り返してしまっていて。。。 1つ1つ解決できるよう気をつけます。
m.ts10806

2019/07/19 07:40

コメントを返しています。このままの状態で質問を続ける限り、回答し続けてくれる人はどんどん減ると思います(「納期」とか質問サイトにおける具体的なNGワード出してしまってますし)
guest

回答4

0

int id = request.getParameter("id");の手前でやってる処理のようにしましょう。

Java

1String str = request.getParameter("id"); 2int id = Integer.parseInt(str);

getParameterの戻り値の型はStringなので、直接intに代入することはできません。

追記

public List<Mutter> findOne()がどこから呼ばれているか分からないんですが、
まずはこのメソッドを、public List<Mutter> findOne(int id)に直しましょう
そして、内容を以下のようにしましょう。

Java

1//select文を追加 2String sql = "SELECT * FROM MUTTER WHERE ID=?"; 3PreparedStatement pStmt = conn.prepareStatement(sql); 4pStmt.setInt(1, id); // ここを追記。「パラメータ "#1" がセットされていません」はおそらくこれがないためかと思われます。 5 6//select文を実行し、結果表を取得 7ResultSet rs = pStmt.executeQuery();

そして呼び出し時に、リクエストから取得したidを渡して呼びましょう。

Java

1String str = request.getParameter("id"); 2int id = Integer.parseInt(str); 3mutterDao.findOne(id);

投稿2019/07/19 05:01

編集2019/07/19 05:29
root_jp

総合スコア4666

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

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

ryoga4869

2019/07/19 05:12

回答ありがとうございます。 そのように修正しましたらエラーは無くなりました。 ですが、更新ボタンを押しても初期値が設定されず、コンソールには パラメータ "#1" がセットされていません という表示が出ています。 selectの処理がうまく行っていないというよりはIDを取得できていないのでしょうか?
root_jp

2019/07/19 05:28

追記しました。
ryoga4869

2019/07/19 05:57

DAOの呼び出しは別ファイルにある場合、 servletからrequestを使用しIDを送る必要があるという事でしょうか?
guest

0

Java

1String sql = "UPDATE MUTTER SET NAME=?, TEL=?, GENDER=? WHERE ID=?";

?は4つ これは「4つパラメータが必要」ということを指します。

パラメータをセットしている箇所は下記

Java

1 //UPDATE文中の「?」に使用する値を設定しSQLを完成 2 pStmt.setString(1, mutter.getName()); 3 pStmt.setString(2, mutter.getTel()); 4 pStmt.setString(3, mutter.getGender()); 5 6 //INSERT文を実行(resultには追加された行数が代入される) 7 int result = pStmt.executeUpdate(); 8

3つしかセットしていませんね。
足りていません。

設置したパラメータの数と渡す数は合わせてください。

findOne()でも同じ現象が起きています。

投稿2019/07/19 05:23

m.ts10806

総合スコア80765

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

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

ryoga4869

2019/07/19 05:28

納得致しました。 ?の数値が分からなければSQLも実行できませんよね。。 大事なことを見落としておりました。
m.ts10806

2019/07/19 05:37

違いますよ。 「箱を4つ用意しているのに3つまでしか荷物が入っていません」という意味ですよ。
ryoga4869

2019/07/19 05:43

そうなんですね。 てっきり3つの箱までは埋まっていて最後の?のみからの状態だと思っておりました。
m.ts10806

2019/07/19 05:49

ちょっと意味が分かりません。
tetutetu

2019/07/19 05:50

箱(=?)で例えるのであれば 4つ目の箱に入れる荷物がない(何を入れればいいか分からない) から実行できないよ といったニュアンスかと 入れる数値が分からない、といった意味では別に質問者様の解釈でもいいような気もしますが…
tetutetu

2019/07/19 05:52

(14:43投稿のものに関してではなく、14:28投稿のものに関しての言及です)
m.ts10806

2019/07/19 05:58

了解です。ちょっと表現理解に柔軟性が欠けておりました。
guest

0

ちょっと混乱しているようですね。
今のエラーは、変換できないエラーじゃないのでは?

java

1int id = 0; 2String str = request.getParameter("id"); 3id = Integer.parseInt(str); 4 5 6//リクエストパラメータを取得 7request.setCharacterEncoding("UTF-8"); 8int id = request.getParameter("id");

変換のしかたは、Integer.parseIntで合っています。

int idが、2回定義されているのでエラーになっているものと思われます。

投稿2019/07/19 05:07

momon-ga

総合スコア4820

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

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

ryoga4869

2019/07/19 05:14

おっしゃる通りでした。。。 別の方の回答にあるよう修正しましたら無事エラーが無くなりました。
guest

0

コメントを受けて追記

SQL文の実行前に引数を利用しservlet側から?に当てはまるIDを取得

その流れになります。update(Mutter mutter)内では、mutterを引数として受け取り
PreparedStatement(sql文内の「?」)の1,2,3番目にそれぞれ
mutterから取り出した name,tel,genderを入れることが出来ています。
後は同じ書き方で、4番目にidを入れる必要があります。

Stringからintへの変換処理に問題があるのでしょうか?

記述内ではint id = request.getParameter("id")では、そもそも変換処理を行っていません。
ただInt型の変数にString型の文字列を入れようとしている状態です。Integer.parseInt()でrequest...を囲うことでStringをIntに変換できます。
また、数行上ですでに、Int型変数 idに一度request.getParameter("id")をStringで受けた後に変換する形で代入できています。
解消する方法としては、数行上の記述を消し
int id = Integer.parseInt(request.getParameter("id");
に変更する、もしくは
現在エラーを吐いている
int id = request.getParameter("id");
を消すかのどちらかです。

IDによるレコードの取得もできておりません

findOne()メソッドに引数がなく、PreparedStatementに値をセットしていない(引数がないため前のページから何も受け取っていない上に、セットする記述もない)ためです。

投稿2019/07/19 05:06

編集2019/07/19 05:29
tetutetu

総合スコア419

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

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

ryoga4869

2019/07/19 05:23

適切な修正方法を教えて頂き有難うございます。 前者の問題については無事解決することが出来ました。 IDによるレコードの取得については SQL文の実行前に引数を利用しservlet側から?に当てはまるIDを取得するのでしょうか?調べても出てこなかったので教えて頂きたいです。
tetutetu

2019/07/19 05:30

既にほぼ解決に至っているような気もしますが、追記しました。
ryoga4869

2019/07/19 05:46

丁寧な解説ありがとうございます。 なぜ必要なのか理解させていただきました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問