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

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

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

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

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

servlet

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

Q&A

3回答

10455閲覧

データベースを利用した条件分岐

退会済みユーザー

退会済みユーザー

総合スコア0

JSP

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Java

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

servlet

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

0グッド

0クリップ

投稿2017/05/11 04:57

###前提・実現したいこと
初めて利用させていただきます。Java独学中のものです。

データベースを利用した条件分岐に関して質問させて頂きます。

仮にAとBというテーブルがあって、Yさんの登録状況としては、テーブルAにレコードが存在しておりAにはユーザーIDやパスワード、その他個人情報が格納されています。
テーブルBには、とあるシステムの設定値が格納することになっており、未だYさんのレコードはB側に存在しておらず、Yさんはログイン画面内のログインボタン押下後、ログイン先の新規登録画面で登録するといった形式です。

その際、既にB側にレコードを持つユーザーのログインの場合は、A側とB側に共通するユーザーIDをif文の条件に指定してequalsで比較し、それに加えログイン画面にて入力されたユーザーIDとパスワードをパラメータで引っ張ってきて、A側のResultsetの結果と比較したのち、新規登録画面とは別の更新画面へと通すことが出来るのですが、B側にレコードが無いユーザー(先ほどのYさん)をログイン処理にて既登録者とは別画面(B側のテーブルにレコードを追加する新規登録画面)に遷移させたい場合に、どうやっても通すことが出来ません。A側に登録されたIDとパスワードを打ち込み、ログインボタンを押した途端に画面が真っ白になります。スタックトレースも表示されません。

どのような条件を与えてやれば、フォワードを用いて既登録者とは別画面へ遷移させることが出来るでしょうか?
よろしくお願いします。

###発生している問題・エラーメッセージ

エラーメッセージ

###該当のソースコード

public class Login extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String ID = request.getParameter("ID"); //ログイン画面を実装したJSPから、パラメータで値を引っ張ってくる。 String Pass = request.getParameter("Pass"); Ctrl_M_Dao ctrlDaoInstance = new Ctrl_M_Dao(); List<Serch_Ctrl_M> Ctrl_M_List = ctrlDaoInstance.findAll(ID); //B側のテーブルの値を格納しており、メソッドの呼び出しにて引っ張ってくる配列。 HttpSession session = request.getSession(true); session.setAttribute("ID", ID); Connection connection = null; PreparedStatement ps = null; String url = "jdbc:postgresql://localhost:5432/ログイン処理"; String user = "hoge"; String password = "hoge"; for (Serch_Ctrl_M ctrlInstance : Ctrl_M_List) { String ctrlId = ctrlInstance.getId(); //B側のテーブルの値をctrlID変数に格納。 try { Class.forName("org.postgresql.Driver"); connection = DriverManager.getConnection(url, user, password); String login = "Select user_id, password From A Where user_id=?"; //入力されたIDで紐づけて検索をかける。 ps = connection.prepareStatement(login); ps.setString(1, ID); ResultSet rs = ps.executeQuery(); while (rs.next()) { String id = rs.getString("user_id"); String pass = rs.getString("password"); //ログイン判定処理 if(request.getParameter("button") != null && id.equals(ID) pass.equals(Pass) && ctrlId.equals(ID)) { //ログインボタンが押され、尚且つ入力されたパスとA側に格納されたパス //が正しい場合、尚且つB側のIDと入力されたIDが等しい場合に更新画面へ。 RequestDispatcher dispatcher = request.getRequestDispatcher("koshin.jsp") dispatcher.forward(request, response); } else { RequestDispatcher dispatcher = request.getRequestDispatcher("shinki.jsp"); //それ以外は新規登録画面へ。 dispatcher.forward(request, response); } } //以下、例外処理へ。

###試したこと
nullや空文字や、.lengthなどによる比較。

###補足情報(言語/FW/ツール等のバージョンなど)
java,jsp,servlet,eclipse4.6,postgreSQL

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

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

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

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

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

guest

回答3

0

デバックされてますか?
おそらく

for (Serch_Ctrl_M ctrlInstance : Ctrl_M_List) {

が空のコレクションか

while (rs.next()) {

がfalseだとforwardされないので、
何もでない画面になるかと思います。

投稿2017/05/11 07:58

szk.

総合スコア1400

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

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

退会済みユーザー

退会済みユーザー

2017/05/11 11:43

rs.next()は真偽値を返すのでしたね。値を取得出来ない場合は、nullや空文字を返すものと思い込んでいました。根本的な箇所を失念していたようです。 お忙しいところのご回答、感謝申し上げます。
guest

0

YさんのようにテーブルAにユーザIDやパスワードの情報が含まれているが、テーブルBには情報が無い場合には、以下のような処理の流れになるのではないでしょうか?

1.[ログイン画面]テーブルAの情報を使って、Yさんを認証する。
2.テーブルBにYさんのユーザIDが含まれているかどうか確認する。
3.テーブルBにYさんのユーザIDが含まれていなければ、テーブルBにデータを追加するための画面に移行して、YさんのデータをテーブルBに登録する。

これでは問題がありますか?

投稿2017/05/11 07:43

coco_bauer

総合スコア6915

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

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

退会済みユーザー

退会済みユーザー

2017/05/11 11:43

ご回答ありがとうございます。 はい。正しく、その通りです。 もう一度、組みなおしてみようと思います。 お忙しいところ、ご回答に感謝申し上げます。また、お教え頂ければ幸いです。
guest

0

ctrlDaoInstance.findAll(ID);
がテーブルBからIDの一致するデータを返す物と推測の上で……

YさんはテーブルBにデータが無いわけですから上記処理で一つもデータが取れず、空のリストが返ってきているのではないでしょうか?
そのためfor文の中は実行されず
ログイン判定も行われていないのだと思います。

投稿2017/05/11 07:01

fcrow

総合スコア96

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

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

退会済みユーザー

退会済みユーザー

2017/05/11 11:43

ご推測の通り、IDと一致するデータを返すものであります。 改めて、文章化されたものを見てみると、どうやら私はお門違いな処理を行っていたようですね。 お恥ずかしい限りです。 ご回答に感謝申し上げます。
fcrow

2017/05/11 13:27

coco_bauerさんが実装イメージを既に提示されているので 質問内容からは脱線しますが、推測に関する余談を一つ。 DAOで findAll というメソッドを実装する場合、その名が示す通り(すべてを見つける) DAOに関連するテーブルの全レコードをとってくるような実装にすることが一般的です(つまり引数なしのメソッドになる)。 今回のケースならば findById (IDで探す)といったような名前を付けると適切かと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問