お世話になります。
表題について質問です。
いま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でエラーを捕捉していない
もはやソースコード上の問題なのか不明です。
回答4件
あなたの回答
tips
プレビュー