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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~1/20】 追い込まれた犯人が咄嗟に言った一言とは?
- ・洋服何着持ってますか?
- ・みんなの【マイ・ベスト積読2024】を教えてください。
- ・「これいらなくない?」という慣習、教えてください
- ・今から楽しみな予定はありますか?
- ・AIツールの活用方法を教えて
- ・【選手権お題その3】この画像で一言【大喜利】
- ・【お題】逆襲の桃太郎
- ・自分独自の健康法はある?
- ・最強の防寒、あったか術を教えてください!
- ・【大喜利】【投稿~1/9】 忍者がやってるYouTubeが炎上してしまった理由
- ・歳とったな〜〜と思ったことは?
- ・ちょっと先の未来クイズ第6問
- ・モテ期を経験した方いらっしゃいますか?
- ・好きな人を振り向かせるためにしたこと
- ・【選手権お題その2】この漫画の2コマ目を考えてください
- ・【選手権お題その1】これってもしかして自分だけかもしれないな…と思うあるあるを教えてください
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・これまでで一番「情けなかったとき」はいつですか?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
JSPでImportエラーになります
-
StrutsでJSPからListを受け取り...
-
hiddenの値が期待した値で取得...
-
オブジェクトの中のプロパティ...
-
<s:iterator>の値をリストで取...
-
JSPからServletに、テーブルに...
-
requestの値が削除されません…
-
JSPにて、変数を利用してフォン...
-
enumでの要素番号から要素名の...
-
JSFタグ<h:dataTable>でヘッダ...
-
Struts2 selectタグのmultiple...
-
【Struts】bean:writeタグのpro...
-
Java Struts ~に対するゲッタ...
-
System.err. printlnとSystem.o...
-
ループ処理の際、最後だけ","を...
-
JSPやサーブレットでSystem.out...
-
VB.net 引数で配列変数を渡す際...
-
csv出力について
-
yyyymmddからyyyy/mm/d...
-
ORA-01858: 数値を指定する箇所...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
JSPでImportエラーになります
-
オブジェクトの中のプロパティ...
-
hiddenの値が期待した値で取得...
-
StrutsでJSPからListを受け取り...
-
Java Struts ~に対するゲッタ...
-
JSPからServletに、テーブルに...
-
JSPにて、変数を利用してフォン...
-
<s:iterator>の値をリストで取...
-
requestの値が削除されません…
-
全取得したデータをjspで順番に...
-
入力チェックとエラーメッセー...
-
WebWork(struts2)でのパラメー...
-
【Struts】bean:writeタグのpro...
-
データベースに変数の値を挿入
-
strutsでlist型の入力を行うには
-
enumでの要素番号から要素名の...
-
iterateで受け取った値を処理に...
-
Enumのname()とtoString()の違...
-
サーブレットjspで勤怠スケジュ...
-
Struts2 selectタグのmultiple...
おすすめ情報