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

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

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

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

Java

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

Q&A

解決済

2回答

12571閲覧

DB→servlet→jsp

kumatarou

総合スコア33

JSP

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

Java

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

0グッド

0クリップ

投稿2015/11/10 01:33

編集2015/11/10 01:49

Javaの勉強をしながら名刺管理システムを開発しようと考えています。
DB→servlet→jspの流れでDBから持ってきた値を、jspに出力させたいのですが
エラーが出てしまいます。

エラーを出さずに無事に表示させために、お力を貸して頂ければと思いますので宜しくお願い致します。

初心者ですので情報が足りてなく、言葉足らずな部分もたくさんあると思いますので
遠慮なく申しつけて頂ける幸いです。

###発生している問題・エラーメッセージ
An exception occurred processing JSP page /WEB-INF/jsp/Business.jsp at line 20

Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
servlet.BusinessServlet.doGet(BusinessServlet.java:31)
javax.servlet.http.HttpServlet.service(HttpServlet.java:620)
javax.servlet.http.HttpServlet.service(HttpServlet.java:727)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)

###ソースコード
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ page import="model.CardData,java.util.List" %>
<%
@SuppressWarnings("unchecked")
List<CardData> cdList = (List<CardData>)request.getAttribute("cdList");
%>

<!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>名刺管理</title> </head> <body> <form action="/example/NewServlet" method="get"> <input type="submit" value="新規" style="position: relative; left: 70px; top: 50px;" style="width:100px; height:100px"/> </form> <p> <% for(CardData cardData : cdList){%> (*ここでエラーが発生しています*) 会社名:<%= cardData.getCompany_name() %> 姓:<%= cardData.getFirst_name() %> 名:<%= cardData.getLast_name() %> <%}%> </p> </body> </html>

###補足情報
*言語 Java
*環境 eclipse4.5 All in one
windows7

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

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

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

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

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

rysh

2015/11/10 01:40

エラーで表示されているスタックトレースを全て表示してもらえますか?
kumatarou

2015/11/10 01:48

失礼いたしました。こちらになります。 org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:568) org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:470) org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:390) org.apache.jasper.servlet.JspServlet.service(JspServlet.java:334) javax.servlet.http.HttpServlet.service(HttpServlet.java:727) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) servlet.BusinessServlet.doGet(BusinessServlet.java:31) javax.servlet.http.HttpServlet.service(HttpServlet.java:620) javax.servlet.http.HttpServlet.service(HttpServlet.java:727) org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
guest

回答2

0

requestスコープのattributecdListに値が設定されておらず、変数cdListnullになっている可能性が高そうです。

サーブレットで、request.setAttribute("cdList")を正しく行っているかどうかを確認してみてください。
行っていても、if文などの分岐でそこを通らない可能性などがあれば、それも確認してください。


(追記)

回答ではありませんが、このようなケースは良くあることなので、防止策について書かせていただきます。

JSP側でNullPointerExceptionが発生すると追っかけにくくなりますので、下記のようにしてサーブレット側で防ぐようにします。

1.DAOのselectメソッドがnullを返さないようにする

DAOに限りませんが、戻り値がnullになるようなメソッドはできるだけ書かないようにしましょう。

どのようなケースでnullを返しているかにもよりますが、SELECTに失敗していれば例外をスローする、検索結果無しの場合は、戻り値がList<Item>なら、Collections.emptyList()を返すようにします。

2.分岐によってセットし忘れがないようにする

if文などで、ifの方には書いたけどelseのところでsetAttributeを忘れてしまうようなケースがあります。

setAttributeは分岐の中に書かないようにして、かつlistnullでないことを保証するとなお良いです。

例:

lang

1 2List<CDItem> list; 3if ( ... ) { 4 list = dao.findById(id); 5} 6else { 7 list = dao.findAll(); 8} 9 10if (list == null) { 11 throw new ServletException(); // システムエラー 12} 13 14// listがnullでないことが保証される 15request.setAttribute("cdList", list); 16

(追記2)

上記の1について、実装例を書きましたのでリンクを載せておきます。

Java8版 簡易DAOサンプル (Gist)
https://gist.github.com/argius/e71722f5cad6f79227fc

投稿2015/11/10 02:15

編集2015/11/10 12:36
argius

総合スコア9388

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

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

kumatarou

2015/11/10 02:29

回答ありがとうございます argius様のおっしゃる通り、デバックをしていくとDAOのSELECT文で値がnullになっていました。 まずはこのnullを解決したいと思います。
kumatarou

2015/11/10 06:41

御丁寧にありがとうございます。参考にさせて頂きます。 もうひとつ質問させて頂いても宜しいでしょうか? デバックを使っているのですがどこでnullになっているか、わからずにいます。 画面設計 servlet → model → DAO (servletに返す) insertしてDBに保存済み servlet → model → DAO findAllしてselectで値を持ってくる DBには保存できたのですが、それをselectできていません。と言うことはservlet に問題があるのでしょうか? *servletパッケージ protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //セッションスコープに保存された情報を取得 HttpSession session = request.getSession(); CardData cd = (CardData) session.getAttribute("ConfirmationServlet"); //情報をリストに追加 InLogic inLogic = new InLogic(); inLogic.execute(cd); //情報を取得して、リクエストスコープに保存 OutLogic outLogic = new OutLogic(); List<CardData> cdList = outLogic.execute(); request.setAttribute("cdList", cdList); //フォワード RequestDispatcher dispatcher = request.getRequestDispatcher("/WEB-INF/jsp/Business.jsp"); dispatcher.forward(request, response); } 何度も申し訳ございませんがご教授ねがえればと思います。  
anonymouskawa

2015/11/10 06:47

DAOとSELECT文も見せてくれますかー
kumatarou

2015/11/10 06:51

長いですがDAOとSELECT文になります。 public class CardDataDAO { public List<CardData> findAll(){ Connection conn = null; List<CardData> cdList = new ArrayList<CardData>(); try{ //JDBCドライバのロード Class.forName("com.mysql.jdbc.Driver").newInstance(); // MySQLに接続 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/business_card", "root", ""); //SELECT文(データの取得)の準備 あいうえお順に並べる String sql = "select business_unit, division, section, last_name, last_name_kana, first_name, first_name_kana, email, company_name, company_name_kana, address_number, address, tel_direct, tel_main, fax, url from card_data order by first_name asc"; PreparedStatement pStmt = conn.prepareStatement(sql); //SELECTを実行して結果を取得 ResultSet rs = pStmt.executeQuery(); //インスタンスの設定と追加 while(rs.next()){ String business_unit = rs.getString("business_unit"); String company_name = rs.getString("company_name"); String company_name_kana = rs.getString("company_name_kana"); String division = rs.getString("division"); String section = rs.getString("section"); String last_name = rs.getString("last_name"); String first_name = rs.getString("first_name"); String last_name_kana = rs.getString("last_name_kana"); String first_name_kana = rs.getString("first_name_kana"); String address = rs.getString("address"); String url = rs.getString("url"); String email = rs.getString("email"); String address_number = rs.getString("address_number"); String tel_main = rs.getString("tel_main"); String tel_direct = rs.getString("tel_direct"); String fax = rs.getString("fax"); CardData cardData = new CardData(business_unit, company_name, company_name_kana, last_name, first_name, last_name_kana, first_name_kana, division, section, email, address, url, address_number, tel_main, tel_direct, fax); cdList.add(cardData); } }catch(SQLException e) { e.printStackTrace(); return null; } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { e.printStackTrace(); return null; }finally{ //データベース切断 if(conn != null) { try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); return null; } } } return cdList; } //insert(データの追加) public boolean create(CardData cardData){ Connection conn = null; try{ //JDBCドライバのロード Class.forName("com.mysql.jdbc.Driver").newInstance(); // MySQLに接続 conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/business_card", "root", ""); //insertの準備 String sql = "insert into card_data (company_name, company_name_kana, business_unit, division, section, last_name, last_name_kana, first_name, first_name_kana, email, address_number, address, tel_direct, tel_main, fax, url) values ( ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"; PreparedStatement pStmt = conn.prepareStatement(sql); //?の値に使用する値の設定 pStmt.setString(1, cardData.getCompany_name()); pStmt.setString(2, cardData.getCompany_name_kana()); pStmt.setString(3, cardData.getBusiness_unit()); pStmt.setString(4, cardData.getDivision()); pStmt.setString(5, cardData.getSection()); pStmt.setString(6, cardData.getLast_name()); pStmt.setString(7, cardData.getLast_name_kana()); pStmt.setString(8, cardData.getFirst_name()); pStmt.setString(9, cardData.getFirst_name_kana()); pStmt.setString(10, cardData.getEmail()); pStmt.setString(11, cardData.getAddress_number()); pStmt.setString(12, cardData.getAddress()); pStmt.setString(13, cardData.getTel_direct()); pStmt.setString(14, cardData.getTel_main()); pStmt.setString(15, cardData.getFax()); pStmt.setString(16, cardData.getUrl()); //insertの実行 int result = pStmt.executeUpdate(); if(result != 1){ return false; } }catch(SQLException e) { e.printStackTrace(); return false; } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { e.printStackTrace(); return false; }finally{ //データベースの切断 if(conn != null){ try{ conn.close(); }catch(SQLException e){ e.printStackTrace(); } } } return true; } }
anonymouskawa

2015/11/10 06:56

なんか }catch(SQLException e){ e.printStackTrace(); return null; ココが怪しそうなのですが…
argius

2015/11/10 06:56

e.printStackTrace();でnullを返しているのですね。 まさに私が1で書いたとおりになっています。 まずは、e.printStackTrace();で何が出力されているのかを確認しましょう。
anonymouskawa

2015/11/10 06:58

String sql = "select business_unit, division, section, last_name, last_name_kana, first_name, first_name_kana, email, company_name, company_name_kana, address_number, address, tel_direct, tel_main, fax, url from card_data order by first_name asc"; この行にブレークポイント置いて、F6で進めてみてください。 どこかでcatchに行ってませんか?
kumatarou

2015/11/10 07:12

argius様 e.printStackTrace();で何が出力されているか確認するためには、デバックで値を見れば宜しいのでしょうか? anonymouskawa様 String sql ・・・の行でブレークポイントを置いて、F6で進めると PreparedStatement pStmt = conn.prepareStatement(sql); //SELECTを実行して結果を取得 ResultSet rs = pStmt.executeQuery(); //インスタンスの設定と追加 while(rs.next()){ ・・・ cdList.add(cardData); と進みますが、while(rs.next()){ ~ cdList.add(cardData);で永遠ループしています。
anonymouskawa

2015/11/10 07:15

使っているのってmysqlでしたっけ。 mysqlなら、SQLにlimit 1 を付けて1件だけ取得するようにして流してください。
argius

2015/11/10 07:17

質問欄で、「Stacktrace: 」と書かれていますが、それと似たようなものがDAO処理時にも出ているはずです。 Eclipseで実行しているのでしたら、コンソールをさかのぼって見てみてください。 あと、ぶっちゃけて失礼しますが、お手本が良くないですね。 せっかくJava7以上を使える(複数catchが使えてるので分かります)のですから、try-with-resources機能を使った例を参考にされた方が良いかと思います。
kumatarou

2015/11/10 07:35

anonymouskawa様 環境を載せていませんでした。失礼しました。mysqlを使っています。 作業が遅くてすみません・・・。今やっていますのでお待ちください。 argius様 コンソールには、このように表示されています。 11 10, 2015 4:29:12 午後 org.apache.catalina.core.AprLifecycleListener init 情報: The APR based Apache Tomcat Native library which allows optimal performance in production environments was not found on the java.library.path: C:\pleiades\eclipse\jre\bin;C:\Windows\Sun\Java\bin;C:\Windows\system32;C:\Windows;C:\pleiades\eclipse\jre\bin;C:/pleiades/eclipse/jre/bin/client;C:/pleiades/eclipse/jre/bin;C:/pleiades/eclipse/jre/lib/i386;C:\Users\s.okawa\Desktop\mysql-5.6.27-win32\bin;C:\Windows\system32;C:\Windows;C:\Windows\System32\Wbem;C:\Windows\System32\WindowsPowerShell\v1.0\;C:\Program Files\ThinkPad\Bluetooth Software\;C:\Program Files\Lenovo\Access Connections\;C:\pleiades\eclipse;;. 11 10, 2015 4:29:13 午後 org.apache.tomcat.util.digester.SetPropertiesRule begin 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.eclipse.jst.jee.server:example' did not find a matching property. 11 10, 2015 4:29:13 午後 org.apache.coyote.AbstractProtocol init 情報: Initializing ProtocolHandler ["http-bio-8080"] 11 10, 2015 4:29:13 午後 org.apache.coyote.AbstractProtocol init 情報: Initializing ProtocolHandler ["ajp-bio-8009"] 11 10, 2015 4:29:13 午後 org.apache.catalina.startup.Catalina load 情報: Initialization processed in 974 ms 11 10, 2015 4:29:13 午後 org.apache.catalina.core.StandardService startInternal 情報: サービス Catalina を起動します 11 10, 2015 4:29:13 午後 org.apache.catalina.core.StandardEngine startInternal 情報: Starting Servlet Engine: Apache Tomcat/7.0.52 11 10, 2015 4:29:14 午後 org.apache.coyote.AbstractProtocol start 情報: Starting ProtocolHandler ["http-bio-8080"] 11 10, 2015 4:29:14 午後 org.apache.coyote.AbstractProtocol start 情報: Starting ProtocolHandler ["ajp-bio-8009"] 11 10, 2015 4:29:14 午後 org.apache.catalina.startup.Catalina start 情報: Server startup in 1488 ms お手本は、「スッキリわかるサーブレット&JSP 入門」を見て作っています。 去年出版されたものなので、古いのかもしれません・・・ try-with-resources調べてみます!ありがとうございます。
argius

2015/11/10 07:54

e.printStackTrace();を通ったのなら、それが出力されているはずなんですが。 e.printStackTrace()は、Pleiades(Eclipse)ならコンソールに赤字で出力されます。
kumatarou

2015/11/10 07:56

anonymouskawa様 SQLにlimit 1 を付けて1件だけ取得させたところ String sql =  ・・・でF6を押すと catch下の e.printStackTrace();に飛びました。 変数ビューのeには、SQLException(id=123)と記載されています
anonymouskawa

2015/11/10 08:03

SQLを「select business_unit, division, section, last_name, last_name_kana, first_name, first_name_kana, email, company_name, company_name_kana, address_number, address, tel_direct, tel_main, fax, url from card_data limit 1」にしても出ますか
kumatarou

2015/11/10 08:25

argius様 SELECT文の e.printStackTrace(); まで通らず 上の While~cdList.add(cardData); を永遠ループしています。 もう一度やってみましたが、コンソールは変わらずです・・・。 anonymouskawa様 anonymouskawa様に載せて頂いたコードをコピペしてデバックさせて頂いたところ、 次の行の、PreparedStatement pStmt = conn.prepareStatement(sql);に進みwhile文に戻りF6を押すと、catchに飛びました。 永遠ループを抜け出せました! コンソールは変わらずです・・・
argius

2015/11/10 08:34

findAllで、全件をループしているから手動でやっていてはキリが無いかも知れません。いったんブレークポイントを外して処理を続行させてみてください。 anonymouskawaさんがlimit 1をつけて、と言ったのを実行したのなら、catchの続きを実行してください。 コンソールにスタックトレースが赤字で出力されませんか? スタックトレースを出せば、何が原因でエラーになっているのかが分かります。 > 去年出版されたもの try-with-resourcesが使えるのはJava7以降ですが、 去年だったら既に3月にJava7の次のバージョンJava8が出ているんですけどね。 ↓こちらの方がいくらかマシなサンプルかと思います。try-with-resourcesを使っています。 今後の参考にしていただければ幸いです。 Java8版 簡易DAOサンプル https://gist.github.com/argius/e71722f5cad6f79227fc
kumatarou

2015/11/10 08:49

argius様 catchの続きをF6を押して実行させたのですが、コンソールのスタックレースは以前と変化がありません・・・。 DAO→model→servletまで戻しても変化なしでした。 御丁寧にDAOサンプルをご用意して頂きありがとうございます。拝見させて頂いてます。
anonymouskawa

2015/11/10 08:50

うーん? //データベース切断 こっちのほうのcatchに飛んでますか?
kumatarou

2015/11/10 08:56

while文を一周した後、最初の }catch(SQLException e) { に飛びそのあと //データベース切断 if(conn != null) { ここに飛びます
argius

2015/11/10 09:14

あ、ボケてました。 whileまで来ているということはSQLのエラーでは無いってことですね。 それでは、どのreturnを通ってメソッドが終了していますか? サーブレットクラスにはnullが返されるんですよね?
anonymouskawa

2015/11/10 09:14

じゃあ、rs.next() でエラーですね next boolean next() throws SQLException カーソルを現在の位置から 1 行順方向に移動します。ResultSet のカーソルは、初期状態では最初の行の前に位置付けられています。 next メソッドの最初の呼び出しによって、最初の行が現在の行になります。 2 番目の呼び出しによって 2 行目が現在の行になり、以下同様に続きます。 next メソッドの呼び出しで false が返されると、カーソルは最終行の後ろに位置します。現在の行が必要な ResultSet メソッドのあらゆる呼び出しによって、SQLException がスローされます。結果セットの種類が TYPE_FORWARD_ONLY である場合、以降の next の呼び出しで JDBC ドライバ実装が false を返すか SQLException をスローするかは、そのベンダーによって指定されます。 現在の行で入力ストリームがオープンしている場合、next メソッドへの呼び出しは暗黙的にそのストリームをクローズさせます。新しい行が読み込まれるときに、ResultSet オブジェクトの警告チェーンはクリアされます。 戻り値: 新しい現在の行が有効な場合は true、それ以上行がない場合は false 例外: SQLException - データベースアクセスエラーが発生した場合、またはこのメソッドがクローズされた結果セットで呼び出された場合 なので、catchに飛んだ時のeの値を見てください。 何かしら書いてあると思います。
kumatarou

2015/11/10 09:31

argius様 return cdListでメソッドが終了してmodelに戻ってきています。 SELECTの変数ビューを見るとnullになっているのでnullで返されていると思います。 anonymouskawa様 catchに飛んだ時に、e.printStackTrace();のeにカーソルを持っていくと「SQLException e - dao.CardDataDAO.findAll()」と表示されています。 変数やコンソールには特に表示はありませんでした。
anonymouskawa

2015/11/10 09:35

catchまで飛んで、F6を押して return null でまで進んでください。 デバッグ画面の右上に(x)= 変数というタブがあるならばそのタブを開いてください。 eがあったら、そのeをクリックして、内容を確認します。
kumatarou

2015/11/10 09:46

anonymouskawa様 catchまで飛んで、F6を押していくと 1.if(conn != null) { に飛び 2.conn.close(); 3.}catch(SQLException e){ 4.return cdList; ここでメソッドが終わってしまうため return null を超えてしまいます。 変数のタブにあるのは this CardDataDAO(id=106)  詳細(dao.CardDataDAO@1544abc) conn JDBC4Connection(id=116) 詳細(com.mysql.jdbc.JDBC4Connection@1d295de)  cdList ArrayList<E> (id=107)  詳細([model.CardData@2d0ca6]) となっています・・・
argius

2015/11/10 09:47

もしかしたら、これなのでしょうか。 conn.close();の2行後にあるreturn nullを外してみてください。 finally句にreturnを書くと、予期しない動作をするのでやめたほうが良いです。 でも、もしそうだとしたらconn.close()がエラーになっているということなので、解せませんね。 変に例外処理をDAO内でやっているので混乱を招いている部分もあると思うんですよね。 メソッドをthrows SQLExceptionにしてSQLExceptionはメソッドの外に投げるようにすれば分かり易くなりますよ。
anonymouskawa

2015/11/10 09:48

あれ? cdList.add(cardData); } }catch(SQLException e) { e.printStackTrace(); return null; ここのcatchですよね? e.printStackTrace();まで進むことはできて、 次のreturn null;までは行きませんか?
kumatarou

2015/11/10 10:08 編集

argius様 return nullを外してみましたがエラーは変わらずでした・・・ 先ほど述べた本だけを見ながらやっていたので、finally句にreturnを書くと、予期しない動作が起こるなどの知識がなく、書いていました。 エラー以外にも知識を与えて頂いて感謝しています。 次回以降は、try-with-resourcesを使ってメソッドをthrows SQLExceptionにしてSQLExceptionはメソッドの外に投げるように作りたいと思います。 anonymouskawa様 }catch(SQLException e) {        ←1.ここのcatchに飛び e.printStackTrace(); return null; } catch (InstantiationException | IllegalAccessException | ClassNotFoundException e) { e.printStackTrace(); return null; }finally{ //データベース切断 if(conn != null) {  ←2.次にここに飛びます try{ conn.close(); ←3.次にここに飛びます }catch(SQLException e){  ←4.次にここに飛びます e.printStackTrace(); //return null; } } } return cdList; ←5.最後にここに飛びます } return nullを素通りしていまいます。変数に変わりはありません。
anonymouskawa

2015/11/10 10:09

あっ、すみません! }catch(SQLException e) {        ←1.ここのcatchに飛び ここに行ったら、F5を押してください。
kumatarou

2015/11/10 10:09

return nullを素通りしていまいます。変数に変わりはありません。
kumatarou

2015/11/10 10:10

anonymouskawa様 確認してみます!
kumatarou

2015/11/10 10:17

}catch(SQLException e) {        ←1.ここのcatchに飛び ここに行ったら、F5を押しましたが、 if(conn != null) {  ←2.ここに飛びます 次もF5を押してみましたが conn.close(); ←3.ここに飛んでしまいました
anonymouskawa

2015/11/10 10:19

では、 cdList.add(cardData); } }catch(SQLException e) { e.printStackTrace(); return null; の e.printStackTrace(); にブレークポイントを置いてデバッグしてみてください。 ここにいかないのはちょっとよくわからない…。
argius

2015/11/10 10:27

あとは、コンパイルされた結果がTomcatに反映されていないとかですかね。 Tomcatを再起動してからもう一度実行してみるとどうでしょう?
kumatarou

2015/11/10 10:30

今までdaoパッケージにブレークポイントを置くとブレークポイントで止まらなかったので、servletにブレークポイントを付けて→model→dao でデバックしていました。 DAOパッケージのe.printStackTrace(); にブレークポイントを置いてデバッグしてみましたが止まらず・・・
anonymouskawa

2015/11/10 10:33

プロジェクトをリフレッシュしてクリーンしてください。 あと、Eclipse再起動してみてください。 謎だなぁ
kumatarou

2015/11/10 10:35

argius様 先ほどから何度かTomcatを再起動して実行していますが相変わらずです
kumatarou

2015/11/10 10:45

anonymouskawa様 リフレッシュクリーンしたらDAOでブレークできました!!ありがとうございます。 e.printStackTrace();にブレークポイントを置いてデバッグしてみましたが 変数に表示されているのは this ThreadPoolExector args ThreadPoolExector$Worker  のみです。 クリーンしてから }catch(SQLException e) { にブレークしてからF5を押しましたが 変数は先ほどと変わりませんでした。
kumatarou

2015/11/10 10:46

他のmodelも載せたほうが宜しいでしょうか?
eripong

2015/11/10 11:06 編集

横から失礼します。 なんだか変ですね。 きちんとコンパイルされているのでしょうか? CardDataDAOのfindAllを public List<CardData> findAll(){ return new ArrayList<CardData>(); } にしたら、動作は変わりますか?
anonymouskawa

2015/11/11 01:16

他のモデルというよりも、もうファイル一式もらって見ちゃったほうが早い気がしてきた…
kumatarou

2015/11/11 01:41

eripong様 返信が遅くなってしまい申し訳ございません。 やってみましたが変わりませんでした。 anonymouskawa様 結構な量になってしまいます・・・ ファイルごとここに載せることは可能ですか?
anonymouskawa

2015/11/11 01:47

eripongさんの内容で変わらないというのはどうにもわからなくなりますね…。 ファイルは、ZIP圧縮してどこかサーバー経由でURLを貼って貰えると良いと思います。
eripong

2015/11/11 01:53

動作が変わらない、というのは、DAOからnullが返って、 エラー画面になるということを確認したということでよいでしょうか? そうすると、コンパイルできていないか、 クラスパスのどこかに同じDAOクラスがあって、 そちらが使われているかでしょうか。
argius

2015/11/11 01:57

こうなってくると、Eclipse側の設定とかの問題な気もしますが... e.printStackTrace()が出力されないというのも変ですし。
eripong

2015/11/11 02:04

そうですね。 最初の質問と変わってきているので、 この質問は終わりにして、 新たに質問した方がよい気がします。
kumatarou

2015/11/11 02:10

皆様。2日間に渡ってお付き合い頂いて本当にありがとうございました。 eripong様のおっしゃったように質問が変わってきそうですので また改めて質問したいと思います。 図々しいようですが、もし宜しければそちらでも助けて頂ければ幸いです。 anonymouskawa様 後ほど圧縮したファイルをサーバー経由してURLで貼り付けますので、その時は宜しくお願い致します。 皆様。本当にありがとうございました。
kumatarou

2015/11/11 05:29

mysqlのデータが66件入っていたため、while~add内で無限ループしていると勘違いしていました。申し訳ございません。 String sql = (省略)limit1とやると、mysqlにあるデータの一番上がnullであったため nullで返されたのだと思います。説明不足でした。大変失礼たしました。 mysqlのデータを1件にし、limit1を外して String sql = (省略)  from card_data order by first_name asc "; とやるとコンソールに別のエラーが出ました。これはservletに問題があるということなのでしょうか?宜しければ、もう少しお付き合い頂けたらと思います。 11 11, 2015 1:27:42 午後 org.apache.catalina.core.StandardWrapperValve invoke 重大: サーブレット servlet.Decision のServlet.service()が例外を投げました java.lang.NullPointerException at dao.CardDataDAO.create(CardDataDAO.java:97) at model.InLogic.execute(InLogic.java:8) at servlet.Decision.doGet(Decision.java:31) at javax.servlet.http.HttpServlet.service(HttpServlet.java:620) at javax.servlet.http.HttpServlet.service(HttpServlet.java:727) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:303) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122) at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98) at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116) at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408) at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040) at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607) at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:313) at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) at java.lang.Thread.run(Thread.java:744)
anonymouskawa

2015/11/11 05:34 編集

>mysqlのデータが66件入っていたため、while~add内で無限ループしていると勘違いしていました。申し訳ございません。 はい、なんとなくそうだろうなーと思っていたので「1件指定」にしたのです。大丈夫です。 でもまさかデータがNULLとは…。 ちょっとソース見てみます。 あと、テーブル定義もあると嬉しいです。贅沢いうと、今回対象のCreate文があると嬉しいです。
argius

2015/11/11 05:35

Decision.java:27行目で、session.getAttribute("ConfirmationServlet")から返される値がnullなのでエラーになっています。 この前段階の処理で、ConfirmationServletを流していますか? いきなりDecisionを実行していませんよね?
kumatarou

2015/11/11 05:41

意図が読み取れず失礼しました。 すみません、お願い致します。 テーブルの構造で宜しいでしょうか?こちらになります。 >今回対象のCreate文があると嬉しいです。 御用意したいのですが・・・、対象のCreate文とはどう言うことでしょうか?すみません。 +-------------------+--------------+------+-----+---------------------+--------- --------------------+ | Field | Type | Null | Key | Default | Extra | +-------------------+--------------+------+-----+---------------------+--------- --------------------+ | card_id | mediumint(8) | NO | PRI | NULL | auto_inc rement | | business_unit | varchar(100) | YES | | NULL | | | division | varchar(100) | YES | | NULL | | | section | varchar(100) | YES | | NULL | | | last_name | varchar(45) | YES | | NULL | | | last_name_kana | varchar(45) | YES | | NULL | | | first_name | varchar(45) | YES | | NULL | | | first_name_kana | varchar(45) | YES | | NULL | | | email | varchar(100) | YES | | NULL | | | company_name | varchar(100) | YES | | NULL | | | company_name_kana | varchar(100) | YES | | NULL | | | address_number | varchar(45) | YES | | NULL | | | address | varchar(100) | YES | | NULL | | | tel_direct | varchar(45) | YES | | NULL | | | tel_main | varchar(45) | YES | | NULL | | | fax | varchar(45) | YES | | NULL | | | url | varchar(100) | YES | | NULL | | | corp_note | text | YES | | NULL | | | create_date | timestamp | NO | | CURRENT_TIMESTAMP | on updat e CURRENT_TIMESTAMP | | modify_date | timestamp | NO | | 0000-00-00 00:00:00 | | | delete_flag | tinyint(1) | YES | | NULL | | +-------------------+--------------+------+-----+---------------------+--------- --------------------+
kumatarou

2015/11/11 05:52

argius様 ConfirmationServlet→jsp→Decisionという流れになるのですが 前段階ということはConfirmationServletの部分で宜しいでしょうか? *ConfirmationServletパッケージ public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //リクエストパラメーター取得(文字入力の受け付け) request.setCharacterEncoding("UTF-8"); String company_name = request.getParameter("company_name"); String company_name_kana = request.getParameter("company_name_kana"); String business_unit = request.getParameter("business_unit"); String division = request.getParameter("division"); String section = request.getParameter("section"); String last_name = request.getParameter("last_name"); String first_name = request.getParameter("first_name"); String last_name_kana = request.getParameter("last_name_kana"); String first_name_kana = request.getParameter("first_name_kana"); String address = request.getParameter("address"); String email = request.getParameter("email"); String url = request.getParameter("url"); String address_number = request.getParameter("address_number"); String tel_main = request.getParameter("tel_main"); String tel_direct = request.getParameter("tel_direct"); String fax = request.getParameter("fax"); //入力値をプロパティに設定 CardData confirmationServlet = new CardData(company_name, company_name_kana, business_unit, last_name, first_name, last_name_kana, first_name_kana, section, url, address_number, email, division, tel_main, tel_direct, address, fax); //セッションスコープに保存 HttpSession session = request.getSession(); session.setAttribute("ConfirmationServlet", confirmationServlet); //フォワード先 String forwardPath = null; forwardPath = "WEB-INF/jsp/Confirmation.jsp"; //リクエストパラメーターをチェック String errorMsg = ""; if(company_name == null || company_name.length() == 0){ errorMsg += "会社名が入力されてません"; forwardPath = "WEB-INF/jsp/Err.jsp"; } if(last_name == null || last_name.length() == 0){ errorMsg += "姓が入力されてません"; forwardPath = "WEB-INF/jsp/Err.jsp"; } if(first_name == null || first_name.length() == 0){ errorMsg += "名が入力されてません"; forwardPath = "WEB-INF/jsp/Err.jsp"; } //フォワード RequestDispatcher dispatcher = request.getRequestDispatcher(forwardPath); dispatcher.forward(request, response); } }
kumatarou

2015/11/11 05:58

(追記) >この前段階の処理で、ConfirmationServletを流していますか?いきなりDecisionを実行していませんよね? ユーザーから受け付けた値を ConfirmationServlet に入れて、それをDecisionに流して cd に代入しています。(質問のお答えになっているでしょうか・・・すみません。)
argius

2015/11/11 06:06

ソースコード全体は私も拝見しましたのでもう貼っていただかなくても大丈夫です。 あとはセッションキーの文字列が間違っていたりとか考えましたが、ソースコードを見る限りでは特に問題なさそうですね。 セットする側ではnullになるような要素がなさそうなので、 なぜセッションからCardDataが取り出せないのか、だとは思うのですが...
argius

2015/11/11 06:24

念のためですが、ConfirmationServlet→jsp→Decisionの間に、再起動とかはさんでいませんよね? 再起動するとセッションがクリアされてしまいます。
kumatarou

2015/11/11 06:49

argius様 再起動はせず、そのまま流しています。 皆様 何故かにjspに表示することができました!!! (mysqlを綺麗にしたことくらいしかしてないのですが・・・) 何故できたのか私にもわかりません。 お手伝いして頂いたにも関わらず、はっきりとした回答を述べることができなくて すみません。 皆様にはお知恵を貸していただいたり、やっていただいたりと本当に頭が上がりません。 長い間お付き合い頂き、本当にありがとうございました!
anonymouskawa

2015/11/11 06:52

解決出来たなら良かったです。
kumatarou

2015/11/11 07:13

anonymouskawa様 最初から最後までお付き合い頂き本当にありがとうございました。 anonymouskawa様に助けていただけて本当に良かったです!
guest

0

ベストアンサー

試しに、
List<CardData> cdList = (List<CardData>)request.getAttribute("cdList");
ではなくて、この部分をnewとかして手動でオブジェクトを詰めてみてください。

投稿2015/11/10 01:57

anonymouskawa

総合スコア856

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

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

kumatarou

2015/11/10 02:05

回答ありがとうございます。 手動でオブジェクトを詰めるといは、どういう意味でしょうか・・・ 無知で申し訳ございません。
anonymouskawa

2015/11/10 02:20

スマホなので細かい情報が打てないのですが、私の考えはargiusさんと同じで値が取れていないのではないかと疑っています。 一番良いのはデバッグでaction側で値がきちんと詰められているか確認することなのですが…。 処理誤りを確認するのであれば、ダミーデータをつくることでも確認できるのと思ったのです。
kumatarou

2015/11/10 02:36

返信ありがとうございます。 デバックしたところDAOで値がnullになっていて、取れてきていませんでした・・・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問