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

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

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

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

Q&A

解決済

1回答

960閲覧

JSPを実行すると"HTTPステータス 500"が発生する

ypk

総合スコア83

JSP

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

例外処理

例外処理(Exception handling)とは、プログラム実行中に異常が発生した場合、通常フローから外れ、例外として別の処理を行うようにデザインされたプログラミング言語構造です。

コードレビュー

コードレビューは、ソフトウェア開発の一工程で、 ソースコードの検査を行い、開発工程で見過ごされた誤りを検出する事で、 ソフトウェア品質を高めるためのものです。

0グッド

0クリップ

投稿2020/08/31 05:30

編集2020/08/31 06:35

こんにちは。現在JSPの学習をしています。

下記のようなソースコードを記述し、実行してみたところ例外が発生してしまいます。

イメージ説明

何か気になる箇所などございましたらご教授いただければ幸いです。どうぞよろしくお願いいたします。

###実現したいこと

bookList.jspを実行するとGenreDAOに詰めたメインジャンルIDが画面に出力されるようにしたい。

//一つ目のメインジャンル情報をDTOにセット info.setMainGenresId("000014"); //2つ目のメインジャンル情報をDTOにセット info.setMainGenresId("000014");

info.setMainGenresId("000014");

の部分です。

###困っていること
現在の私のソースコードでは、bookList.jspを実行すると"HTTPステータス 500"が発生します。

私の想定では、bookList.jspを実行すると

000014
000014

と出力される想定なのですが、、、
**
理由はbookList.jspを実行した瞬間InitializationListener.javaがDAOからジャンルの情報を取得してくれると解釈しているからです。**

これは

ArrayList<GenreDTO> maingenreList = (ArrayList<GenreDTO>)application.getAttribute("maingenreList");

にてGenreDAOにセットした情報をInitializationListener.javaにてセットすることができていないために起きているのでしょうか。それとも、単純にbookList.jspの

<% for(int i=0;i<maingenreList.size();++i){ GenreDTO info = maingenreList.get(i); %>

の部分に何かしらの誤りがあるのでしょうか。赤波線などはEclipseでは確認できていません。

お手数をおかけしますが、どうぞよろしくお願いいたします。

###私のソースコード

bookList

1<%@ page import="java.util.ArrayList" %> 2<%@ page import="dto.GenreDTO" %> 3<%@ page import="javax.servlet.ServletContext" %> 4<%@ page import="javax.servlet.ServletContextEvent" %> 5<%@ page import="javax.servlet.ServletContextListener" %> 6<%@ page language="java" contentType="text/html; charset=UTF-8" 7 pageEncoding="UTF-8"%> 8<!DOCTYPE html> 9<html> 10<head> 11<meta charset="UTF-8"> 12<title>書籍情報一覧画面</title> 13</head> 14<body> 15 16<% 17 ArrayList<GenreDTO> maingenreList = (ArrayList<GenreDTO>)application.getAttribute("maingenreList"); 18 19%> 20 21<table> 22 <tr> 23 <th>メインジャンルID</th> 24 25 26 </tr> 27 28 <% for(int i=0;i<maingenreList.size();++i){ 29 GenreDTO info = maingenreList.get(i); 30 %> 31 <tr> 32 <td> 33 <%= info.getMainGenresId() %> 34 </td> 35 36 </tr> 37 <%}%> 38</table> 39</body> 40</html>

InitializationListener

1package mutual; 2 3import java.util.ArrayList; 4 5import javax.servlet.ServletContext; 6import javax.servlet.ServletContextEvent; 7import javax.servlet.ServletContextListener; 8 9import common.LogManager; 10import dao.GenreDAO; 11import dto.GenreDTO; 12 13public class InitializationListener implements ServletContextListener { 14 public void contextInitialized(ServletContextEvent event) { 15 16 17 // ログの出力 18 LogManager lg = new LogManager(); 19 lg.outMethodLog("", null); 20 21 ServletContext context = event.getServletContext(); 22 23 try { 24 25 GenreDAO bn = new GenreDAO(); 26 ArrayList<GenreDTO> maingenreList = bn.searchAllMain(); 27 28 // genreListデータをapplicationスコープで保存 29 context.setAttribute("maingenreList", maingenreList); 30 31 ArrayList<GenreDTO> subGenreList = bn.searchAllSub(); 32 33 // genreListデータをapplicationスコープで保存 34 context.setAttribute("subGenreList", subGenreList); 35 36 // 投げた例外をException型の変数e1で受取る 37 } catch (Exception e1) { 38 // e1の中には例外に関する情報が詰まっている。それをログで出力してあげる 39 lg.outExceptionLog(e1, null, null); 40 41 } 42 } 43 44 public void contextDestoryed(ServletContextEvent event) { 45 ServletContext context = event.getServletContext(); 46 context.removeAttribute("allgenreList"); // 削除処理 47 } 48} 49

GenreDAO

1package dao; 2import java.io.Serializable; 3import java.sql.SQLException; 4import java.util.ArrayList; 5 6import javax.naming.NamingException; 7 8import dto.GenreDTO; 9 10public class GenreDAO implements Serializable { 11 12 //セットしたメインジャンル情報を取得 13 public ArrayList<GenreDTO> searchAllMain() 14 throws NamingException,SQLException{ 15 16 17 ArrayList<GenreDTO> genre = new ArrayList<GenreDTO>(); 18 GenreDTO info = new GenreDTO(); 19 20 //一つ目のメインジャンル情報をDTOにセット 21 info.setMainGenresId("000014"); 22 genre.add(info); 23 24 //2つ目のメインジャンル情報をDTOにセット 25 info.setMainGenresId("000014"); 26 genre.add(info); 27 28 // 戻り値の設定 29 return genre; 30 31 32 } 33 34 }

GenreDTO

1package dto; 2 3import javax.servlet.annotation.WebServlet; 4/** 5 * Servlet implementation class GenreDTO 6 */ 7@WebServlet("/dto/GenreDTO") 8// シリアライズを行う 9public class GenreDTO implements java.io.Serializable{ 10 11 //メンバ変数の定義 12 private String main_genres_id; 13 14 15 //---------------------以下getter処理------------------------------------------------- 16 17 //呼び出し元へメインジャンルIDを返す 18 public String getMainGenresId() { 19 return main_genres_id; 20 } 21 22 //---------------------以下setter処理------------------------------------------------- 23 24 //メインジャンルIDに呼び出し元から受け取った値を設定する 25 public void setMainGenresId(String main_genres_id) { 26 this.main_genres_id = main_genres_id; 27 } 28 29 30}

###追記

デバックをしてみた結果、InitializationListener.javaが動いていないことが判明しました。

ArrayList<GenreDTO> maingenreList = (ArrayList<GenreDTO>)application.getAttribute("maingenreList");

をしたときにmaingenreListには情報が何もセットされておらずnullになってしまいます。
これはいったいどうしてなのでしょうか、、、Tomcatに何か、ソースコードを記述しないといけないのでしょうか。それとも新しい何かをインポートする必要があるのでしょうか、、、、

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

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

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

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

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

guest

回答1

0

ベストアンサー

InitializationListenerが動作していないのであれば、動作するよう設定すれば、

java

1context.setAttribute("maingenreList", maingenreList);

で、maingenreListがnullでない限りは、JSPにて

html

1application.getAttribute("maingenreList");

で取得できます。

サーブレットのリスナーは、起動させたいリスナーに合わせたインタフェースを実装+リスナー利用を宣言しなければ動作しません。

宣言方法は、アノテーションによる宣言か、web.xmlによる設定のどちらかを利用します。以下はweb.xmlの設定方法です。

http://www.javaroad.jp/servletjsp/sj_servlet8.htm

投稿2020/08/31 09:31

A-pZ

総合スコア12011

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

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

ypk

2020/08/31 12:21

ありがとうございます! なるほど、、、リスナーとは、クラスとはまた別のものなのでしょうか、、、、?両者の違いがよくわかっておらず、、、お手数をおかけしますがどうぞよろしくお願いいたします。
A-pZ

2020/08/31 12:53

サーブレットのリスナーは、サーブレットコンテキスト(=application属性)やセッション属性に何らかの変更があった場合(アプリケーションの起動、停止、セッション属性の追加、変更、削除など)に、自動的に起動するJavaクラスです。
ypk

2020/09/01 01:57

なるほど、、、、!ありがとうございます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問