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

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

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

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

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

servlet

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

Q&A

解決済

1回答

33712閲覧

SQLで取得した値をJSPで表示

junpi-ya

総合スコア17

JSP

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

Java

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

SQL

SQL(Structured Query Language)は、リレーショナルデータベース管理システム (RDBMS)のデータベース言語です。大きく分けて、データ定義言語(DDL)、データ操作言語(DML)、データ制御言語(DCL)の3つで構成されており、プログラム上でSQL文を生成して、RDBMSに命令を出し、RDBに必要なデータを格納できます。また、格納したデータを引き出すことも可能です。

servlet

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

0グッド

0クリップ

投稿2016/04/21 09:26

編集2016/04/21 16:34

ご回答頂けると幸いです。

java初めて数カ月になり、DBとSQLに挑戦中です(*‘ω‘ *)
SQLで取得した値をサーブレットからJSPに表示するプロジェクトを作成しております。

JAVAでは、SQLを使ってDBから値を取得できている様ですが、
上手くJSPで表示されず、HTTPステータス 500 エラー続きで困っております(-"-)
何度も調べてみて、色々ためしてみましたが、どれもうまく行かず、
どなたかご教授頂けると助かります。。。

よろしくお願いいたします。

環境は
・JSP
・Java
・Tomcat
・MYSQL
です。

サーブレット

package servlet;

import java.io.IOException;
import java.util.List;

import javax.servlet.RequestDispatcher;
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 bean.Member;
import dao.KHDataAccess;
import dao.SHDataAccess;

/**

  • Servlet implementation class MemberServlet

*/
@WebServlet("/MemberServlet")
public class MemberServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {

String seni = request.getParameter("cigmm"); if (seni.equals("kohjun")) { KHDataAccess KH = new KHDataAccess(); List<Member> MMlist = KH.findALL(); request.setAttribute("members",MMlist); RequestDispatcher dispatcher = request.getRequestDispatcher("/member002.jsp"); dispatcher.forward(request, response); } else if(seni.equals("shojun")) { SHDataAccess SH = new SHDataAccess(); List<Member> memberlist = SH.findALL(); request.setAttribute("members",memberlist); RequestDispatcher dispatcher = request.getRequestDispatcher("/member002.jsp"); dispatcher.forward(request, response); } }

}


dao

package dao;
package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.util.ArrayList;
import java.util.List;

import bean.Member;

public class KHDataAccess {

String user = "*****"; String passwd = "*****"; String url = "jdbc:mysql://localhost:3306/test"; public List<Member>findALL() { Connection con = null; Statement stmt = null; ResultSet rs = null; List<Member> memberList = new ArrayList<Member>(); try{//ドライバの読み込み Class.forName("com.mysql.jdbc.Driver"); con = DriverManager.getConnection(url,user,passwd); //SQL文実行 stmt = con.createStatement(); //SELECT文の実行--昇順で取得 String sql = "SELECT * FROM `cigmemberrist` ORDER BY `Department` ASC"; rs = stmt.executeQuery(sql); //ResultSetからデータの取り出し while(rs.next()){ String ID = rs.getString("ID"); String Name = rs.getString("Name"); String Department = rs.getString("Department"); Member member = new Member(ID,Name,Department); memberList.add(member); } }catch(SQLException e){ e.printStackTrace(); }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(rs !=null)rs.close(); if(stmt !=null)stmt.close(); if(con !=null)con.close(); }catch(Exception e){ e.printStackTrace(); } } return memberList; }

}


been

package been;

public class Member {
private String ID;
private String Name;
private String Department;

public String getId() { return ID; } public void setId(String ID) { this.ID = ID; } public String getName() { return Name; } public void setName(String Name) { this.Name = Name; } public String getDs() { return Department; } public void setDs(String Department) { this.Department = Department; } public Member(String ID, String Name, String Department) { this.ID = ID; this.Name = Name; this.Department = Department; } }

JSP
------------------------------------------------------------------------------------------------<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ page import="java.util.List"%>
<%@ page import="bean.Member"%>
<% List<Member>MMList=(List<Member>)request.getAttribute("members"); %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 5 Transitional//EN" "http://www.w3.org/TR/html5/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <link rel="stylesheet" href="member.css"> <title>CIGmember</title> </head> <body> <center> <font face="HGS明朝B" size="8" color="#00008b" class=h4>従業員名簿</font> <table> <tr> <th>社員ID</th> <th>氏名</th> <th>部署</th> </tr> <tr> <% for (Member member: MMList) {%> <%=member.getId()%> <%=member.getName()%> <%=member.getDs()%> <%} %> </tr> </table> </center> </body> </html>

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

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

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

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

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

umed0025

2016/04/21 09:36

findALLがnullを返すようになってますが、転記ミスでしょうか?
junpi-ya

2016/04/21 12:04

転記ミスではありません。。。。 nullはエラーの原因ではないと思ってたので、気にしていませんでした。 nullが原因でしょうか??
umed0025

2016/04/21 13:20

nullを返すと、JSP側でNullPointerExceptionが発生しているかなぁ。 原因については、スタックトレース(エラーログ)に出力されているとおもいますのでまずそちらの追記をお願いします。 また、環境についてもわかるようであれば追記をお願いします。
junpi-ya

2016/04/21 15:17

返信ありがとうございます(>_<) エラー文と環境を追加しました。よろしくお願いいたします。
guest

回答1

0

ベストアンサー

JSPを見ると、memberListの中身を繰り返して取り出している個所があります。
取り出したオブジェクトは、Memberクラスで、さらに次の行では、Memberの中身を取り出して表示しています。

JSP

1<% for (Member member: memberList) {%> 2 <%=member.getId()%> 3 <%=member.getName()%> 4 <%=member.getDs()%> 5<%} %>

ただし、もしmemberListがnullだった場合、nullのオブジェクトに対してgetIdやgetNameを実行してしまうため、NullPointerExceptionが発生します。

問題となるmemberListをJSPに渡しているのはサーブレットですね。
このサーブレットでは、以下のように読み取れます。

  1. リクエストパラメータ cigmm の値を取得する
  2. もし cigmm の値がkohjunなら、以下を実行する

(1) KHDataAccessクラスのfindAll()を実行して、ローカル変数のmemberListで受け取る
(2) セッション属性に membersの名前で memberList を格納する
(3) JSPを表示する
3. もし cigmm の値がshojunなら、以下を実行する
(1) SHDataAccessクラスのfindAll()を実行して、ローカル変数のmemberListで受け取る
(2) セッション属性に membersの名前で memberList を格納する
(3) JSPを表示する

サーブレットからJSPへ渡しているのは、セッション属性の members ですので、JSPで記述するのは、memberListではなく、members となります。

余談ですが、以下の点も気を付けるべきところではないかと思います。

  • このサーブレットを実行したとき、もしリクエストパラメータに cigmm がない、または kohjunやshojunでなかった場合、JSPは表示されません。
  • セッション属性に格納すると、今破棄するまでずっと同じ内容を持ち続けます。サーブレットからJSPへ値を渡すだけの場合は、リクエスト属性(request)を用います。
  • セッション属性に membersの名前で memberList を格納する処理とJSPを表示する処理が全く同じなので、if文の範囲を狭めることができます。

長くなりましたが参考になれば。

投稿2016/04/21 15:42

A-pZ

総合スコア12011

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

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

junpi-ya

2016/04/21 16:39

ご回答ありがとうございます!! 実走したいプロジェクトはおっしゃる通りです☺ ご教授頂いたのを参考に、ソースを更新してみました。 エラーはなくなり遷移できましたが、DBから値が取得されていませんでした。 eclipseのデバックが上手く使いこなせず。。。。初歩的な質問で申し訳ございません。 何度も確認しましたが、理由がわからず・・・ 何度も恐縮ですがご教授頂けると助かります(´・ω・`)
A-pZ

2016/04/24 04:08

ソースの更新ありがとうございます。 サーブレットの実装をみたところ、request.setAttribute("members",MMlist); となっていますね。setAttribute("JSPで参照する名前",値") ですので、JSPで値をループするところ→ for (Member member: MMList) は MMListではなく、members でよいのです。 JSPとサーブレットの間では変数をそのまま共有しないため、リクエスト属性やセッション属性に値をつめて渡すのですが、その時に必ず名前を付けます。 もしわかりにくい場合は、変数名とこの名前を同じにすると、よいかもしれませんね。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問