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

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

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

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

Q&A

解決済

1回答

1681閲覧

登録と一覧表示の機能の作成

ryoga4869

総合スコア17

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

0グッド

0クリップ

投稿2019/07/11 06:26

編集2019/07/11 07:49

顧客登録画面の作成途中で新規の登録と登録した内容をデータベース(以下 DB)からSELECTし一覧表示させたいです。
下記にコードを示していますがmain.jspで画面の表示をしています。
が、DBの内容一覧が表示されません。
新規登録のボタンも押下することで404のページに移動し原因は記載されていません。
DBの内容をデフォルトパッケージを利用し取り出すことは出来ました。
(javaアプリケーション内)
jspでのListの取り出し方や変数の置き方が間違っているのでしょうか?
コードが長く読みずらいとは思いますが、ご教授願います。

Mutter.java

1package model; 2 3import java.io.Serializable; 4 5public class Mutter implements Serializable { 6 private int id; //id 7 private String name; //名前 8 private String tel; //電話番号 9 private String gender; //性別 10 11 public Mutter(){} 12 public Mutter(String name, String tel, String gender){ 13 this.name = name; 14 this.tel = tel; 15 this.gender = gender; 16 } 17 public Mutter(int id, String name, String tel, String gender) { 18 this.id = id; 19 this.name = name; 20 this.tel = tel; 21 this.gender = gender; 22 } 23 public int getId() { return id; } 24 public String getName() { return name; } 25 public String getTel() { return tel; } 26 public String getGender() { return gender; } 27}

Main.java

1package servlet; 2 3import java.io.IOException; 4import java.util.List; 5 6import javax.servlet.RequestDispatcher; 7import javax.servlet.ServletException; 8import javax.servlet.annotation.WebServlet; 9import javax.servlet.http.HttpServlet; 10import javax.servlet.http.HttpServletRequest; 11import javax.servlet.http.HttpServletResponse; 12 13import model.GetMutterListLogic; 14import model.Mutter; 15import model.PostMutterLogic; 16 17@WebServlet("/Main") 18public class Main extends HttpServlet { 19 private static final long serialVersionUID = 1L; 20 21 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 22 //MutterList(全件)を取得しリクエストスコープへ保存 23 GetMutterListLogic getMutterListLogic = new GetMutterListLogic(); 24 List<Mutter> mutterList = getMutterListLogic.execute(); 25 request.setAttribute("mutterList", mutterList); 26 27 //フォワード 28 RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/main.jsp"); 29 dispatcher.forward(request, response); 30 } 31 protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 32 //リクエストパラメータを取得 33 request.setCharacterEncoding("UTF-8"); 34 String name = request.getParameter("name"); 35 String tel = request.getParameter("tel"); 36 String gender = request.getParameter("gender"); 37 38 //登録リストに追加 39 Mutter mutter = new Mutter(name, tel, gender); 40 PostMutterLogic postMutterLogic = new PostMutterLogic(); 41 postMutterLogic.execute(mutter); 42 43 //MutterList(全件)を取得しリクエストスコープへ保存 44 GetMutterListLogic getMutterListLogic = new GetMutterListLogic(); 45 List<Mutter> mutterList = getMutterListLogic.execute(); 46 request.setAttribute("mutterList", mutterList); 47 48 //フォワード 49 RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/main.jsp"); 50 dispatcher.forward(request, response); 51 } 52 }

main.jsp

1<%@ page import="servlet.Main" language="java" contentType="text/html; charset=UTF-8" 2 pageEncoding="UTF-8" %> 3<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> 4<%@ taglib prefix="sql" uri="http://java.sun.com/jsp/jstl/sql" %> 5<%@ page import="model.Mutter,java.util.List" %> 6<% 7 //リクエストスコープに保存されたMutterリストを取得 8 List<Mutter>mutterList= (List<Mutter>)request.getAttribute("mutterList"); 9%> 10 <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> 11 <html lang="ja"> 12 13 <head> 14 <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 15 <title>『お客様情報』登録画面</title> 16 17 --<中略>-- 18 19 </head> 20 <body> 21 <div id="header"> 22 <h1>『お客様情報』登録画面</h1> 23 </div> 24 <form method="post" action="Main.java"> 25 <table class="up"> 26 <tr> 27 <th>NO.</th> 28 <th>お名前</th> 29 <th>携帯電話番号</th> 30 <th>性別</th> 31 <th class="hide"></th> 32 </tr> 33 <tr> 34 <td><input type="number" name="id" value=" " disabled="disabled" style=background-color:#ffe0ed ></td> 35 <td><input type="text" maxlength="20" name="name" placeholder="20字以内で名前を入力"></td> 36 <td><input type="tel" name="tel" pattern="[0-9]{3}-[0-9]{4}-[0-9]{4}" placeholder="090-1234-5678(半角数字で入力)"></td> 37 <td><select name="gender"> 38 <option value=""> </option> 39 <option value="1">男性</option> 40 <option value="2">女性</option> 41 <option value="3">その他</option></select></td> 42 <td><input type="submit" value="新規登録" style="border:2px solid #7b3cff; background-color:#ffd700" onmouseover="this.style.background='#ffff00'" onmouseout="this.style.background='#ffd700'" onclick="location:href='./Main.java'" class="up-butt"></td> 43 </tr> 44 <tr><td align="left" style="border:2px solid #fcc2c8; background-color:#ffe0ed; color:#ff69b4; font-size: 20px" colspan="4"> メッセージ:</td> 45 </tr> 46 </table> 47 <table class="dow"> 48 <thead> 49 <tr> 50 <th>NO.</th> 51 <th>お名前</th> 52 <th>携帯電話番号</th> 53 <th>性別</th> 54 <th class="hide"></th> 55 </tr> 56 </thead> 57 <tbody> 58 <c:forEach var="mutterList" items="${mutterList}"> 59 <tr> 60 <td><c:out value="${mutter.id}" /></td> 61 <td><c:out value="${mutter.name}"/></td> 62 <td><c:out value="${mutter.tel}"/></td> 63 <td><c:out value="${mutter.gender}"/></td> 64 <td><input type="submit" value="更新" style="border:2px solid #00ff00; background-color:#32cd32" onmouseover="this.style.background='#00ff00'" onmouseout="this.style.background='#32cd32'" onclick="location:href='./Update.java'"class="update" name="update"> </td> 65 <td><input type="submit" value="削除" style="border:2px solid #ff0000; background-color:#ff6347" onmouseover="this.style.background='#ff0000'" onmouseout="this.style.background='#ff6347'" onclick="location:href='./.delete.java'"class="delate" name="delate"></td> 66 </tr> 67 </c:forEach> 68 </tbody> 69 </table> 70 </form> 71 </body> 72 </html>

MutterDAO.java

1package DAO; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8import java.util.ArrayList; 9import java.util.List; 10 11import model.Mutter; 12 13public class MutterDAO { 14 //データベース接続に使用する情報 15 private final String JDBC_URL ="jdbc:h2:tcp://localhost/~/kadai/kadai"; 16 private final String DB_USER = "sa"; 17 private final String DB_PASS = " "; 18 19public List<Mutter> findAll() { 20 List<Mutter> mutterList = new ArrayList<>(); 21 22 //データベースへ接続 23 try (Connection conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS)) { 24 25 //select文を追加 26 String sql = "SELECT ID, NAME, TEL, GENDER FROM MUTTER ORDER BY ID DESC"; 27 PreparedStatement pStmt = conn.prepareStatement(sql); 28 29 //select文を実行し、結果表を取得 30 ResultSet rs = pStmt.executeQuery(); 31 32 //結果表に格納されたレコードの内容を 33 //Mutterインスタンスに設定し、ArrayListインスタンスに追加 34 while (rs.next()) { 35 int id = rs.getInt("ID"); 36 String name = rs.getString("NAME"); 37 String tel = rs.getString("TEL"); 38 String gender = rs.getString("GENDER"); 39 Mutter mutter = new Mutter(id, name, tel, gender); 40 mutterList.add(mutter); 41 } 42 } catch (SQLException e) { 43 e.printStackTrace(); 44 return null; 45 } 46 return mutterList; 47 } 48 49 public boolean create(Mutter mutter) { 50 //データベースへ接続 51 try (Connection conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS)) { 52 53 //INSERT文の準備 54 String sql = "INSERT INTO MUTTER(NAME,TEL,GENDER)VALUES(?, ?, ?)"; 55 PreparedStatement pStmt = conn.prepareStatement(sql); 56 57 //INSERT文中の「?」に使用する値を設定しSQLを完成 58 pStmt.setString(1, mutter.getName()); 59 pStmt.setString(2, mutter.getTel()); 60 pStmt.setString(3, mutter.getGender()); 61 62 //INSERT文を実行(resultには追加された行数が代入される) 63 int result = pStmt.executeUpdate(); 64 if (result !=1) { 65 return false; 66 } 67 } catch (SQLException e) { 68 e.printStackTrace(); 69 return false; 70 } 71 return true; 72 } 73}

GetMutterListLogic.java

1package model; 2 3import java.util.List; 4 5import DAO.MutterDAO; 6 7public class GetMutterListLogic { 8 public List<Mutter> execute() { 9 MutterDAO dao = new MutterDAO(); 10 List<Mutter> mutterList = dao.findAll(); 11 return mutterList; 12 } 13}

PostMutterListLogic.java

1package model; 2 3import DAO.MutterDAO; 4 5public class PostMutterLogic { 6 public void execute(Mutter mutter) { 7 MutterDAO dao = new MutterDAO(); 8 dao.create(mutter); 9 } 10}

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

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

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

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

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

guest

回答1

0

ベストアンサー

404のページに移動し

action="Main.java"

とjavaファイル直に指定しているからです。

サーブレットであればaction指定先は基本は{プロジェクト名}{WebServletの指定}のURLである必要があります。

URLも直書きではなくcontextpathを利用したほうが良いでしょう。
参考:Jsp(Html)からServlet呼び出し(データ渡し)

投稿2019/07/11 06:34

編集2019/07/11 06:47
m.ts10806

総合スコア80850

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

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

ryoga4869

2019/07/11 07:00

分かりやすい回答をありがとうございます。 新規登録押下で404エラーは出なくなったのですが、formへの入力前に戻ってしまいます。一覧の表示もいまだに出来ていません。 これはeclipseやJDBCの設定等にミスがある可能性が高いという事でしょうか?
m.ts10806

2019/07/11 07:09

いえ。コードのミスかと思います。 結局main.jspにフォワードしているので入力前に戻るのは当然ですし(formのsubmitとはそういうものです) まずは入力したデータがきちんと登録されているか、データベースの中身を直接確認してください。 あとはSELECT文ですが、DBに対して直接実行して想定通りの情報が出るか確認してくださいね。見た感じSQLの構文エラーが出るはずです。 SQLException 捉えているのでスタックトレースがコンソールに出力されていると思いますよ。
ryoga4869

2019/07/11 07:23

データベースの内容を確認しましたが登録できておりませんでした。 SELECT文の方は確認できました。ご指摘ありがとうございます。 DBに対して直接実行するという確認方法は今後も使えそうです。 一覧の表示は出来ていないのでデータベースの接続を中心にコードミスを探せばよいでしょうか?
m.ts10806

2019/07/11 07:32

> SELECT文の方は確認できました。ご指摘ありがとうございます。 ん。 > SELECT ID NAME TEL GENDER FROM MUTTER ORDER BY ID DESC これは明らかに構文エラーですよ。カラムの指定は , で区切らないといけません。 > DBに対して直接実行するという確認方法は今後も使えそうです。 JavaからするとDBは外部の仕組みなので、直接実行して想定通りの結果が得られないものは Javaから実行しても結果は得られません。 なので、「直接DBに対して実行して確認ができたSQLをJavaで利用する」という手順を徹底してください。 > 一覧の表示は出来ていないので そもそもデータが登録できてなければ0件なのでjspのforEachは1週も回らないのでは? 登録処理をきちんと完成させましょう。 create()のe.printStackTrace()に何か出力されているのでは?確認してください。 PostMutterLogic.execute()に渡しているmutterがきちんと想定の値を保持しているかとか デバッグしましょう。
ryoga4869

2019/07/11 07:46

すみません。SELECT文については解決できましたの間違いでした。 Javaでの実行方法についてはそのように徹底させていただきます。 Javaからの登録は出来ていないのですが、table作成時に2件ほど初期値?として登録しているものがありますので表示もされるはずなのですが、、 登録について完成させた後で調べておきます。 出力についてと値については確認してみます。 詳細な指示含めありがとうございます。
m.ts10806

2019/07/11 08:03

SELECTのコード修正されてますね。OKです。 つまるところ、プログラムからはどちらも実行できてないということになりそうですね。 怪しいのはここ。 > try (Connection conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS)) { tryの中に式を入れるのってほとんど見ないですけど、これは何を参考にされました?
m.ts10806

2019/07/11 08:06

基本形は下記なのでそもそもtry()となるのがおかしい気がします。 try { } catch(Exception e) { }
ryoga4869

2019/07/11 08:12

はい、そうみたいです。。 そのコードはつぶやきアプリ(つぶやきをデータベースに保存する)といった課題を作成する際に使ったものを参考にしました。 (参考資料:スッキリわかるサーブレット&JSP 入門)
ryoga4869

2019/07/11 08:15

この教材ではデータベースに接続する際、すべてこの処理を使っています。 基本形についても調べてみます。
m.ts10806

2019/07/11 08:19

とりあえず下記にしてみては。 try {   Connection conn = DriverManager.getConnection(JDBC_URL, DB_USER, DB_PASS);
tetutetu

2019/07/11 08:25

try(){ }catch(略 の形式になるのは try-with-resources構文では?別にコレ自体がおかしいわけではないかと。 Java リソースを自動でクローズする(try-with-resources文) https://itsakura.com/java-try-with-resources
m.ts10806

2019/07/11 08:28

tetutetuさん 補足ありがとうございます。 となると、地道にデバッグしていくしかなさそうですね。 SQL自体には問題がなさそうですし。
ryoga4869

2019/07/11 08:28

変更してみましたが、特に何も変わらずでした。。 DBの制約に関しても今一度確認してみます。
tetutetu

2019/07/11 08:46 編集

蛇足ですが DBに正確にレコードが登録されているかどうかは プログラムを手直しするより先に確認したほうが良いかと。 数行プロンプトに打ち込むだけで確認できますし…。 →読解力不足でした。 2件登録されていること自体は確認済みなのですね。 失礼しました。
ryoga4869

2019/07/11 08:48

DBに直接入力した際のレコードは残っています。 JAVAのformから入力した分は残っていません。
tetutetu

2019/07/11 08:57

でしたら、どこまで正常に動作しているか、及びどこまでは正常にデータが取れているのかのデバッグですかね。 そもそも今どこで止まっているのか( e.printStackTrace();でエラー文が出力されているならSQL文がおかしい、executeQuery();の結果が0件だった場合、テーブルの中身がおかしい 等) もしくは while (rs.next()) {}内の rs.getString/Int()で正常に値が取れているかをコンソールに出力してみる等、どこが原因か探ってみては。
m.ts10806

2019/07/11 08:57

各所にprintln()仕込んで通ってる場所を確認するのもありですね。
tetutetu

2019/07/11 09:01

個人的にはBeanのような働きをしている部分の記述が気になりますが… Eclipseならばgetter,setterは自動生成できるので、その方が動作が分かりやすい気はします。
ryoga4869

2019/07/11 09:02

デバッグが正常に作動しないので println()を利用して地道に探してみることにします。。。
tetutetu

2019/07/11 09:17

地道に、というよりdaoの処理まで飛べているのでしたら resultsetの中のどれかを一つ出力してみるだけでどこで異常が起きてるかわかると思いますよ。 上述の通りSQLエラーが出たならそれはそれで。
ryoga4869

2019/07/12 02:19

すみません、出力方法について調べてみたのですが、データベースの変数となるとよくわかりませんでした。。。 宜しければ詳しく教えて頂けないでしょうか?
m.ts10806

2019/07/12 02:21

データベースの変数ではなくあくまで扱っているのはJava内での出来事ですよ。
ryoga4869

2019/07/12 02:24

データベースの内容はデフォルトパッケージで取得できているので、今回の場合ですとjavaでArrayListに置き換えた処理以降でエラーが発生しているという事でしょうか?
tetutetu

2019/07/12 02:35 編集

MutterDAO内のfindAllメソッドで 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); } の部分でデータベースから取得した結果をStringなりintなりに格納していますね。 そのうちのどれかを出力してみてはどうでしょう、という話です。 ・データベースから正常に値が取れているのであれば出力される (つまりここまでは問題なし、この後がおかしい) ・SQLエラーが出るのであればSQL文がおかしい(文自体は問題ないので、テーブル名などを確認しましょう) ・EmptyStringかnull(どっちになるか忘れました、すみません)の場合、DBに登録ができていない ・その他エラーで停止した場合は、その旨がコンソールに出力される のいずれかの結果が得られるはずです。 出力方法ですが、単純に System.out.println(変数名); もしくは System.out.println(rs.getString[もしくはInt]("カラム名")); です。
tetutetu

2019/07/12 02:33

>データベースの内容はデフォルトパッケージで取得できているので、今回の場合ですとjavaでArrayListに置き換えた処理以降でエラーが発生しているという事でしょうか? デフォルトパッケージで取得できている、というのがちょっと良く分かりませんが、ひとまず 現状どこで止まっているのか、質問者様も回答者側も理解できていない状態なのです。 そのため、デバッグツールを用いないのであれば上記の方法などで、どこまでは正常に動作しているのかを確かめる必要があるかと。
ryoga4869

2019/07/12 02:52

>そもそも今どこで止まっているのか( e.printStackTrace();でエラー文が出力されているならSQL文がおかしい、executeQuery();の結果が0件だった場合、テーブルの中身がおかしい 等) コンソールでログを確認しました。JARファイルがクラスパスに登録されていませんでした。(workspaceを変えた際に登録し直すのを忘れておりました) 登録後、実行でデータベースの表示、登録の処理について自分の考えていた正常な動作を確認することが出来ました。 初歩的なミスにお付き合いいただき有難うございました。 今後のエラーでprintを使ったデバッグも試してみます。
m.ts10806

2019/07/12 02:54

解決されたようで何よりです
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問