###環境
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には何も表示されません。)これは間違った操作なのでしょうか?
回答1件
あなたの回答
tips
プレビュー