ここを調査する。
- httpリクエストが送信されてからAction#execute が実行するまでの一連の流れ。
httpリクエスト送信~Action#execute までの流れ
- スタートはActionServlet
- サーブレットアプリケーションなんで。Struts であればActionServlet を使う。web.xml に書くんやよね。
- doGet/doPost → process → RequestProcessor#process
- RequestProcessor#process(けっこうでかい。コメントで書いてある。英語でよくわからんけど。。)
トラブルシュート集
「Module 'null' not found.」と出た。
- 発生した問題
- 1. 新規にStrutsのプロジェクトを作成していて、<html:form>でaction属性にアクションパスを指定したjspを作った。
- 2. 確認してみようと、サーバーを起動し作ったjspを直接URLで指定して表示を試みると以下のように素敵にエラーとなった。
致命的: サーブレット jsp のServlet.service()が例外を投げました
java.lang.NullPointerException: Module 'null' not found.
at org.apache.struts.taglib.TagUtils.getModuleConfig(TagUtils.java:755)
at org.apache.struts.taglib.TagUtils.getModuleConfig(TagUtils.java:735)
・・・
- エラー発生時の状況
- <html:form>で指定したアクションパスは、struts-config.xmlのactionで定義済み。
- そのアクションで使用するform-beanはstruts-config.xmlで定義済み。
- struts-config.xmlで定義したactionやform-beanの実際のクラス(Action、ActionForm)は作成済み。
- エラーの原因
- 上記のエラーはstruts-config.xmlがモジュールとして読み込まれていないために発生している。
- なぜstruts-config.xmlが読み込まれていないのか?それは以下の2点が同居しているためだった。
- 作成したjspを直接URLで指定している
- web.xmlで、ActionServletを定義している<servlet>内で、<load-on-startup>を記述していない
- つまり、以下のような流れ
- <load-on-startup>を記述していないため、サーバー(tomcat)が起動してからActionServletへの要求となるURL(~.do)がリクエストされないと、ActionServletがロード(初期化)されない
- 今回、作成したjspのURLを直接指定したためActionServletはロードされておらず、すなわち、struts-config.xmlの読み込みもまだ行われていない
- jspには<html:form>のaction属性でアクションパスを指定してるけどstruts-config.xmlを読み込めていないからエラー
- 開こうとしたjspに<html:form>を書かずにアクションパスの指定がないとエラーにならなかったし。
サーバー起動時に、「致命的: Parse Error at line 3 column 16: Document is invalid: no grammar found.」と出た。
- 発生した問題。
- サーバー起動時、コンソールに以下のエラーが出力された。ただし、アプリ自体は問題なく動いた。
致命的: Parse Error at line 3 column 16: Document is invalid: no grammar found.
org.xml.sax.SAXParseException: Document is invalid: no grammar found.
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.createSAXParseException(ErrorHandlerWrapper.java:195)
at com.sun.org.apache.xerces.internal.util.ErrorHandlerWrapper.error(ErrorHandlerWrapper.java:131)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:384)
at com.sun.org.apache.xerces.internal.impl.XMLErrorReporter.reportError(XMLErrorReporter.java:318)
at com.sun.org.apache.xerces.internal.impl.XMLNSDocumentScannerImpl.scanStartElement(XMLNSDocumentScannerImpl.java:250)
・・・
- エラーの原因
- struts-config.xmlに以下の記述を書くと解決する。理由はまだ良くわかりまへん。
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.3//EN"
"http://struts.apache.org/dtds/struts-config_1_3.dtd">
最終更新:2011年09月11日 13:24