- PR -

getInitParameterで情報を取得できない

投稿者投稿内容
タマ
ベテラン
会議室デビュー日: 2004/08/08
投稿数: 56
投稿日時: 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/07/07
投稿数: 4
投稿日時: 2004-08-08 11:07
DBTransクラスが初期化(init)されていないのではないでしょうか?
書き込まれた内容を見る限りでは、DBTransクラスがサーブレットコンテナを
経由してないように見えますし・・・。

※この情報だけでは判断できないのですが、DBTransクラスがサーブレットである必要があるのでしょうか???
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2004-08-08 22:46
直接的ではありませんが、サーブレットからインスタンス化したオブジェクトへ
渡す方法のひとつです。これによりgetInitParamaterの値をdbbクラスで読み取る
ことができるはずです。ご参考になればよいのですが・・・。

コード:

package dbHandler;

import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

public class dbHandler extends HttpServlet{

public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{
PrintWriter out = response.getWriter();
ServletConfig config = getServletConfig();
dbb d = new dbb(config);

String str = d.connect();
out.println (str);
}
}

class dbb{

String result;

public dbb (ServletConfig c){
result = c.getInitParameter ("Test1");
}

public String connect(){
return (result);
}

}


# 補足ですが、web.xmlには、このソースコードでいうdbHandlerクラスだけあればOkで、
初期化パラメータは、その中に書きます。

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2004-08-08 23:01 ]
タマ
ベテラン
会議室デビュー日: 2004/08/08
投稿数: 56
投稿日時: 2004-08-08 23:19
う。さん
Ken-Labさん
お返事有難うございます。

まずは
私の書き方がまずかったせいで誤解させてしまいすいません。

サーブレットとDB接続クラスをわけて考えていただきたいのですが、
DB接続クラス(DBTrans)でweb.xmlのデータをextends HttpServletしないで
取得することはできないのでしょうか。
(できないためエラーがでるのでしょうか???)

また一般的にサーブレットから呼び出されるロジッククラス(メール送信のためのクラスなど)
に書き込まれるサーバ情報などの初期化情報を外部ファイルで持ちたい場合どうすればいいのでしょうか。
未記入
大ベテラン
会議室デビュー日: 2003/06/28
投稿数: 219
投稿日時: 2004-08-08 23:36
引用:

未記入さんの書き込み (2004-08-08 23:19) より:

サーブレットとDB接続クラスをわけて考えていただきたいのですが、
DB接続クラス(DBTrans)でweb.xmlのデータをextends HttpServletしないで
取得することはできないのでしょうか。



たとえばgetInitParameterなどはGenericServletから継承しているので
サーブレット配下に置かなくてはならないのでは、と考えます。

引用:

また一般的にサーブレットから呼び出されるロジッククラス(メール送信のためのクラスなど)
に書き込まれるサーバ情報などの初期化情報を外部ファイルで持ちたい場合どうすればいいのでしょうか。



原始的ですが、FileReaderを使う・・・とか。
(ファイル形式にもよると思いますが・・・。)

# 補足
> サーブレットとDB接続クラスをわけて考えていただきたいのですが
dbHandlerクラス > サーブレットクラス
dbbクラス > DB接続クラス です。紛らわしくてすいません。

[ メッセージ編集済み 編集者: Ken-Lab 編集日時 2004-08-08 23:49 ]
uk
ぬし
会議室デビュー日: 2003/05/20
投稿数: 1155
お住まい・勤務地: 東京都
投稿日時: 2004-08-09 01:06
引用:

未記入さんの書き込み (2004-08-08 23:19) より:
また一般的にサーブレットから呼び出されるロジッククラス(メール送信のためのクラスなど)
に書き込まれるサーバ情報などの初期化情報を外部ファイルで持ちたい場合どうすればいいのでしょうか。


通常はプロパティファイルなりXMLファイルに情報を保持して読み込むようにします。
ファイルの位置については、クラスパスが通ったディレクトリ(WEBアプリケーションなら
WEB-INF/classesなど)にファイルを置き、ClassLoader#getResourceAsStreamで読み込む、
というやり方をよく使います。
う。
会議室デビュー日: 2004/07/07
投稿数: 4
投稿日時: 2004-08-09 08:57
おはようございます。

言葉足らずな返信してますね・・・ <自分
申し訳ありません。

ukさんも書き込まれているように、自分のところでも WEB-INF/classes 配下に
***.propertiesファイルを置いて読み込ませています。
画面(という言い方が適切かわからないですが)との窓口になる必要がない
クラスならHttpServletを継承せずに、web.xmlでない設定ファイルに
値を設定する方が自然のように感じます。
taku
ぬし
会議室デビュー日: 2002/11/12
投稿数: 918
お住まい・勤務地: 墨田区→中野区
投稿日時: 2004-08-09 09:44
引用:

 getInitParameter("str_dsn")
, getInitParameter("str_user")
, getInitParameter("str_pass"));


 これなら、JNDIに登録してやるか、
WEBアプリケーションの起動時に、
クラス変数に値を保持する方が良い気がします。

[ メッセージ編集済み 編集者: taku 編集日時 2004-08-09 09:44 ]

スキルアップ/キャリアアップ(JOB@IT)