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

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

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

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

Q&A

1回答

1291閲覧

filterでユーザー振り分けがしたいです。

Yuri0402

総合スコア13

Java

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

0グッド

0クリップ

投稿2019/05/24 03:13

編集2022/01/12 10:55

イベント管理システムを作成しています。

フィルターファイルで、DBに登録しているテーブルのtype_idごとにページの飛ばし先を変更したいです。
1=一般ユーザーページ
2=管理ユーザーページ

イメージ説明

sql

1-- users テーブル作成 2CREATE TABLE users ( 3 id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, 4 login_id VARCHAR(50) NOT NULL unique, 5 login_pass VARCHAR(255) NOT NULL, 6 name VARCHAR(50) NOT NULL, 7 type_id INT NOT NULL, 8 group_id INT NOT NULL, 9 created DATETIME NOT NULL 10);

sql

1 2-- users テーブルサンプル追加 1 3INSERT INTO mydb.users(login_id, login_pass, name, type_id, group_id, created) 4VALUES('tarou','taroupass','山田太郎',1,1,'2019-05-02 11:12:00'); 5 6-- users テーブルサンプル追加 2 7INSERT INTO mydb.users(login_id, login_pass, name, type_id, group_id, created) 8VALUES('takasi','takasipass','田中隆',2,2,'2019-02-18 05:08:00'); 9 10-- users テーブルサンプル追加 3 11INSERT INTO mydb.users(login_id, login_pass, name, type_id, group_id, created) 12VALUES('yuuki','yuukipass','小鳥遊ゆうき',1,3,'2019-01-20 04:30:00');```

java

1 2package filter; 3 4import java.io.IOException; 5 6import javax.servlet.Filter; 7import javax.servlet.FilterChain; 8import javax.servlet.FilterConfig; 9import javax.servlet.ServletException; 10import javax.servlet.ServletRequest; 11import javax.servlet.ServletResponse; 12import javax.servlet.annotation.WebFilter; 13import javax.servlet.http.HttpServletRequest; 14import javax.servlet.http.HttpServletResponse; 15import javax.servlet.http.HttpSession; 16 17/** 18 * Servlet Filter implementation class AuthFilter 19 */ 20@WebFilter("/AuthFilter") 21public class AuthFilter implements Filter { 22 23 /** 24 * Default constructor. 25 */ 26 public AuthFilter() { 27 // TODO Auto-generated constructor stub 28 } 29 30 /** 31 * @see Filter#destroy() 32 */ 33 public void destroy() { 34 // TODO Auto-generated method stub 35 } 36 37 /** 38 * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) 39 */ 40 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 41 throws IOException, ServletException { 42 // TODO Auto-generated method stub 43 // place your code here 44 45 HttpServletRequest req = (HttpServletRequest) request; 46 HttpServletResponse res = (HttpServletResponse) response; 47 HttpSession session = req.getSession(); 48 String uri = req.getRequestURI(); 49 if (!uri.endsWith("/login")) { 50 if (session.getAttribute("loginId") == null) { 51 res.sendRedirect("login"); 52 return; 53 } 54 } 55 56 // pass the request along the filter chain 57 chain.doFilter(request, response); 58 } 59 60 /** 61 * @see Filter#init(FilterConfig) 62 */ 63 public void init(FilterConfig fConfig) throws ServletException { 64 // TODO Auto-generated method stub 65 } 66 67} 68

どのようなコードを書いたらわからないので、教えていただけますと幸いです。
ほかに必要な情報がありましたら教えてください。

>追記
現在、データベースのテーブル作成しました。
type_idカラムの値を条件にフィルターファイルでページの振り分けするところで止まっています。

4.絞込検索のときにプリペアドステートメントを利用する:prepareStatementの使用

⇒手順4でつまづいてます。
PreparedStatement st = con.PreparedStatement(sql);の一行がエラーになります。

java

1 2package test04; 3 4import java.sql.Connection; 5import java.sql.DriverManager; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8import java.sql.Statement; 9 10/** 11* localhost上のデータベースと接続し、取得したデータをコンソール出力する。 12*/ 13public class UseJdbc { 14 15 public static void main(String args[]) throws Exception { 16 17 /*接続先サーバー名を"localhost"で与えることを示している*/ 18 String servername = "localhost"; 19 20 /*接続するデータベース名をsenngokuとしている*/ 21 String databasename = "mydb"; 22 23 /*データベースの接続に用いるユーザ名をrootユーザとしている*/ 24 String user = "root"; 25 26 /*データベースの接続に用いるユーザのパスワードを指定している*/ 27 String password = "pass"; 28 29 /*取り扱う文字コードをUTF-8文字としている*/ 30 String serverencoding = "UTF-8"; 31 32 /*データベースをあらわすURLを設定している*/ 33 String url = "jdbc:mysql://localhost/" + databasename; 34 35 /*MySQLの場合、URLの形式は次のようになります。 36 jdbc:mysql://(サーバ名)/(データベース名)*/ 37 38 /*↑データベースをあらわすURL(データベースURL)は、データベースに接続する場合に 39 必要となる情報をセットした文字列である。 40 この文字列の構造は、"jdbc"、サブプロトコル、サブネームの3つの部分から構成される。*/ 41 42 /*接続を表すConnectionオブジェクトを初期化*/ 43 Connection con = null; 44 45 try { 46 47 /*クラスローダによりJDBCドライバを読み込んでいることを示している。 48 引数は、データベースにアクセスするためのJDBCドライバのクラス名である。*/ 49 Class.forName("com.mysql.jdbc.Driver").newInstance(); 50 51 /*DriverManagerクラスのgetConnectionメソッドを使ってデータベースに接続する。*/ 52 con = DriverManager.getConnection(url, user, password); 53 54 System.out.println("Connected...."); 55 56 /*データベースの接続後に、sql文をデータベースに直接渡すのではなく、 57 sqlコンテナの役割を果たすオブジェクトに渡すためのStatementオブジェクトを作成する。*/ 58 // Statement st = con.createStatement(sql); 59 PreparedStatement st = con.PreparedStatement(); 60 61 /*SQL文を作成する*/ 62 String sqlStr = "SELECT * FROM mydb.users where name = ?,?;"; 63 st.setString(1, "山田太郎"); 64 65 /*SQL文を実行した結果セットをResultSetオブジェクトに格納している*/ 66 ResultSet result = st.executeQuery(sqlStr); 67 68 /*クエリ結果を1レコードずつ出力していく*/ 69 while (result.next()) { 70 /*getString()メソッドは、引数に指定されたフィールド名(列)の値をStringとして取得する*/ 71 // String str1 = result.getString("id"); 72 String str2 = result.getString("login_id"); 73 String str3 = result.getString("login_pass"); 74 // String str4 = result.getString("name"); 75 // String str5 = result.getString("type_id"); 76 // String str6 = result.getString("grouo_id"); 77 // String str7 = result.getString("created"); 78 // System.out.println(str1 + ", " + str2 + ", " + str3 + "," + str4); 79 System.out.println(str2 + ", " + str3); 80 } 81 82 /*ResultSetオブジェクトを閉じる*/ 83 result.close(); 84 85 /*Statementオブジェクトを閉じる*/ 86 st.close(); 87 88 /*Connectionオブジェクトを閉じる*/ 89 con.close(); 90 } catch (SQLException e) { 91 92 /*エラーメッセージ出力*/ 93 System.out.println("Connection Failed. : " + e.toString()); 94 95 /*例外を投げちゃうぞ*/ 96 throw new Exception(); 97 98 } catch (ClassNotFoundException e) { 99 100 /*エラーメッセージ出力*/ 101 System.out.println("ドライバを読み込めませんでした " + e); 102 } finally { 103 try { 104 if (con != null) { 105 con.close(); 106 } 107 } catch (Exception e) { 108 109 /*エラーメッセージ出力*/ 110 System.out.println("Exception2! :" + e.toString()); 111 112 /*例外を投げちゃうぞ*/ 113 throw new Exception(); 114 } 115 } 116 } 117} 118コード

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

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

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

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

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

m.ts10806

2019/05/24 03:43

「初心者」と書くより「初心者アイコン」を質問につけてください(質問投稿画面タイトル横にある初心者マークをクリック) また、コードは画像ではなくテキストベースでそのままマークダウンのcode機能にてご提示ください。 https://teratail.com/help#about-markdown 画像だとそのまま再現確認ができませんし、一部が切れていたりすると情報が正しく読み取れません。 データベースもできればDBの種類(MySQLなど)を記載し、CREATE TABLE文とサンプルデータのINSERT文をご提示いただければと思います。 あと・・・ 今現在、どこまでできているのでしょうか? DBのデータ取得ができるのでしたら、ほとんどできたようなものだとは思うのですが。
Yuri0402

2019/05/24 04:13

回答ありがとうございます。 先ほど、追記させていただきましたのでご確認お願いします。 >今現在、どこまでできているのでしょうか? ⇒現在、データベースのテーブル作成しました。 type_idカラムの値を条件にフィルターファイルでページの振り分けするところで止まっています。
Yuri0402

2019/05/24 04:15

DBは、mysqlを使用しています。
m.ts10806

2019/05/24 04:20

あ、ごめんなさい。 >【java初心者】 タグに「Java」はありますし「初心者アイコン」もあるのでタイトルにつける必要はないので削ってもらえればと。「要件のみ」が原則です。 >type_idカラムの値を条件にフィルターファイルでページの振り分けするところ DBからデータを取得する処理(ここはフィルタ・検索あってもなくても良いですが)はできますか? 参考にできそうな記事は(サーブレット、JSP)結構あると思います。
Yuri0402

2019/05/24 04:28

>DBからデータを取得する処理(ここはフィルタ・検索あってもなくても良いですが)はできますか? 参考にできそうな記事は(サーブレット、JSP)結構あると思います。 ⇒ネットの記事を参考にDAOを使ってためしてみたりしたのですが、自力ではうまくいかなかったため、今回質問させていただきました。。。もう一度調べて再度返信させていただきます。
guest

回答1

0

ネットの記事を参考にDAOを使ってためしてみたりしたのですが

DAOにしようと思うとワンクッション置くことになるのでまずは「直にSQLを実行してDBからデータを取得する」ことを次の段階とすると良いでしょう。

流れとしては下記。

  1. 全て取得する:データを取得する(SELECT文)
  2. 絞り込む:データを取得する条件を設定する(WHERE句)
  3. JavaからMySQLに接続する/結果を取得する:データの取得(SELECT)

jdbcドライバー部分が古いかもしれません。最新確認してください
0. 絞込検索のときにプリペアドステートメントを利用する:prepareStatementの使用

という感じです。
あとは任意のデータが取得出来たらそれをもとに実現したい処理を入れていきます。

コード追記を受けて

流れを提示したところでちょっと説明不足があったかもしれませんが、
1,2についてはDBに対して直接SQLを実行してください。
SQLはプログラムからすると外部のサービスです。
外部のサービスを利用する際は、いきなりプログラムを経由するのではなく、直接実行してみて実行できるかどうか確かめて、想定通りの結果が得られるパラメータをそのまま利用します。

下記ですが、直接DBに対して実行してみましたか?
SELECT * FROM mydb.users where name = ?,?

2.で提示したリンクに name = ?,? のような書き方はなかったはずです(コンマで区切っているところ)
提示リンクより引用しますが、複数条件を指定したい場合はANDやORなどでつなぎます

SELECT * FROM personal WHERE address='Osaka' AND old>=20;

マニュアルも確認してください→ SELECT構文

今回はnameで検索したいようですから,?は不要です。
SELECT * FROM mydb.users where name = ?

ただDBに対して実行する場合は?ではいけないので適当な値をおいて実行します。
SELECT * FROM mydb.users where name = '山田太郎'

これが通るか確認してください。

※今後SELECT以外も使うようになると思いますが、必ず直接DBに実行して想定通りの結果が得られるSQLを使うようにしてください。いきなりプログラムから実行してしまっては問題の切り分けが難しくなります。

次。

String sqlStr = "SELECT * FROM mydb.users where name = ?,?;"; st.setString(1, "山田太郎");

プリペアドステートメントはまずSQLでバインド待ち(?)の値をバインドしてからDBに届けます。
このSQL上ではバインド待ちが2つあるのでsetも同じ数必要です。

おそらくでエラーになっているのでは(つまり、セット予定と実際にセットされた値の数が合わない)

私が提示した4番目の記事にも書いてありますね。

この例では実際に挿入する値を記述箇所に「?」を使っています。2箇所使っていますので、後からパラメータを2つ指定する必要があります。
パラメータはSQL文中に記述された「?」を先頭から順番に1,2,3、・・・と順番に番号が割り当てられています。1番目のメソッドにはパラメータの番号を指定し、2番目の引数にパラメータに設定したい値を記述します。

あとは型を適切に設定してください。

元々のSQLの間違いをなおせばsetは1つで良くなります。

*蛇足確認
これは仕様部分なのですが、nameで検索しようとしていますが、これはあくまで検証のためですよね?
通常ログインといったらユーザIDとPASSを半角英数で入力するので・・。

投稿2019/05/24 04:56

編集2019/05/24 06:05
m.ts10806

総合スコア80765

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

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

Yuri0402

2019/05/24 05:47

>4.絞込検索のときにプリペアドステートメントを利用する:prepareStatementの使用 ⇒手順4でつまづいてます。 PreparedStatement st = con.PreparedStatement(sql);の一行がエラーになります。コードは上に追加しました。
m.ts10806

2019/05/24 05:49

インデントが全くないのでちょっと見づらいです。手元のコードを調整して再度ご提示いただけますか?
m.ts10806

2019/05/24 05:49

またエラーとなるのでしたら原則エラーメッセージをそのままご提示ください。
m.ts10806

2019/05/24 05:50

そういえばコード内ではPreparedStatementにsqlを引数に指定しているところがないような。引数なしになってますね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問