- - PR -
getInitParameterで情報を取得できない
| 投稿者 | 投稿内容 | ||||||||
|---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2004-08-08 09:03
いつもいろいろ勉強させていただいております。
getInitParameterを使用してDB接続情報をとりたいのですが、 NullPointerExceptionエラーが出る上うまくいきません。。。 どなたかご存知の方いらしたら教えていただけないでしょうか。 長くなってしまいすいません。 ================エラー内容================================================ java.lang.NullPointerException at javax.servlet.GenericServlet.getInitParameter(GenericServlet.java:144) at common.DBTrans.<init>(DBTrans.java:48) at model.FloorMapBean.<init>(FloorMapBean.java:11) at controller.FloorMapServlet.doGet(FloorMapServlet.java:43) at javax.servlet.http.HttpServlet.service(HttpServlet.java:740) at javax.servlet.http.HttpServlet.service(HttpServlet.java:853) at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:247) at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:193) at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:256) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardContext.invoke(StandardContext.java:2422) at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:180) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.valves.ErrorDispatcherValve.invoke(ErrorDispatcherValve.java:171) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641) at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:163) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:641) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:174) at org.apache.catalina.core.StandardPipeline$StandardPipelineValveContext.invokeNext(StandardPipeline.java:643) at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:480) at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:995) at org.apache.coyote.tomcat4.CoyoteAdapter.service(CoyoteAdapter.java:199) at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:828) at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:700) at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:584) at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683) at java.lang.Thread.run(Thread.java:534) ================エラー内容================================================ ================web.xml=================================================== <web-app> <servlet> <servlet-name> common.DBTrans </servlet-name> <servlet-class> common.DBTrans </servlet-class> <init-param> <param-name> str_dsn </param-name> <param-value> DSN </param-value> <param-name> str_pass </param-name> <param-value> PASSWORD </param-value> <param-name> str_user </param-name> <param-value> USER </param-value> </init-param> </servlet> </web-app> ================web.xml=================================================== ================taskServlet=================================================== public class taskServletextends HttpServlet{ public void doGet(HttpServletRequest request, HttpServletResponse response){ DBTrans DBTrans = new DBTrans(); DBTrans.open(); } ================DBTrans=================================================== public class DBTrans extends HttpServlet implements Serializable{ private Connection obj_cn = null; public void open() throws Exception{ Class.forName(str_drv); obj_cn = DriverManager.getConnection( getInitParameter("str_dsn") , getInitParameter("str_user") , getInitParameter("str_pass")); } } ================DBTrans=================================================== ==========フォルダ構成=========== web-inf --common --DBTrans controller --taskServlet web.xml ==========フォルダ構成=========== [ メッセージ編集済み 編集者: 未記入 編集日時 2004-08-08 09:05 ] | ||||||||
|
投稿日時: 2004-08-08 11:07
DBTransクラスが初期化(init)されていないのではないでしょうか?
書き込まれた内容を見る限りでは、DBTransクラスがサーブレットコンテナを 経由してないように見えますし・・・。 ※この情報だけでは判断できないのですが、DBTransクラスがサーブレットである必要があるのでしょうか??? | ||||||||
|
投稿日時: 2004-08-08 22:46
直接的ではありませんが、サーブレットからインスタンス化したオブジェクトへ
渡す方法のひとつです。これによりgetInitParamaterの値をdbbクラスで読み取る ことができるはずです。ご参考になればよいのですが・・・。
# 補足ですが、web.xmlには、このソースコードでいうdbHandlerクラスだけあればOkで、 初期化パラメータは、その中に書きます。 [ メッセージ編集済み 編集者: Ken-Lab 編集日時 2004-08-08 23:01 ] | ||||||||
|
投稿日時: 2004-08-08 23:19
う。さん
Ken-Labさん お返事有難うございます。 まずは 私の書き方がまずかったせいで誤解させてしまいすいません。 サーブレットとDB接続クラスをわけて考えていただきたいのですが、 DB接続クラス(DBTrans)でweb.xmlのデータをextends HttpServletしないで 取得することはできないのでしょうか。 (できないためエラーがでるのでしょうか???) また一般的にサーブレットから呼び出されるロジッククラス(メール送信のためのクラスなど) に書き込まれるサーバ情報などの初期化情報を外部ファイルで持ちたい場合どうすればいいのでしょうか。 | ||||||||
|
投稿日時: 2004-08-08 23:36
たとえばgetInitParameterなどはGenericServletから継承しているので サーブレット配下に置かなくてはならないのでは、と考えます。
原始的ですが、FileReaderを使う・・・とか。 (ファイル形式にもよると思いますが・・・。) # 補足 > サーブレットとDB接続クラスをわけて考えていただきたいのですが dbHandlerクラス > サーブレットクラス dbbクラス > DB接続クラス です。紛らわしくてすいません。 [ メッセージ編集済み 編集者: Ken-Lab 編集日時 2004-08-08 23:49 ] | ||||||||
|
投稿日時: 2004-08-09 01:06
通常はプロパティファイルなりXMLファイルに情報を保持して読み込むようにします。 ファイルの位置については、クラスパスが通ったディレクトリ(WEBアプリケーションなら WEB-INF/classesなど)にファイルを置き、ClassLoader#getResourceAsStreamで読み込む、 というやり方をよく使います。 | ||||||||
|
投稿日時: 2004-08-09 08:57
おはようございます。
言葉足らずな返信してますね・・・ 申し訳ありません。 ukさんも書き込まれているように、自分のところでも WEB-INF/classes 配下に ***.propertiesファイルを置いて読み込ませています。 画面(という言い方が適切かわからないですが)との窓口になる必要がない クラスならHttpServletを継承せずに、web.xmlでない設定ファイルに 値を設定する方が自然のように感じます。 | ||||||||
|
投稿日時: 2004-08-09 09:44
これなら、JNDIに登録してやるか、 WEBアプリケーションの起動時に、 クラス変数に値を保持する方が良い気がします。 [ メッセージ編集済み 編集者: taku 編集日時 2004-08-09 09:44 ] | ||||||||
