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

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

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

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

JSP

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

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

Q&A

解決済

1回答

4540閲覧

jspでHTTPステータス 500-Internal Server Error、org.apache.jasper.JasperException:

hon.ki

総合スコア157

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

JSP

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

Java

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

Eclipse

Eclipseは、IBM社で開発された統合開発環境のひとつです。2001年11月にオープンソース化されました。 たくさんのプラグインがあり自由に機能を追加をすることができるため、開発ツールにおける共通プラットフォームとして位置づけられています。 Eclipse自体は、Javaで実装されています。

Apache Tomcat

Apache TomcatはApache Software Foundation (ASF)で開発されたオープンソースのWebコンテナです。

0グッド

0クリップ

投稿2020/01/06 08:11

編集2020/01/06 08:38

###環境
Eclipse IDE for Enterprise Java Developers.
Version: 2019-06 (4.12.0)
Build id: 20190614-1200

mac os mojave 10.14.4
ターゲット・ランタイム
ローカルホスト の Tomcat8.5(Java8)およびTomcat9 (Java11)

derby: db-derby-10.14.2.0

###行った作業の手順
derby.jarを、動的プロジェクトを選択してプロジェクト→プロパティ→Javaのビルド・パス→ライブラリ→外部jarの追加で、db-derby-10.14.2.0のbin→derby.jarを選択して登録。
以下のファイルを配置して、Sample4.jspを右クリック→サーバーで実行
Sample4.jsp

<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ page import="java.util.*" %> <jsp:useBean id="cb" class="mybeans.CarDBBean" scope="request"/> <%! ArrayList colname; ArrayList data; %> <% colname = cb.getColname(); data = cb.getData(); %> <!DOCTYPE html> <html> <head> <title>サンプル</title> </head> <body> <div style="text-align: center;"> <h2>ようこそ</h2> <hr/> お選びください。<br/> <br/> <table border="1" style="margin-left: auto; margin-right:auto;"> <tr bgcolor="#E0C76F"> <% for(int column=0; column<colname.size(); column++){ %> <th> <%= (String) colname.get(column) %> </th> <% } %> </tr> <% for(int row=0; row<data.size(); row++){ %> <tr> <% ArrayList rowdata = (ArrayList) (data.get(row)); for(int column=0; column<rowdata.size(); column++){ %> <td> <%= rowdata.get(column) %> </td> <% } %> </tr> <% } %> </table> </div> </body> </html>

CarDBean.java

package mybeans; import java.io.Serializable; import java.sql.Connection; import java.sql.DatabaseMetaData; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.ResultSetMetaData; import java.sql.Statement; import java.util.ArrayList; public class CarDBBean implements Serializable { private ArrayList<String> colname; private ArrayList<ArrayList> data; public CarDBBean() { try{ //接続の準備 String url = "jdbc:derby:cardb;create=true"; String usr = ""; String pw = ""; //データベースへの接続 Connection cn = DriverManager.getConnection(url, usr, pw); //問い合わせの準備 DatabaseMetaData dm = cn.getMetaData(); ResultSet tb = dm.getTables(null, null, "車表", null); Statement st = cn.createStatement(); String qry1 = "CREATE TABLE 車表(番号 int, 名前 varchar(50))"; String[] qry2 = {"INSERT INTO 車表 VALUES (2, '乗用車')", "INSERT INTO 車表 VALUES (3, 'オープンカー')", "INSERT INTO 車表 VALUES (4, 'トラック')"}; String qry3 = "SELECT * FROM 車表"; if(!tb.next()){ st.executeUpdate(qry1); for(int i=0; i<qry2.length; i++){ st.executeUpdate(qry2[i]); } } //問い合わせ ResultSet rs = st.executeQuery(qry3); //列数の取得 ResultSetMetaData rm = rs.getMetaData(); int cnum = rm.getColumnCount(); colname = new ArrayList<String>(cnum); //列名の取得 for(int i=1; i<=cnum; i++){ colname.add(rm.getColumnName(i).toString()); } //行の取得 data = new ArrayList<ArrayList>(); while(rs.next()){ ArrayList<String> rowdata = new ArrayList<String>(); for(int i=1; i<=cnum; i++){ rowdata.add(rs.getObject(i).toString()); } data.add(rowdata); } //接続のクローズ rs.close(); st.close(); cn.close(); } catch(Exception e){ e.printStackTrace(); } } public ArrayList getData() { return data; } public ArrayList getColname() { return colname; } }

Sample4.java

import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import mybeans.CarDBBean; public class Sample4 extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException { try{ //サーブレットコンテキストの取得 ServletContext sc = getServletContext(); //Beanの作成 CarDBBean cb = new CarDBBean(); //リクエストに設定 request.setAttribute("cb", cb); //リクエストの転送 sc.getRequestDispatcher("/Sample4.jsp") .forward(request, response); } catch(Exception e){ e.printStackTrace(); } } } ```web.xml <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>CarBean</display-name> <servlet> <servlet-name>Sample6</servlet-name> <servlet-class>Sample6</servlet-class> </servlet> <servlet-mapping> <servlet-name>Sample6</servlet-name> <url-pattern>/Sample6</url-pattern> </servlet-mapping> <servlet> <servlet-name>Sample4</servlet-name> <servlet-class>Sample4</servlet-class> </servlet> <servlet-mapping> <servlet-name>Sample4</servlet-name> <url-pattern>/Sample4</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.html</welcome-file> <welcome-file>index.htm</welcome-file> <welcome-file>index.jsp</welcome-file> <welcome-file>default.html</welcome-file> <welcome-file>default.htm</welcome-file> <welcome-file>default.jsp</welcome-file> </welcome-file-list> </web-app>

###生じたエラー
HTTPステータス 500 – Internal Server Error

タイプ 例外報告

メッセージ [Sample4.jsp] の処理中に行番号 [28] で例外が発生しました。

説明 サーバーは予期しない条件に遭遇しました。それはリクエストの実行を妨げます。

例外

org.apache.jasper.JasperException: [Sample4.jsp] の処理中に行番号 [28] で例外が発生しました。

25: <table border="1" style="margin-left: auto; margin-right:auto;">
26: <tr bgcolor="#E0C76F">
27: <%
28: for(int column=0; column<colname.size(); column++){
29: %>
30: <th>
31: <%= (String) colname.get(column) %>

Stacktrace:
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:625)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:514)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
根本原因

java.lang.NullPointerException
org.apache.jsp.Sample4_jsp._jspService(Sample4_jsp.java:152)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:476)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:385)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:329)
javax.servlet.http.HttpServlet.service(HttpServlet.java:741)
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:53)
注意 原因のすべてのスタックトレースは、サーバのログに記録されています

###期待された振る舞い
http://localhost:8080/CarBean/Sample4.jsp に、
2:乗用車
3:オープンカー
4:トラック と表示される。

###試したこと
⒈ターゲットランタイムをTomcat9 (Java11)にして実行→結果は同じでした。
2.同プロジェクトにて、単純にデータベースに接続するだけのコードを実行→実行できました。

import java.sql.*; public class Sample1 { public static void main(String args[]) { try{ //接続の準備 String url = "jdbc:derby:cardb;create=true"; String usr = ""; String pw = ""; //データベースへの接続 Connection cn = DriverManager.getConnection(url, usr, pw); //問い合わせの準備 DatabaseMetaData dm = cn.getMetaData(); ResultSet tb = dm.getTables(null, null, "車表", null); Statement st = cn.createStatement(); String qry1 = "CREATE TABLE 車表(番号 int, 名前 varchar(50))"; String[] qry2 = {"INSERT INTO 車表 VALUES (2, '乗用車')", "INSERT INTO 車表 VALUES (3, 'オープンカー')", "INSERT INTO 車表 VALUES (4, 'トラック')"}; String qry3 = "SELECT * FROM 車表"; if(!tb.next()){ st.executeUpdate(qry1); for(int i=0; i<qry2.length; i++){ st.executeUpdate(qry2[i]); } } //問い合わせ ResultSet rs = st.executeQuery(qry3); //データの取得 ResultSetMetaData rm = rs.getMetaData(); int cnum = rm.getColumnCount(); while(rs.next()){ for(int i=1; i<=cnum; i++){ System.out.print(rm.getColumnName(i) + ":"+ rs.getObject(i) + " "); } System.out.println(""); } //接続のクローズ rs.close(); st.close(); cn.close(); } catch(Exception e){ e.printStackTrace(); } } }

実行結果:
番号:2 名前:乗用車
番号:3 名前:オープンカー
番号:4 名前:トラック
###その他懸念点
このプログラムに対する本での解説として、「まずサーブレットとBeanをコンパイルしてクラスファイルを作成し適切なディレクトリに配置してから、サーブレットのURLを入力して実行するように」とあるのですが、Eclipseではクラスファイルを普段意識していないので、普通にSample4.javaをサーバーで実行しています。(http://localhost:8080/CarBean/Sample4には何も表示されません。)これは間違った操作なのでしょうか?

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2020/01/06 10:02

プレビューみながら修正しましょう
riko111

2020/01/09 08:37

行番号 [28] で例外が発生しました。  と書かれていて、28行目の記述が for(int column=0; column<colname.size(); column++){ ですよね。 そして根本原因に java.lang.NullPointerException って出てます。 何がNullかといえば、ここではcolnameしかないですね。
guest

回答1

0

ベストアンサー

JSPを表示している際のCarDBBeanインスタンス作成時に No suitable driverなどのエラーログが出ているかと思います。

ビルドパスへは正常に登録されているので問題ないかと思いますが、WebアプリケーションでDerbyを利用する場合には、WEB-INF/lib に 以下のjarファイルを配置してください。(ビルドパスへの追加は、JavaWebアプリケーションであれば常に追加されます)

  • derby.jar
  • derbyclient.jar
  • derbyshared.jar(ローカルファイルのDBへ直接参照するときに必要)

そうした上で開発用のサーバ:tomcatのjdbcドライバ参照クラスに登録しないと利用できません。これはJava単体で起動したときと、サーバから利用したときのクラス設定が異なるためです。

具体的な解決法としては、CarDBBeanのJDBCドライバ接続をする処理にて、以下のようにClass.forNameを追加してJDBCのDriverManagerから参照するクラスを選択します。以下は組み込み型の設定例です。

java

1Class.forName("org.apache.derby.jdbc.EmbeddedDriver"); 2 3String url = "jdbc:derby:cardb;create=true"; 4String usr = ""; 5String pw = ""; 6 7//データベースへの接続 8Connection cn = DriverManager.getConnection(url, usr, pw);

参考資料:
https://db.apache.org/derby/docs/10.4/devguide/cdevdvlp40653.html

動作結果:
https://gyazo.com/0a8af0d9bc625a71cfdaec7846b5e603

投稿2020/01/10 04:26

A-pZ

総合スコア12011

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

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

hon.ki

2020/01/10 10:31

WEB-INF/libにderby.jarとderbyclient.jarを置いて、CarDBBeanに指定された処理を追加したところ、無事表示がされました。ありがとうございます。
A-pZ

2020/01/10 12:52

d(・ω・
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問