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

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

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

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

Java

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

servlet

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

Q&A

解決済

2回答

6168閲覧

servletからのDB検索の処理結果が違う

bigbox267

総合スコア31

JSP

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

Java

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

servlet

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

0グッド

1クリップ

投稿2016/12/28 09:15

編集2016/12/28 09:41

###前提・実現したいこと
jspとサーブレットで求人検索をするwebアプリケーションを作っています。開発環境はNetBeansとmysqlです
jspから値を取得してサーブレットからDB検索しその値と一致したレコードを表示するのをやりたいです。

###発生している問題・エラーメッセージ
DB検索機能を実装したのですがうまくできなくて困っています。エラーメッセージなどは特にありませんが、処理結果が違うのです

テーブルに入っているはずなのに画面に表示してくれません
できあがったSqlをコピーしてxamppのコンソールから入力してみるとコンソールではちゃんと表示してくれます
イメージ説明

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

/* * To change this license header, choose License Headers in Project Properties. * To change this template file, choose Tools | Templates * and open the template in the editor. */ import java.io.IOException; import java.io.PrintWriter; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Statement; import javax.servlet.ServletConfig; 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 javax.servlet.http.HttpSession; /** * * */ @WebServlet(urlPatterns = {"/CompanySearch"}) public class CompanySearch extends HttpServlet { public void init(ServletConfig config) throws ServletException { super.init(config); try { Class.forName("com.mysql.jdbc.Driver"); } catch (Exception e) { e.printStackTrace(); } } protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=UTF-8"); try (PrintWriter out = response.getWriter()) { /* TODO output your page here. You may use following sample code. */ HttpSession session = request.getSession(true); request.setCharacterEncoding("UTF-8"); out.println("<!DOCTYPE html>"); out.println("<html>"); out.println("<head>"); out.println("<title>Servlet CompanySearch</title>"); out.println("</head>"); out.println("<body>"); out.println("<center>"); out.println("<h1>就活サイト</h1>"); out.println("<table border=¥\"1¥\">"); out.println("<tr><th>企業ID<th>企業名<th>都道府県<th>住所<th>URL<th>メールアドレス<th>電話番号</tr>"); Connection con = null; PreparedStatement stmt = null; ResultSet rs = null; try { con = DriverManager.getConnection( "jdbc:mysql://localhost/*****", "****", "********"); String user = null; user = request.getParameter("userID"); String companyID = null; companyID = request.getParameter("companyID"); out.println("<p>companyID="+companyID+"</p>"); String companyName = null; companyName = request.getParameter("companyName"); out.println("<p>companyName="+companyName+"</p>"); String prefecturesID = null; prefecturesID = request.getParameter("prefecturesID"); out.println("<p>prefecturesID="+prefecturesID+"</p>"); String companyAddress = null; companyAddress = request.getParameter("companyAddress"); out.println("<p>companyAddress="+companyAddress+"</p>"); String companyURL = null; companyURL = request.getParameter("companyURL"); out.println("<p>companyURL="+companyURL+"</p>"); String companyMail = null; companyMail = request.getParameter("companyMail"); out.println("<p>companyMail="+companyMail+"</p>"); String companyCall = null; companyCall = request.getParameter("companyCall"); out.println("<p>companyCall="+companyCall+"</p>"); StringBuffer buf = new StringBuffer(); buf.append(" select * from company where "); if( companyID != null && companyID.length() != 0){ buf.append(" companyID = "); buf.append(companyID); buf.append("&&"); } if( companyName != null && companyName.length() != 0){ buf.append(" companyName = '"); buf.append( companyName ); buf.append("' &&"); } buf.append(" prefecturesID = '"); buf.append(prefecturesID); buf.append("' "); if( companyAddress != null && companyAddress.length() != 0 ){ buf.append("&&"); buf.append(" companyAddress = '"); buf.append( companyAddress); buf.append("' "); } if( companyURL != null && companyURL.length() != 0){ buf.append("&&"); buf.append(" companyURL = '"); buf.append(companyURL); buf.append("' "); } if( companyMail != null && companyMail.length() != 0){ buf.append("&&"); buf.append(" companyMail = '"); buf.append(companyMail); buf.append("' "); } if( companyCall != null && companyCall.length() != 0){ buf.append("&&"); buf.append("companyCall = '"); buf.append(companyCall); buf.append("'"); } String sql =buf.toString(); stmt = con.prepareStatement(sql); rs = stmt.executeQuery(); out.println("<p>sql"+sql+"<p>"); while (rs.next()) { out.println("<tr>"); out.println("<td>" + rs.getInt("companyID") + "</td>" ); out.println("<td>" + rs.getString("companyName") + "</td>" ); out.println("<td>" + rs.getString("prefecturesID") + "</td>" ); out.println("<td>" + rs.getString("companyAddress") + "</td>" ); out.println("<td>" + rs.getString("companyURL") + "</td>" ); out.println("<td>" + rs.getString("companyMail") + "</td>" ); out.println("<td>" + rs.getString("companyCall") + "</td>" ); out.println("</tr>"); } } catch (Exception e) { e.printStackTrace(); out.println("<p>1</p>"); } finally { try { rs.close(); } catch (Exception e) {} try { stmt.close(); } catch (Exception e) {} try { con.close(); } catch (Exception e) {} } out.println("</table>"); out.println("</center>"); out.println("</body>"); out.println("</html>"); out.close(); } } // <editor-fold defaultstate="collapsed" desc="HttpServlet methods. Click on the + sign on the left to edit the code."> /** * Handles the HTTP <code>GET</code> method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Handles the HTTP <code>POST</code> method. * * @param request servlet request * @param response servlet response * @throws ServletException if a servlet-specific error occurs * @throws IOException if an I/O error occurs */ @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } /** * Returns a short description of the servlet. * * @return a String containing servlet description */ @Override public String getServletInfo() { return "Short description"; }// </editor-fold> }

###試したこと
試しに
sql = select * from company
としてみたらデータをちゃんと表示してくれます

しかし、
whereの文が入ると何も表示しなくなります

sql = select * from company where prefecturesID = '北海道'
とすると何も表示しなくなります

sql = select * from company where prefecturesID = ?
stmt = con.prepareStatement(sql);

stmt.setString(n, prefecturesID);
rs = stmt.executeQuery();

みたいにやってみたりもしましたが、結局できませんでした

###補足情報(言語/FW/ツール等のバージョンなど)

companyテーブルには

|companyID | 1|
|companyName | テスト|
|prefecturesID | 北海道|
|companyAddress | 北海道函館市|
|companyURL | http://www.hogehoge.com|
|companyMail | hogehoge|
|companyCall | 04312345678|

このようなデータが入っています

prefecturesID 以外は空白での検索も可能にしたいです
ですので、最初から
sql = select * from company where companyID = ? && companyName = ? && prefecturesID = ?......
とやっていると空白で検索された場合にエラーになると考えやりませんでした

prefecturesID はhtmlのセレクトメニューで必ず47都道府県のいずれかのIDが入力されます

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

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

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

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

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

guest

回答2

0

ベストアンサー

少し加筆・修正しました。


文字セットの問題ではないでしょうか?

自分の環境ではcharacter_set_filesystem以外はDB/Tableのデフォルト(の文字セットやcollation)および全ての文字列のカラムの文字セットはutf8(およびunicode_general_ci)に統一してあります。その環境でWorkBenchなどから以下のようにするとヒットしましたが、1行目のcharacter_set_clientをutf8以外(latin1やcp932)に変更するとヒットしませんでした。

sql

1set character_set_client = utf8; 2SELECT * FROM company where prefecturesID='北海道'; --> ヒット

MySqlの文字セットがどのような設定になっているかは以下で調べられると思います。

show variables like 'chara%'

もしcharacter_set_clientなどが不適切な値になっていたなら上記の原因であるような気がします。
なお、詳細なメカニズムを把握したい場合は「MySQLの文字セットについてのマニュアルを参照」し、単純に問題を発生させないためには統一しておくのがよいのかも知れません。

投稿2016/12/28 10:53

編集2016/12/28 14:10
KSwordOfHaste

総合スコア18392

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

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

bigbox267

2016/12/28 13:09

character_set_clientはcp932になっていました。 character_set_clientをutf8に変更しましたが特に変化はありませんでした
bigbox267

2016/12/28 13:14

あと、uft8に変更したらコンソールで SELECT * FROM company where prefecturesID='北海道'; を入力しても Empty set が返ってくるようになりました
KSwordOfHaste

2016/12/28 13:59 編集

補足します。自分の環境ではcharacter_set_filesystem以外は全てutf8で、DB/Tableのデフォルトおよび全ての文字列のカラムもutf8です。その点を回答に反映しました。
bigbox267

2016/12/28 15:09

character_set_filesystem以外は全てutf8に変更して、insert文で新しくデータを入力したところ 日本語の部分が ?e?x?g のような文字になりました。 ちなみに、この文字は テスト と入れました。 もともと入っていたデータの日本語の部分も文字化けしました Windowsなのでcp932以外の文字コードだと日本語が文字化けするのではないでしょうか?
KSwordOfHaste

2016/12/28 15:36

JavaのStringはOSにかかわらずUnicode(UTF16)です。自分のOSはWindows10です。 INSERT文ですがJavaプログラム上からSQLを発行しましたか?
bigbox267

2016/12/29 01:25

私のOSもwin10です insert文はxamppのコンソールから入力しました DBを操作する場合、いつもxamppのコンソールからなのですが、他のやり方をした方がいいのでしょうか?
bigbox267

2016/12/29 09:51

一応解決しました character_set_filesystem以外は全てutf8に変更して DBに登録するservletを作成し、そこからDBに登録した日本語はhtml上では、文字化けせずにちゃんと表示されました。
KSwordOfHaste

2016/12/29 10:55

何を使うにせよ文字セットは面倒ですね。xamppの文字化け対策についての記事も検索してみるとちらほらあるようなのでそういったものも参考にされるとよいと思います。
guest

0

where条件がない場合は出力されるとのことですので、
気になるのは、試された、where条件の値が、日本語だという部分です。
※実際のDBとの文字コードの違いで、selectされないのではないでしょうか?

例えば、where companyID = 1 で試してみるなどで問題を切り分けてみて下さい。

投稿2016/12/28 10:40

_kato

総合スコア149

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

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

bigbox267

2016/12/28 12:54

sql =" select * from company where companyID = 1 "; では、きちんと表示されていました
_kato

2016/12/29 01:39

もともと、コンソールでは日本語でもselectできていたとのことですので、character_set_clientがcp932ならば、データベース自体に格納する文字コードもcp932の設定になっているのではないのでしょうか? mysqlの、show create database xxxx コマンドで確認できます。 (参考)http://mysql.javarou.com/dat/000573.html データベースの文字コードがcp932ならば、JDBCで接続する際のオプションで、cp932を指定すれば、日本語でのinsertも、日本語でのselectもうまくできると思います。 "jdbc:mysql://localhost/*****"の部分を、 "jdbc:mysql://localhost/*****?characterEncoding=cp932"に変更 データベースがutf8の場合は、 "jdbc:mysql://localhost/*****?characterEncoding=utf8"に変更
bigbox267

2016/12/29 10:03

回答ありがとうございました。 上記のやり方と併用させていただきました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問