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

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

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

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

Java

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

servlet

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

Q&A

解決済

4回答

3967閲覧

サーブレット/jspについて

退会済みユーザー

退会済みユーザー

総合スコア0

JSP

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

Java

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

servlet

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

0グッド

0クリップ

投稿2016/07/31 03:30

編集2016/08/02 06:09

お世話になります。

表題について質問です。
いまMySQLに保存してある{int型 id, string型 name, string型 text}の3つを取得し、jspで出力を行おうとしています。

使用しているファイルは、
GetMutterListLogic.java(BO)
Mutter.java(javaBeans)
Main.java(サーブレット)
MutterDAO.java(DAO)
main.jsp
です。

流れとして、
①GetMutterListLogic.javaとMutterDAO.javaを使用して、DBから情報を取得し、Main.javaで受け取ります。そして、②受け取ったものをリクエストスコープに登録し、jspで登録したものを取り出す。といった流れです。

しかし、②で情報は取得できているのかがわかりません。
というのも、jsp側で、
List< Mutter > mutterList = (List< Mutter >) request.getAttribute( "mutterList" );
として受け取っているつもりなのですが、<%= mutterList %>をすると[]とだけ表示されます。また、<%= mutterList.size() %>とすると0と表示されます。

これは恐らく情報が取得できていないんだろうなと思うのですが、ディレクトリ構造のmodelパッケージの同階層にtestパッケージを作り、その中にテスト用のクラスを作り下記のように実行したところ、しっかりと出力されました。

何か原因がわかる方ご教授のほどお願い致します。

java

1package test; 2 3import java.util.List; 4 5import model.GetMutterListLogic; 6import model.Mutter; 7 8public class Test{ 9 10 public static void main( String[] args ){ 11 GetMutterListLogic gm = new GetMutterListLogic(); 12 List< Mutter > mutterList = gm.execute(); 13 14 for( Mutter mutter : mutterList ) { 15 System.out.print( mutter.getUserName() + ":" ); 16 System.out.println( mutter.getText() ); 17 } 18 19 } 20 21} 22 23/* 24出力結果 25接続...ok 26rin:wanwanwan!!! 27pun:wan! 28*/

ここから実際のソースコード

java

1// Main.java 2GetMutterListLogic gm = new GetMutterListLogic(); 3 List< Mutter > mutterList = gm.execute(); 4 request.setAttribute( "mutterList", mutterList ); 5 6 RequestDispatcher dispatcher = request.getRequestDispatcher( "/WEB-INF/jsp/main.jsp" ); 7 dispatcher.forward( request, response );

java

1// GetMutterListLogic.java 2package model; 3 4import java.util.List; 5 6import dao.MutterDAO; 7 8public class GetMutterListLogic{ 9 public List< Mutter > execute(){ 10 MutterDAO dao = new MutterDAO(); 11 List< Mutter > mutterList = dao.findAll(); 12 return mutterList; 13 } 14 15}

java

1// main.jsp 2<%@ page language="java" contentType="text/html; charset=UTF-8" 3 pageEncoding="UTF-8"%> 4 5<%@ page import="model.User, java.util.List, model.Mutter" %> 6 7<% 8 User loginUser = (User) request.getAttribute( "loginUser" ); 9 List< Mutter > mutterList = (List< Mutter >) request.getAttribute( "mutterList" ); 10 String errorMsg = (String) request.getAttribute( "errorMsg" ); 11%> 12 13<!DOCTYPE html> 14<html> 15<head> 16<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 17<title>つぶやくやつ</title> 18</head> 19<body> 20 21<h3>メイン</h3> 22<a href="/docoTsubu/Logout">ログアウト</a> 23<p><a href="/docoTsubu/Main">更新</a></p> 24 25<form action="/docoTsubu/Main" method="post"> 26 <input type="text" name="text"/> 27 <input type="submit" value="つぶやく"/> 28</form> 29 30<% if(mutterList != null){%> 31 つぶやきはあります。 32 <%= mutterList.size()%>33<% } else { %> 34 <p>つぶやいてみよう!</p> 35<% } %> 36 37 38<jsp:include page="footer.jsp"></jsp:include> 39</body> 40</html> 41 42/******** 43出力結果 44 45つぶやきはあります。 0 件 46 47******/ 48

追記情報です。

java

1package servlet; 2 3import java.io.IOException; 4import java.util.List; 5 6import javax.servlet.RequestDispatcher; 7import javax.servlet.ServletException; 8import javax.servlet.annotation.WebServlet; 9import javax.servlet.http.HttpServlet; 10import javax.servlet.http.HttpServletRequest; 11import javax.servlet.http.HttpServletResponse; 12import javax.servlet.http.HttpSession; 13 14import model.GetMutterListLogic; 15import model.Mutter; 16import model.PostMutterLogic; 17import model.User; 18 19@WebServlet( "/Main" ) 20public class Main extends HttpServlet{ 21 private static final long serialVersionUID = 1L; 22 23 protected void doGet( HttpServletRequest request, HttpServletResponse response ) 24 throws ServletException, IOException{ 25 26 // DBからつぶやきリストを取得→リクエストスコープに保存 27 GetMutterListLogic gm = new GetMutterListLogic(); 28 List< Mutter > mutterList = gm.execute(); 29 request.setAttribute( "mutterList", mutterList ); 30 31 // ここでセッションIDをキーにインスタンスを取得 32 HttpSession session = request.getSession(); 33 User loginUser = ( User ) session.getAttribute( "loginUser" ); 34 35 if( loginUser == null ) { 36 response.sendRedirect( "/docoTsubu/" ); 37 } else { 38 RequestDispatcher dispatcher = request.getRequestDispatcher( "/WEB-INF/jsp/main.jsp" ); 39 dispatcher.forward( request, response ); 40 } 41 42 } 43 44 protected void doPost( HttpServletRequest request, HttpServletResponse response ) 45 throws ServletException, IOException{ 46 47 String text = request.getParameter( "text" ); 48 49 if( text != null && text.length() != 0 ) { 50 HttpSession session = request.getSession(); 51 User loginUser = ( User ) request.getAttribute( "loginUser" ); 52 53 Mutter mutter = new Mutter( loginUser.getName(), text ); 54 PostMutterLogic pm = new PostMutterLogic(); 55 pm.execute( mutter ); 56 57 } else { 58 request.setAttribute( "errorMsg", "つぶやきが入力されていません" ); 59 } 60 61 GetMutterListLogic gm = new GetMutterListLogic(); 62 List< Mutter > mutterList = gm.execute(); 63 request.setAttribute( "mutterList", mutterList ); 64 65 RequestDispatcher dispatcher = request.getRequestDispatcher( "/WEB-INF/jsp/main.jsp" ); 66 dispatcher.forward( request, response ); 67 68 } 69 70} 71 72コード

追記2

下記にデバッグ結果を書きます

java

1protected void doGet( HttpServletRequest request, HttpServletResponse response ) 2 throws ServletException, IOException{ 3 4 GetMutterListLogic gm = new GetMutterListLogic(); 5 List< Mutter > mutterList = gm.execute(); 6 request.setAttribute( "mutterList", mutterList ); 7 // ↑ブレークポイント 8 } 9/* 10* mutterList : ArrayList<E> 11* elementData : Object[0] 12* modCount : 0 13* size : 0 14* 15*/ 16

java

1package test; 2 3import java.util.List; 4 5import model.GetMutterListLogic; 6import model.Mutter; 7 8public class Test{ 9 10 public static void main( String[] args ){ 11 GetMutterListLogic gm = new GetMutterListLogic(); 12 List< Mutter > mutterLista = gm.execute(); 13 14 for( Mutter mutter : mutterLista ) { 15 // ↑ブレークポイント 16 System.out.print( mutter.getUserName() + ":" ); 17 System.out.println( mutter.getText() ); 18 } 19 20 } 21 22} 23 24/* 25* 26* mutterList 27* elementData : Object[10] 28* modCount : 2 29* size : 2 30* 31*/

こう見ると、そもそもサーブレットクラスのMain.javaで取得ができていないようですね、、。


追記3

DAOクラスのfindAll()までデバッグを行いました。

結果、Test.javaではfindAll()でDBからの情報を取得し、しっかりと返り値を返しています。しかし、Main.javaではfindAll()ではtry{}が全てスキップしており、finally{}のみ実行されていました。(コードは最後に書きます)

関係しているファイルは最初に記載した通りで、今回の流れではDBにSELECT文しか送っておらず、かなり簡単なもののはずですが、どこがおかしいのか、、、。

java

1package dao; 2 3import java.sql.Connection; 4import java.sql.DriverManager; 5import java.sql.PreparedStatement; 6import java.sql.ResultSet; 7import java.sql.SQLException; 8import java.util.ArrayList; 9import java.util.List; 10 11import model.Mutter; 12 13public class MutterDAO{ 14 private final String DRIVER_NAME = "com.mysql.jdbc.Driver"; 15 private final String JDBC_URL = "jdbc:mysql://localhost:8889/docoTsubu"; 16 private final String DB_USER = "○○○○○○○"; 17 private final String DB_PASS = "○○○○○○○"; 18 19 public List< Mutter > findAll(){ 20 Connection con = null; 21 List< Mutter > mutterList = new ArrayList<>(); 22 23 try { 24 Class.forName( DRIVER_NAME ); 25 con = DriverManager.getConnection( JDBC_URL, DB_USER, DB_PASS ); 26 27 // SQLの準備 28 String sql = "SELECT id, name, text FROM mutter ORDER BY id DESC"; 29 PreparedStatement pstmt = con.prepareStatement( sql ); 30 ResultSet rs = pstmt.executeQuery(); 31 32 while( rs.next() ) { 33 int id = rs.getInt( "id" ); 34 String userName = rs.getString( "name" ); 35 String text = rs.getString( "text" ); 36 Mutter mutter = new Mutter( id, userName, text ); 37 mutterList.add( mutter ); 38 } 39 40 } catch ( ClassNotFoundException e ) { 41 e.printStackTrace(); 42 } catch ( SQLException e ) { 43 e.printStackTrace(); 44 } finally { 45 if( con != null ) { 46 try { 47 con.close(); 48 49 } catch ( SQLException e ) { 50 e.printStackTrace(); 51 } 52 } 53 } 54 55 return mutterList; 56 } 57 58 public boolean create( Mutter mutter ){ 59 Connection con = null; 60 try { 61 con = DriverManager.getConnection( JDBC_URL, DB_USER, DB_PASS ); 62 63 String sql = "INSERT INTO mutter( name, text ) VALUES( ?, ? )"; 64 PreparedStatement pstmt = con.prepareStatement( sql ); 65 pstmt.setString( 1, mutter.getUserName() ); 66 pstmt.setString( 2, mutter.getText() ); 67 68 int result = pstmt.executeUpdate(); 69 70 if( result != 1 ) { 71 return false; 72 } 73 74 } catch ( SQLException e ) { 75 e.printStackTrace(); 76 } finally { 77 if( con != null ) { 78 try { 79 con.close(); 80 81 } catch ( SQLException e ) { 82 e.printStackTrace(); 83 } 84 } 85 } 86 87 return true; 88 } 89 90} 91

追記4

Main.javaとTest.javaではDAOのfindAll()内の処理が異なるようです。
1 : Main.java、Test.javaはともにClass.forName( DRIVER_NAME );までは読み込む
2 : Main.javaはその後finally{}へ飛ぶ
3 : Test.javaは順調にcon = DriverManager.getConnection( JDBC_URL, DB_USER, DB_PASS );を読み込む
4 : 仮にClass.forName()でエラーを出していた場合、ClassNotFoundExceptionでエラーを捕捉していない

もはやソースコード上の問題なのか不明です。

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

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

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

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

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

A-pZ

2016/07/31 03:43

サーブレットと思われるMainクラスが省略されておられますが、ここに問題があるかと思われます。おそらくテストを作成するにあたり改変されたのではないかと思われるので、この内容を記載すると回答が得られるでしょう。
退会済みユーザー

退会済みユーザー

2016/07/31 03:52

サーブレットクラスのMain.javaのすべてのコードを追記しました!
asahina_dev

2016/07/31 07:09

よくあるはなしだけど デフォルトのオートコミットOFFじゃないよね?
退会済みユーザー

退会済みユーザー

2016/07/31 09:07

asahida_devさん 特に自動コミットモードをオフにしていないので、いまはONの状態だと思います!逆にこれはOFFにしてトランザクションを使った方が良いでしょうか??
asahina_dev

2016/07/31 11:05

2件以上相関データを登録するなら OFF 推奨
退会済みユーザー

退会済みユーザー

2016/08/01 05:09

asahida_devさん ありがとうございます! 今日ご指摘いただいたように修正し、再度トライしてみたいと思います。
guest

回答4

0

ベストアンサー

解決しましたー!

2つの方法を同時に試したのでどちらで解決したのか不明ですが、
1 : jdbcドライバを"mysql-connector-java-5.1.39"のままWEB-INFディレクトリのlibに置いていたのを、"mysql-connector-java-5.1.39-bin.jar"に変更
2 : 別のプロジェクトを作成している時に気付いたのですが、あるクラスをインスタンス化する際に、別プロジェクト配下の同一名のクラスを参照していたので、関係のないプロジェクトを全部閉じる

以上2点で解決しました!

みなさまご迷惑をおかけしました。本当にありがとうございます!
ベストアンサーはA-pZさんにしたいと思います!

投稿2016/08/03 09:40

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2016/08/03 09:41

あれ、ベストアンサー選択できない、、
guest

0

DAOで突然finallyへ遷移しているのであれば、jdbcドライバがWEB-INF/libに配置されていないため、スタックトレースが出でいるはずです。なお、DAOで発生した例外をe.printStackTrace()で出力するだけでは、処理を呼び出したクラスがエラーだったのかを判断できないため、エラーであるかを制御するようにしましょう。

投稿2016/08/01 05:02

A-pZ

総合スコア12011

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

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

退会済みユーザー

退会済みユーザー

2016/08/01 05:14

A-pZさん、ご指摘ありがとうございます! Main.javaと同階層にあるTest.javaではDAOは問題なく処理されているのですが、これでも「jdbcドライバがWEB-INF/libに配置されていない」ということが原因とになるのでしょうか? ひとまず、ご指摘いただいた箇所を修正し、本日再トライをしてみたいと思います! ありがとうございます!
退会済みユーザー

退会済みユーザー

2016/08/02 05:42

A-pZさん、お世話になります。 ご指摘いただいたようにjdbcドライバをWEB-INF/libに配置してパスを通しましたが改善されませんでした。 デバッグで調べていったところ、Test.javaではDAOのfindALL()のtry{ }は全て処理されていますが、Test.javaではDAOのfindALL()のtry{ }はClass.forName( DRIVER_NAME );の後、すぐにfinally{ }に飛ばされました。(Class.forName( DRIVER_NAME );をブレークポイントに設定)
guest

0

java

1 protected void doPost( HttpServletRequest request, HttpServletResponse response ) 2 throws ServletException, IOException{ 3 4 String text = request.getParameter( "text" ); 5 6 if( text != null && text.length() != 0 ) { 7 HttpSession session = request.getSession(); 8 User loginUser = ( User ) request.getAttribute( "loginUser" ); 9 10 Mutter mutter = new Mutter( loginUser.getName(), text ); 11 PostMutterLogic pm = new PostMutterLogic(); 12 pm.execute( mutter ); 13 14 } else { 15 request.setAttribute( "errorMsg", "つぶやきが入力されていません" ); 16 } 17 18 GetMutterListLogic gm = new GetMutterListLogic(); 19 List< Mutter > mutterList = gm.execute(); 20 request.setAttribute( "mutterList", mutterList ); 21 22 RequestDispatcher dispatcher = request.getRequestDispatcher( "/WEB-INF/jsp/main.jsp" ); 23 dispatcher.forward( request, response ); 24 25 }

java

1 protected void doPost( HttpServletRequest request, HttpServletResponse response ) 2 throws ServletException, IOException{ 3 4 String text = request.getParameter( "text" ); 5 6 if( text != null && text.length() != 0 ) { 7 HttpSession session = request.getSession(); 8 User loginUser = ( User ) session.getAttribute( "loginUser" ); 9 10 Mutter mutter = new Mutter( loginUser.getName(), text ); 11 PostMutterLogic pm = new PostMutterLogic(); 12 pm.execute( mutter ); 13 14 } else { 15 request.setAttribute( "errorMsg", "つぶやきが入力されていません" ); 16 } 17 18 GetMutterListLogic gm = new GetMutterListLogic(); 19 List< Mutter > mutterList = gm.execute(); 20 request.setAttribute( "mutterList", mutterList ); 21 22 RequestDispatcher dispatcher = request.getRequestDispatcher( "/WEB-INF/jsp/main.jsp" ); 23 dispatcher.forward( request, response ); 24 25 }

ではないのですか?

投稿2016/07/31 03:58

asahina_dev

総合スコア610

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

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

退会済みユーザー

退会済みユーザー

2016/07/31 04:12

ご指摘いただいた点、main.jspの方でも同様のミスをしていました、、。(笑) ありがとうございます! ただ、今回の問題とは関係のないようで、解決には至りませんでした。
guest

0

しかし、②で情報は取得できているのかがわかりません。

ServletでSystem.out.println()などを使って標準出力にDBから取得した内容を出力すると確認できると思います。Eclipseなどを使っていれば、デバッグ実行時にブレークポイントを設定することで確認したい変数の中身を確認できますよ。
さらに、DAOのfindAll()内でもデバッグできると思いますので、そちらの方が有効な情報がある可能性があります。
ご確認ください。

Servlet > JSPへの受け渡しは正しく記述できているように見えます。(未検証ですが)

投稿2016/07/31 03:46

takyafumin

総合スコア2335

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

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

退会済みユーザー

退会済みユーザー

2016/07/31 03:54

ご回答ありがとうございます! DAOのfindAll()は単体テストで情報を取得できていることを確認しているので、DAO自体には問題はないかと思われます。 『ServletでSystem.out.println()などを使って標準出力にDBから取得した内容を出力すると確認できると思います。Eclipseなどを使っていれば、デバッグ実行時にブレークポイントを設定することで確認したい変数の中身を確認できますよ。』についていまから検証を行いたいと思います。ありがとうございます!
takyafumin

2016/08/01 05:55

サーブレット実行時、Exceptionは発生せず、突然finallyが実行されていますか? Exceptionが発生している場合、発生しているExceptionとスタックトレースを追記願います。 また、A-pZさまの回答にもありますが、jdbcドライバのロードでこけている可能性が高いです。 jdbcドライバはどこに配置し、どのようにクラスパスに設定していますか? webアプリケーションではWEB-INF/libに参照するライブラリを配備する必要があります。
退会済みユーザー

退会済みユーザー

2016/08/03 10:37

takyahumiさん、申し訳ありません。いまスマホ表示で質問の追記をされていることに気が付きました。 詳しくは自己解決欄に記してありますが、恐らくご指摘いただいたように、jdbcドライバの配置箇所がよくありませんでした。 本当にご親切にありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問