
JSPを勉強中なのですが、以下を実行するとエラーになってしまいます。
テキストに付録していた解答のコードを使っています。
JSPファイル:
<%@ page contentType="text/html;charset=Windows-31J"
import="javax.xml.parsers.*,org.w3c.dom.*,java.io.*" %>
<html><head><title>住所録一覧</title></head><body>
<h1 style="font-size:14pt;background:#cccccc">住所録一覧</h1>
<table border="0">
<tr style="background:#00ccff">
<th>No.</th><th>名前</th><th>性別</th><th>電話番号</th><th>住所</th>
</tr>
<%
DocumentBuilderFactory objDbf=DocumentBuilderFactory.newInstance();
DocumentBuilder objDb=objDbf.newDocumentBuilder();
Document objDoc=objDb.parse(new File(application.getRealPath("day04-3/addbook.xml")));
Element objRoot=objDoc.getDocumentElement();
NodeList clnNod=objRoot.getChildNodes();
for(int i=0;i<clnNod.getLength();i++)
{
out.println("<tr style='background:#ffffcc'>");
Node objNod=clnNod.item(i);
NamedNodeMap clnNnm=objNod.getAttributes();
Attr atrNam=(Attr)clnNnm.item(0);
out.println("<td>" + atrNam.getValue() + "</td>");
NodeList clnNod2=objNod.getChildNodes();
for(int j=0;j<clnNod2.getLength();j++)
{
Node objNod2=clnNod2.item(j);
out.println("<td>" + objNod2.getFirstChild().getNodeValue() + "</td>");
}
out.println("</tr>");
}
%>
</table></body></html>
XMLファイル:
ファイル名:addbook.xml
<?xml version="1.1" encoding="utf-8"?>
<addbook>
<member id="1">
<name>高橋秀和</name>
<gender>男</gender>
<tel>04x-231x-123x</tel>
<address>小金井市△△町123-3249</address>
</member>
<member id="2">
<name>輪笠貴子</name>
<gender>女</gender>
<tel>00x-1231-xxxx</tel>
<address>横浜市○○区△△町34165-1</address>
</member>
<member id="3">
<name>佐々木健司</name>
<gender>男</gender>
<tel>04x-231x-xxxx</tel>
<address>川崎市○○町1-3213</address>
</member>
<member id="4">
<name>鳥内都</name>
<gender>女</gender>
<tel>09x-21xx-xx97</tel>
<address>横浜市◇◇区5-16</address>
</member>
<member id="5">
<name>金崎瑞穂</name>
<gender>女</gender>
<tel>02x-654x-324x</tel>
<address>相模原市△△区1-9-21</address>
</member><member id="10">
<name>川端真一</name>
<gender>男</gender>
<tel>0xx-999-8888</tel>
<address>相模原市★★町12313-1</address>
</member>
</addbook>
エラー内容:
type 例外レポート
メッセージ
説明 The server encountered an internal error () that prevented it from lfilling this request.
例外
org.apache.jasper.JasperException: java.lang.NullPointerException
org.apache.jasper.servlet.JspServletWrapper.handleJspException(JspServletWrapper.java:522)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:416)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
day10.LogFilter.doFilter(LogFilter.java:38)
原因
java.lang.NullPointerException
org.apache.jsp.day04_002d4.addList_jsp._jspService(addList_jsp.java:79)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:374)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:342)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:267)
javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
day10.LogFilter.doFilter(LogFilter.java:38)
以上です。
JSPのコードは
Document objDoc=objDb.parse(new File(application.getRealPath("day04-3/addbook.xml")));
の行の new File の部分だけ修正しました。
ここでつまづてしまい、先に進む事ができません。
環境は、
JDK1.6
Tomcat6
OS:WindowsXP
を使用しています。
どなたか原因が分かる方、お助けください。
No.2ベストアンサー
- 回答日時:
JAVA のAPI リファレンス
http://java.sun.com/javase/ja/6/docs/ja/api/org/ …
にNodeの説明の説明がありますから、参考にして下さい。
Nodeがmenberの所まで来た時に、
----------------------------------------------------------------------
if ("member".equals(objNod.getNodeName())) {
// ●member ノードへ対する処理
String id = "";
String name = "";
if (objNod.hasAttributes()) {
NamedNodeMap clnNnm = objNod.getAttributes();
Attr atrNam = (Attr)clnNnm.getNamedItem("id");
id = atrNam.getValue();
}
if (objNod.hasChildNodes()) {
NodeList clnNod2=objNod.getChildNodes();
for (int j = 0; j < clnNod2.getLength(); j++) {
Node objNod2 = clnNod2.item(j);
if ("name".equals(objNod2.getNodeName())) {
name = objNod2.getTextContent();
}
}
}
out.println("<td>" + id + "</td>");
out.println("<td>" + name + "</td>");
}
----------------------------------------------------------------------
のような処理を入れてあげると良いと思います。
# エラー処理は省略してあるので、実際に実装する時は、エラー処理もして下さい。
コードまで書いていただき申し訳ないです。
全くその通りの処理で問題なく表示されました。
(name以外のNodeも同様の処理を追加しました。)
Nodeの構造が自分が想像していたものと違っていたんですね。
これで次のステップへ進めそうです。
非常に助かりました。ありがとうございました。。
No.1
- 回答日時:
>Node objNod=clnNod.item(i);
>NamedNodeMap clnNnm=objNod.getAttributes();
>Attr atrNam=(Attr)clnNnm.item(0);
>out.println("<td>" + atrNam.getValue() + "</td>");
>NodeList clnNod2=objNod.getChildNodes();
例外が出ている原因は、アトリビュートの無いノードに対して、
objNod.getAttributes();を呼び出しているために、ここでnullが戻ってきますので、
clnNnmがnullである時に、clnNnm.item(0);などとしている
ためNullPonterExceptionとなっているようです。
この手の処理は、トレースと変数のダンプをしっかりやれば簡単に原因を突き止められる
はずですので、ロギング処理を追加するか、デバッガを使用すると良いでしょう。
ところで、本当は、どのような動作を期待されていましたか?
この回答への補足
すみません、画像無理だったのでテキストで、
住所録一覧
No. 名前 性別 TEL 住所
1 高橋秀和 男 04x-231x-123x 小金井市△△町123-3249
2 輪笠貴子 女 00x-1231-xxxx 横浜市○○区△△町34165-1
3 佐々木健司 男 04x-231x-xxxx 川崎市○○町1-3213
4 鳥内都 女 09x-21xx-xx97 横浜市◇◇区5-16
5 金崎瑞穂 女 02x-654x-324x 相模原市△△区1-9-21
10 川端真一 男 0xx-999-8888 相模原市★★町12313-1
こんな感じで表示される処理です。
早速の回答ありがとうございます。
どんな状態になっているか調べようと自分なりに少しいじくってみたのですが、
コード:
Element objRoot=objDoc.getDocumentElement();
String TT = objRoot.getNodeName();
out.println(TT );
結果→addbook
コード:
NodeList clnNod=objRoot.getChildNodes();
Node objNod=clnNod.item(0);
String TT2 = objNod.getNodeName();
out.println(TT2 );
結果→#text
コード:
Node objNod2=clnNod.item(1);
String TT3 = objNod2.getNodeName();
out.println(TT3 );
結果→member
となってclnNod.item()の値を1~12まで変化させてみたところ、
1:#text
2:member
3:#text
4:member
5:#text
6:member
7:#text
8:member
9:#text
10:member
11:member
12:#text
と表示されました。
#textというものが何なのか分かりません…
memberの配下にname、gender、tel、addressがあるものじゃないんでしょうか??
動作は説明しづらいので画像をキャプチャしたので載せておきます。
おそらくこの通りに表示されるはずなのですが…
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- HTML・CSS ボタンをクリックした時に、入力フォームのすぐ下部に、「入力欄が空白です」というテキストメッセージが表 1 2022/04/27 16:25
- JavaScript 入力フォームの javascript で メールアドレスの正規チェックをを行い、ボタンをクリックして 2 2022/04/27 16:06
- PHP 入力した部分を表示させたまま(保持)するにはどうすれば良いでしょうか? 1 2023/01/25 11:14
- HTML・CSS 私の能力からして間違っていないような気がします。 4 2022/09/30 13:24
- AJAX JavascriptからPHPへのAjax通信でnullが返ってくる 3 2022/08/03 22:00
- CGI perlで書いたcgiでsqliteの使い方を教えてください 2 2023/05/08 21:29
- JavaScript 1日1回引けるJavaScriptおみくじについて 1 2022/12/12 22:28
- PHP if(preg_match("/[^0-9]/",$gu_d)){意味を教えてください。 1 2022/05/06 05:37
- HTML・CSS ただいま勉強始めたての初心者です。フォームを縦並べにしたいです。 2 2022/11/20 17:18
- HTML・CSS cssが効かなくて困ってます 1 2023/01/01 23:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
オブジェクトの中のプロパティ...
-
hiddenの値が期待した値で取得...
-
テーブルの初期化
-
Struts2 selectタグのmultiple...
-
requestの値が削除されません…
-
PropertyNotFoundException解決...
-
WebWork(struts2)でのパラメー...
-
NULLが返ってこない…。
-
JSPからServletに、テーブルに...
-
JSPでImportエラーになります
-
Java Struts ~に対するゲッタ...
-
入力チェックとエラーメッセー...
-
JSPでの文字列編集出力
-
Enumのname()とtoString()の違...
-
オブジェクトの中のプロパティ...
-
C言語のポインターに関する警告
-
動的配列が存在(要素が有る)か...
-
javaの掲示板について
-
Swingなしで画像ファイルロード
-
System.err. printlnとSystem.o...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
オブジェクトの中のプロパティ...
-
StrutsでJSPからListを受け取り...
-
JSPでImportエラーになります
-
hiddenの値が期待した値で取得...
-
Java Struts ~に対するゲッタ...
-
JSPからServletに、テーブルに...
-
JSPにて、変数を利用してフォン...
-
<s:iterator>の値をリストで取...
-
全取得したデータをjspで順番に...
-
requestの値が削除されません…
-
iterateで受け取った値を処理に...
-
【Struts】bean:writeタグのpro...
-
strutsでlist型の入力を行うには
-
同時アクセス時の動作
-
JSPでDBからデータ読み込みブラ...
-
WebWork(struts2)でのパラメー...
-
PropertyNotFoundException解決...
-
java strutsでの一覧表の表示方...
-
Enumのname()とtoString()の違...
-
JSFタグ<h:dataTable>でヘッダ...
おすすめ情報