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

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

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

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

Q&A

2回答

8383閲覧

DAOってどうやってサーブレットに呼び出すのですか

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2019/07/25 02:38

編集2022/01/12 10:55

サーブレットでDAOを呼び出す書式を教えてください
IDとパスワードを打ち込む掲示板においてデータベースにあるIDとパスワードと間違っている場合はログイン出来ずエラーメッセージを表示させたいです
DAO
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.sql.DataSource;
public class indexDAO {
private DataSource source;
private static final String SELECT = "select * from account where user_id = ? user_pass = ? ";
public indexDAO() throws NamingException {
InitialContext context = new InitialContext();
source = (DataSource) context.lookup("");
}
public List<AccountBean> getIndexList() throws SQLException {
List<AccountBean> indexList = new ArrayList<AccountBean>();
Connection connection = source.getConnection();
try {
PreparedStatement statement = connection.prepareStatement(SELECT);
statement.setString(1,"id");
statement.setString(2,"password");
ResultSet result = statement.executeQuery();
while (result.next()) {
AccountBean index = new AccountBean();
index.setId(result.getString("id"));
index.setPassword(result.getString("password"));
indexList.add(index);
}
statement.close();
} catch (SQLException e) {
e.printStackTrace();
} finally {
if (connection != null) {
connection.close();
}
}
return indexList;
}
}
サーブレットのdopostメソッド
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
String id = request.getParameter("userID");
String password = request.getParameter("password");
ArrayList<String> errorList = new ArrayList<String>();
AccountBean account = new AccountBean();
DAO hoge = new DAO();
ArrayList<AccountBean> huga = hoge.select(AccountBean);
//エラーチェック処理
if (!Check.checkBlank(id) || !Check.checkBlank(password)) {
errorList.add("IDとパスワードは必須項目です。");
request.setAttribute("errorList", errorList);
String url = PropertyLoader.getProperty("url.jsp.index");
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
} else if (account != account) {
errorList.add("IDとパスワードが間違っています。");
request.setAttribute("errorList", errorList);
String url = PropertyLoader.getProperty("url.jsp.index");
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
} else {
String url = PropertyLoader.getProperty("url.sb.input");
response.sendRedirect(url);
}
}
}

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

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

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

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

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

m.ts10806

2019/07/25 02:40

それぞれのクラスのコードを提示してください(コードはマークダウンのcode機能を利用して提示してください) また、今提示されているコードでは何が問題なのでしょうか。 DAOが何かわかっていてどのように利用しているのでしょうか。 質問本文を編集して具体的に記載してください
shinami

2019/07/25 02:46

DAOクラスをサーブレットに呼び出すとは? ArrayList<AccountBean>のリストを表示したいという事でしょうか?
退会済みユーザー

退会済みユーザー

2019/07/25 02:51

追記しました見ずらいかもですがよろしくお願いします
m.ts10806

2019/07/25 02:53

タイトル変わってくると思います。 DAOの呼び出し方を聞いているわけではないですよね。
m.ts10806

2019/07/25 04:23

ところでパッケージ名に学校名のようなものでてますが大丈夫ですか? そもそも学校の課題や宿題を代行するサイトではありませんので。
tetutetu

2019/07/25 04:36

(回答時点で全く気付かず、先ほど勝手に検索したところ恐らくエンジニアの育成を行っている会社の教育用システムか何かかと)
m.ts10806

2019/07/25 05:21 編集

tetutetuさん 余計課題っぽいんですよね。回答が無駄にならないといいのですが。 ※ただこれまでの修正依頼のコメントもあまりちゃんと理解されてなさそうなので怪しいです
tetutetu

2019/07/25 05:56

コピペするだけで動作する書き方はしていないので ああ、そういえばあの時こんなこと言ってたな程度に 思い出して貰えるのであれば自分は別にいいかなと考えてます。 code機能は使ってほしいところですが…(数行程度ならともかく)
退会済みユーザー

退会済みユーザー

2019/07/26 08:24

コードが削除されていますね。(履歴みればわかるけど…)
guest

回答2

0

SQL文がおかしいこと、インスタンス化に関してはすでに出ているので、それ以外の点で気付いたところを。

java

1if (!Check.checkBlank(id) || !Check.checkBlank(password)) { 2 errorList.add("IDとパスワードは必須項目です。"); 3 request.setAttribute("errorList", errorList); 4 String url = PropertyLoader.getProperty("url.jsp.index"); 5 RequestDispatcher dispatcher = request.getRequestDispatcher(url); 6 dispatcher.forward(request, response); 7} else if (account != account) { 8 errorList.add("IDとパスワードが間違っています。"); 9 request.setAttribute("errorList", errorList); 10 String url = PropertyLoader.getProperty("url.jsp.index"); 11 RequestDispatcher dispatcher = request.getRequestDispatcher(url); 12 dispatcher.forward(request, response); 13} else { 14 String url = PropertyLoader.getProperty("url.sb.input"); 15 response.sendRedirect(url); 16}

・直さないと動作しない部分
IDとパスワードの一致判定をする際に
if (account != account) という記述をされていますが
同じ式を比較(しかも!=で)という、意味のない行動になっています。
しかも、現状accountの中身は初期化されただけで何も中身がありません。

~~
前ページでユーザが入力したID、パスワードをAccountBeanに格納(例:account1)
DAOからの戻り値(後述の通り、AccountBean型に変更することを推奨)を格納(例:account2)
とし、account1とaccount2を比較することで、ログインチェックが行えます。
~~
上記間違ってたので修正。
前ページでユーザが入力したID、パスワードをAccountBeanに格納。
DAOからの戻り値から値を取り出せた場合(ID等がnullでなかったら)ログイン可 ですかね。

もう1点、hoge.select(AccountBean);という記述ですが
「hogeという名前でインスタンス化した(index)DAOの「select」というメソッドの処理をしてね。」
という記述になります。
現状indexDAOの中にselectメソッドがないため、恐らく動作しません。
また、()内には引数が入りますが、引数の型が入っています。
こちらも修正が必要です。

・別に直さなくても動作はする部分
エラーが出た際にStringのリスト、errorListにエラーメッセージを格納していますが
現在の仕様だとエラーメッセージは一つしか入りませんよね。
それならStringをそのままsetしてしまえばよいのでは。

仮に今後エラーが複数同時に出ることを想定するのであれば、上記の仕様で構いませんが
String url = PropertyLoader.getProperty("url.jsp.index");
RequestDispatcher dispatcher = request.getRequestDispatcher(url);
dispatcher.forward(request, response);
(ファイル名から判断がつかないためエラーが出た際にそれ用のページに飛ぶ処理、と認識しています)
上記3行が既に重複しています。想定するエラーが増えた場合、さらにこの記述が増えるのでしょうか。
ログイン不可能なエラーが出た際に立つフラグ等を用意した方が
可読性、保守性が上がるものと思われます。

同様に、ログインチェックの際の戻り値にもリストを使用されていますが
(return indexList;)
ログインの際であれば1人しかselectされることはありえないため(2人以上selectされた場合、テーブル定義がおかしいです。)AccountBean型で返却した方が適切かと思われます。

蛇足ですが

送り先がjspなので、ID,PWの入力ページもjspだと仮定します。
テキストボックス(に限らずですが)は、未入力のまま先に進めないよう設定することができます。
inputタグの中に数文字書き加えるだけです。

また、DAO側に
if (connection != null) {
connection.close();
}
という記述がありますが、処理の実行後自動で閉じることが可能な書き方もあります。
(try-with-resources文)

投稿2019/07/25 04:32

編集2019/07/25 04:53
tetutetu

総合スコア419

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

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

0

ざっと見ただけ

java

1private static final String SELECT = "select * from account where user_id = ? user_pass = ? ";

where の複数条件の書き方間違ってます。
複数の条件を指定してSELECT文を実行する

java

1 DAO hoge = new DAO();

indexDAO と命名したのにDAOという名前でインスタンス化しようとしています。
DAOだけに限らずクラスのインスタンス化の基本です。
DAOはあくまで概念。そういう機能(クラスというべきか)がもともと存在するわけではありません。

投稿2019/07/25 03:32

m.ts10806

総合スコア80765

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問