JAVA

2013/09/01

先月Javaのサーブレット関連でハマったこと2点

先月、Java関連の仕事でハマったこと2点を備忘録。

1、サーブレットのフィルタは、サーブレット以外のアクセスにも適用される。

Tomcatだけの問題なのかもしれないけど、サーブレットのフィルタはイメージとかCSSを取得した際にも動きます。
セッションが無い状態でTomcat上に有る画像のURLを直接指定したら、フィルタで処理しているセッションエラー画面が出てきて発覚。
Web上にはなぜか情報がほとんど無かったのだけど、良い設計では静的ファイルはTomcat上に置かず、Apacheで処理させるはずだから、問題になる事例が少ないのかもしれないけど。


2、WARファイル内のリソースにgetRealPathは使えない。

サーブレットで、サーブレットのコンテキスト配下に有るファイルを取得する際、
javax.servlet.ServletContext
 java.lang.String getRealPath(java.lang.String path)
で相対パスから絶対パスを取得するのは定石だけど、これはWARファイルが展開されていないと使用できないことが判明。
APIの説明にも、
「Servlet コンテナが何かの理由 (コンテンツが .war アーカイブで提供されているなど) で仮想パスを実際のパスに変換できなかった場合には null を返します。 」
ってしっかり書かれているし。

javax.servlet.ServletContext
 java.io.InputStream getResourceAsStream(java.lang.String path)
で、相対パスからファイルのInputStreamを取得することは可能なので、いちおうファイルの中身を取得する方法は有ります。

| | コメント (0) | トラックバック (0)

2007/03/04

All-In-One Eclipseを使用する

今までEclipse3.0.1を使用していましたが、Java5の勉強をする必要があり、Java5の文法を使えるバージョンに替える必要が出てきました。

最新版はどこかなと思いEclipseWikiを調べていた所、All-In-One Eclipse というのがある、ということを知りました。

普通のEclipseと何が違うのかというと、
・日本語化、プラグインの選定が既に終了済み
・インストーラで簡単にインストールできる
・Windows版のみ

Eclipseのプラグイン方式は拡張性の高さを実現しているのですが、逆に何のプラグインがあるのか?どのプラグインを使えばいいのか?という情報を探すのが大変になっています。
その点、名前の通り全部入りな All-In-One Eclipse だと、プラグインのデファクトが選定されているので間違いないと思います。

All-In-One Eclipse のページに載っているとおりにインストールした所、インストール後すぐに使用できるようになりました。
ちなみに、インストール場所は基本的にどこでも良く、アンインストールもインストール先のフォルダごと削除すればよいとのことです。
ここは普通のEclipseと同じくお手軽です。

基本的にデフォルト設定で使っていますが、JavaのAPIのヘルプが英語版のjavadocを参照しているため、ここの日本語化が必要でした。
メニューバーの、ウィンドウ→設定→Java→インストール済みのJRE
JRE選択後、「編集」→JREのrt.jarを選択→「Javadoc ロケーション」
ここに、使用するJavadocを設定します。
私の場合Web上のJavadocをそのまま使用していますので、「Javadoc URL」にチェックし、「Javadoc ロケーションパス」に Java5の日本語Javadocの http://java.sun.com/j2se/1.5.0/ja/docs/ja/api/ を設定しています。
Javadocをダウンロードして使用する場合は、「アーカイブ内の Javadoc」にチェックすることになるんでしょう。


All-In-One Eclipse に限らず、Eclipseインストール後にJavaを最新版にアップデートし、古いバージョンのJavaをアンインストールすると、今まで実行できていたJavaのプログラムが実行できなくなります。
JREの設定などいろいろ手を尽くしても、実行時に「指定された VM インストールが見つかりません」というエラーが出てしまうんですよね。

これ、Eclipse使いなら誰もが1度はハマるんじゃないかなあ。
原因は、以前の実行時の設定が保存されてしまっているからです。
メニューバーの、実行→構成および実行 の画面で、アプリケーションの構成が残っていれば削除します。
これで大丈夫だと思います。

| | コメント (2) | トラックバック (0)

2005/08/27

Eclipse+LombozプラグインでStrutsの環境を作る

Eclipse+Lombozの設定ができ、TomcatでStrutsのアプリケーションが動くようになったとくれば、この2つを連携したくなるのが人情ってもんです。(笑)
というわけで、EclipseでStrutsのアプリケーション開発環境を作ってみることにしました。

頼みの「オープンソース徹底活用 Eclipse3によるJavaアプリケーション開発」本では、LombozはWebサービスクライアントの開発用でしか載っておらず、Struts開発ではMyEclipse(有料)を使っています。

そこで参考にしたのが、Lombozの設定でお世話になった Javaの道 です。
Eclipse(Tomcat向け開発)で、サーブレットの作り方が載っています。
サーブレットが作れるなら、Strutsも動くだろう!ってなことです。(汗)

試した環境 Windows2000 Tomcat5.0.28 Java5 Eclipse3.0.1(日本語化済み)


新規にプロジェクトを作る場合
「ファイル」→「新規」→「プロジェクト」を選択し、「新規プロジェクト」画面を開く。
新規プロジェクト画面で「Java」→「Lomboz J2EE Wizards」→「Lomboz J2EE Project」を選択。「次へ」を押す。
「プロジェクト名」にプロジェクト名を入力。
「Java設定」画面ではそのまま「次へ」ボタンを押す。
「Create J2EE Module」画面で「Web Modules」タブを押す。「Add」ボタンを押しModule名を入力。
(このModule名がTomcatのコンテナ名になる。)

同じプロジェクトにコンテナを追加する時は、
追加するプロジェクトを選択して右クリック。Lomboz Web Module を選択してModule名を入力。


「Targeted Servers」タブを押し、「Type」で「Apache Tomcat v5.0.x」を選択し「Add」ボタンで追加。

「終了」ボタンを押すとEclipseにJ2EEプロジェクトが作られる。WEB-INFディレクトリなども自動生成される。

ってところまでは、「Javaの道」に載っているとおりにしました。

ここからサーブレットを作る場合は、「Lomboz J2EE Wizards」→「Lomboz Servlet Wizard」を選択すればよいそうです。


が、Strutsの場合はここからまだやることがあります。

・Strutsの場合は、必要なJARファイルなどを\WEB-INF\libディレクトリに置く必要があります。
パッケージエクスプローラから\WEB-INF\libを右クリック→インポート→ファイルシステムで、
commons-beanutils.jar
commons-digester.jar
filter.jar
struts.jar
を WebModule名\WEB-INF\lib に、
struts-bean.tld
struts-config.xml
struts-html.tld
struts-logic.tld
web.xml
を WebModule名\WEB-INF に置きました。

・srcディレクトリの作成
パッケージエクスプローラからWEB-INFディレクトリを右クリック
新規作成→ディレクトリ で、srcディレクトリを作成する。

・srcをソースフォルダにする
パッケージエクスプローラからsrcディレクトリを右クリック
新規ソースフォルダを選択。
プロジェクト名に今のプロジェクト名が入っているのを確認し、
フォルダー名の「参照」ボタンから Web Module名/WEB-INF/src を選択。

・Javaのビルド・パスの設定
パッケージエクスプローラからプロジェクトを右クリック
プロパティーを選択。
Javaのビルド・パスを選択 デフォルト出力フォルダを WebModule名/WEB-INF/classes にする。
ライブラリのタブを選択し、JARの追加で、
Web Module名/WEB-INF/lib に置いたJARファイルをすべて追加する。

ちなみに、ソースフォルダを普通のフォルダにしたい時は、
パッケージエクスプローラからプロジェクトを右クリック
プロパティーを選択
Javaのビルド・パスを選択
ソースフォルダのタブからフォルダを選択&除去でOKです。


これで準備完了
ソースフォルダ内に、クラス(サーブレットではない)を作っていきます。
struts-config.xmlは、Web Module名/WEB-INF/ に置きます。
ApplicationResource.propertiesは、ソースフォルダに置くと、自動でclassesフォルダにも置いてくれますが、
日本語が含まれる場合はnativ2asciiコマンドで変換したものを置く必要があります。

最後に、画面下の「Lomboz J2EE View」にあるWebModule名を右クリックして、Deployを選ぶと、TOMCATにWARファイルを作成してデプロイできます。


よ~し、Strutsの勉強をするか!(ってこれからかい。(汗))

| | コメント (0) | トラックバック (0)

2005/08/21

JSPのコンパイルができなくなりハマる

近頃、Strutsに興味があり、ソフトバンクから出版されている「StrutsによるWebアプリケーションスーパーサンプル」っていう本を買ってきました。
しばらくこいつで勉強しようかな、と。

で、サンプルプログラムを試してみようと、サンプルのWARファイルをデプロイした時に問題が発生しました。
エラーが出てサンプルが表示できないのです。
そんなバカな。サンプルでエラーが出るなんて。

エラーは、JSPファイルのコンパイル時に出ていました。
内容は、
Unable to find a javac compiler;
com.sun.tools.javac.Main is not on the classpath.
Perhaps JAVA_HOME does not point to the JDK
ってなものでした。
ちなみに環境は、WindowsでTomcat5.0.28です。Javaは5です。

なに~??javacが見つからないだって???
JAVA_HOMEがおかしいとのことなので、環境変数を見てみましたが、ちゃんとJavaのインストールされたフォルダに設定されています。

TomcatのサンプルJSP(JSP Examples)を見たところ、これはちゃんと動いています。
JSPのコンパイル時だけの問題のようです。

どうやら、EclipseのLombozプラグインがうまく動かなくて、Javaのバージョンを変えたりしたのが原因じゃないかなと思います。
いろいろ試してみましたが解決せず、Tomcatを再インストールしてみました。

すると、なにごとも無かったように動くようになりました。
結局どこが原因か判らず・・・。(汗)
エラーのログとか詳細に残しておけばよかった・・・。

私が記憶している中で、再インストール後に変化した部分は、TomcatのConfigure Tomcatツールで設定できる、「Java」のVMの項目が、
C:\Program Files\Java\jdk1.5.0_04\jre\bin\server\jvm.dll
になっていた、ということです。
私はJavaのバージョンを変えた時に、
C:\Program Files\Java\jdk1.5.0_04\jre\bin\client\jvm.dll
に設定してしまったと思うんです。

そう言えば、エラーも単純にjavacが見つからない、と言っているわけではなくて、javac.Mainにclasspathが通っていない、ってことですもんね。
JAVA_HOMEも、今のTomcatでは自動で設定してくれるみたいですから、JAVA_HOMEの設定ミスってのではないみたいです。
今となっては詳細不明ですが、ま、Tomcatの再インストールで復活した、ということです。

サンプル動かすだけで、すげー時間使った。(T_T)

| | コメント (0) | トラックバック (0)

2005/08/12

EclipseのLombozプラグインのインストールでハマる

前に、漫画ビューアをJAVAのアプレットで作ったのですが、その際にEclipseを使ってみてビックリ。すごすぎ!!
テキストエディタのみでガリガリ書くのとは作業効率が全く違います。
こんなスゴいソフトがタダで使えるなんて!って感動したもんです。

そのEclipse、プラグインをインストールすればWebアプリケーション作成にも使えるってんで、本を読んで試してみることにしました。
「オープンソース徹底活用 Eclipse3によるJavaアプリケーション開発」ってな本です。
それによると、LOMBOZ というJ2EE開発用のプラグインがあるそうです。

早速本に書いてあるとおりにプラグインをインストールしました。
インストールといっても plugins のフォルダに追加するだけなんですけどね。

で、Eclipseを起動してみたのですが・・・。設定項目がない・・・・・。
本には、設定画面でLombozの項目を選択できることになっているのですが、項目がありません。

本の環境と自分の環境はほぼ同じで、
Eclipse3.0.1 TOMCAT5.0.28 Lomboz3.0.1です。
唯一違うのがJavaで、
本では1.4を使っているのに対し、5を使っています。
そんなわけで、LombozがJava5に対応していないのではないか?と思って、Java1.4を入れてみましたが、状況は変わりません。

本の出版社のページにも行ってみたのですが、正誤表も無いようです。

ネットでいろいろ調べたのですが、だいたい本に載っているようなインストール方法で大丈夫みたいです。
いったい何が原因なんだろう???

もう少し調べた所、「Javaの道」に解決策が載っていました
Lombozを使用する時は、EMF&SDOのRuntimeもインストールする必要があるそうなんです。
で、「Javaの道」に書いてあるとおりにインストールした所、ちゃんと設定できるようになりました。
やった~。

ですが、本の説明どおりに設定したのにうまくいかなかったのにはまいりました。
出版社のページに正誤表が無いので、もしかしたら、本の書いてある順番にいろんなプラグインをインストールしていけばうまくいくのかもしれません。

ちなみにJavaは5に戻しましたが、問題なく動いています。(汗)

| | コメント (0) | トラックバック (0)

2005/01/23

LunascapeでSUNのJavaを使う方法

WindowsのIEでSUNのJavaを使う場合、最近のJavaはインストールすると自動でプラグインの設定もしてくれるので、深く考えずにSUNのJavaを使うことが出来ます。
Javaのランタイムの取得は、http://java.com/ja/からダウンロードできます。
Javaの開発ツールは、http://java.sun.com/からダウンロードできます。
Ver.1.3ごろまでのJavaは、ブラウザで起動させる設定が大変でした。(汗)

IEで使用する場合、Windowsの「スタート」→「コントロールパネル」にあるJava Plug-inを開き、ブラウザの項目のInternet Explorerにチェックが入っていればOKです。
IE起動後、IEの「ツール」→「インターネットオプション」→「詳細設定」で、Java(SUN)の項目にチェックが入っていればOKです。

ですが、IEコンポーネントを使ったブラウザでは、上記の設定だけではSUNのJavaを使うことが出来ません。
私はメインのブラウザにLunascapeを使用していますが、Lunascape1を使っていた頃にこの問題にぶつかり、悩みました。
同じくIEコンポーネントを使用しているSleipnirに関する情報の中から、この問題の解決策を見つけました。

IEコンポーネントを使用すると、IEの設定とは無関係にMS-VMを優先的に使用するようです。
だから、MS-VMを直接停止させる必要があります。
Windowsの、「スタート」→「ファイル名を指定して実行」に、
regsvr32 /u msjava.dll
と入力します。
確認を求めるダイアログが出ますが、OKを押します。
これで、Lunascape1でもSUNのJavaが使えるようになりました。
Lunascape2でも同じ方法で使えます。

ちなみに、
regsvr32 msjava.dll
と入力すると、停止させていたMS-VMを起動させることが出来ます。
作成したAppletがMS-VMで使えるのかどうか確認する時に役立ちます。

| | コメント (0) | トラックバック (0)

2004/10/11

カスタム・タグを作ろうとしてハマる

Webアプリケーションの作成項目も、のこりわずかになってきました。

今回は、カスタム・タグを作ってみるのが目的です。
サーブレット、JSPと勉強してくると、JSPではできるだけスクリプトレットを追い出すのが良いみたいなんだけど、それって返って処理を複雑にしている気がしてならない今日このごろです。(笑)
タグのみで処理を行えば、結局は同じような気がするんだけど・・。
Javaのコードが読めるなら、カスタムタグは返って手間隙掛かるような。

とまあ、感想は置いておいて、今回はタグ・ハンドラをコンパイルできなくて悩みました。
コンパイル時に、import文でエラーが出るのです。
javax.servletまでは認識しているのですが、javax.servlet.jsp以降が見つからない様子。
これって、あきらかにCLASSPATHが通っていないのが原因なんだろうけど、本にはどうしろとか特に書いてありませんでした。
本では、CLASSPATHは$CATALINA_HOME/common/lib/servlet.jarに通すことになっていましたが、今は$CATALINA_HOME/common/lib/servlet-api.jarに通っています。(いつ通したんだろ?コンパイルできなくていろいろ試したんだっけ??)
なんかPATHが微妙に違うから怪しいと思ってcommonディレクトリを見てみると、いました!それらしいのが!
jsp-api.jar ってなファイルを見つけたので、そっちにもCLASSPATHを通したところ、うまくいきました。

が、自己流は怖いのでネットで検索したところ、やはりCLASSPATHを2つ通す必要があったようです。
本に載っていたのはTOMCATのWindows版5.0.18、使っているのはLINUX版の5.0.28です。
昔のJavaの本を見たところ、TOMCAT3.3のころは$CATALINA_HOME/lib/common/servlet.jarに通すように書いてあった。これも微妙にPATHが違うなあ。
う~ん、ヴァージョンが変わるごとにこういう所がコロコロ変わるので、ついていけないです・・・。

| | コメント (1) | トラックバック (0)

2004/10/03

JDBCデータソースを使おうとしてハマる

前回に引き続き、Webアプリケーションの作成をしております。

今回はJDBCデータソースを使おうってやつです。
データベースに接続する時、Javaのコードに接続情報を書いてしまうと、データベースが変わった時なんかにもう一度コードを書き換えてコンパイルする必要があるので、接続情報をTomcatに任せてしまおうってなものらしいです。
オレからすれば、そんなのソース書き換えた方が楽な気がするんだけど・・・。

ちなみに、前回、PostgresqlのJDBCドライバの置き場所で「TOMCATから使うなら、$TOMCAT_HOME/libが良いでしょう。」ってあったのは、JDBCデータソースを使う時の設定みたいですね。

で、まあ、わけの解らないままプログラムを打ち込んで実行したのですが、案の定エラーが。
例の、ドライバが読み込めません!!ってやつです。
JDBCデータソースを使うための設定を server.xml に書くのですが、どこに書けばいいのかわかりません。
適当な場所に書いたのがまずかったみたいです。(T_T)
本には、Context要素の中に書くってあったんだけど、server.xmlに、そんな場所が無い!!
昔WindowsのTomcat触ってた時は、あったような気がするんだけど。
バージョンの問題かな?ちなみに、今はLinux版の5.0.18を使っています。

ネットで調べても、server.xmlのContext要素内に書くってなのばかりで、よく解りません。

そう言えば、今のアプリケーションのContext要素がなんで無いんだ?
TomcatのAdminToolでいろいろ書き換えて調べてみたところ、server.xmlにはなんの変化もなし。
どこか書き換わったところがあるはずだと思って調べたら、conf/Catalina/localhost/ 内に、アプリケーション名のついたXMLファイルが作られていて、そこが書き換わっていました。
その中にContext要素があったので、そこに設定を書き込んだところ、うまく動くようになりました。
でも、ネットで調べても、そのような設定の仕方をしているのを見ないです。なんでだろう??

ちなみに、AdminToolを使って設定する場合、データソースの設定はグローバルで作っておいて、それをコンテキストごとにリソースリンクに設定するってのが正しいみたいです。
でも、ま、いいや。今のままでちゃんと動くんだし。

| | コメント (0) | トラックバック (0)

2004/10/02

TomcatからPostgresqlに接続してみる

IDG JAPANからでているJava WORLD for Beginnersというムックを買ってきました。

VineLinux2.5ではデフォルトでPostgresqlがインストールされているので、前からこいつを使う方法が無いものか?と思っていたのです。
そんな時に、このムックで Tomcat+Postgresql を使ったWebアプリケーションの作り方が載っていたので、作ってみようと思ったのでした。

この本では、Windows上で動かすのを前提で書いてあります。
Postgresql も、Cygwinで動かしてます。(汗)
ま、CygwinもLinuxも似たようなもんだろうと思って、深く考えずに作り始めたのでした。

で、なんとかPostgresqlを使おう!ってな所までたどり着き、実行してみたところエラーが!!
SQL Exception No suitable driver
そんなドライバは知らん!! と言われてます・・・。
そんなはずは!
ちゃんと Class.forName( "org.postgresql.Driver" ); でクラスを呼んでるし、
Connection connection = DriverManager.getConnection( DB_URL, DB_USER, DB_PASSWORD );
でコネクションオブジェクトも作成できてるはず!!

なんでや~!!と思ってPostgresql(Ver7.43)のページに行ってみた所、ドライバのある所にCLASSPATHを通さなくてはいけないらしい・・・。
「ドライバを使うためには、JAR ファイル (ソースからコンパイルした場合は postgresql.jar、そのほかの場合はそれぞれ JDBC 1、JDBC 2、JDBC 3 バージョンである、pg7.4jdbc1.jar、pg7.4jdbc2.jar、pg7.4jdbc3.jar)をクラスパスに含む必要があります。」
って書いてあったので、それらしきファイルを探してみたのだけど見つかりません・・・。

そんなばかな!
このPostgresqlには、JAVA用のドライバが無いのか?!?
ちょっとまて。こいつのPostgresqlのバージョンっていくつだっけ?と思ったら
/var/lib/pgsql/data/PG_VERSION
ってなそのまんまな名前のファイルを発見し、見てみたところ バージョン7.2でした。

で、バジョン7.2のページを見てみると、
「jar ファイル(ソースからコンパイルした場合は postgresql.jar、さもなくば、それぞれ jdbc1、jdbc2 バージョンである、jdbc7.2-1.1.jar または jdbc7.2-1.2.jar)をクラスパスに含む必要があります。」
って書いてある。

・・・・・ファイル名違うやん!! ころころ変えんな~!!

find / -name jdbc* とコマンド打って検索したら、出てきました! しかもバージョン違うのが4つも!(笑)

とりあえず、その1つにCLASSPATHを通して実行してみました。

・・・・また同じエラーが。 ????なんで????

Googleを使って検索してみると、どうやらJDBCのURLが間違っている時に出るエラーのようです。
ソース見ても間違っていないのにな~。わからん・・・。
CLASSPATHの通し方が違っているのかなと思い、調べてみると、
「TOMCATから使うなら、$TOMCAT_HOME/libが良いでしょう。」ってなのにヒットした。

なに~!?Tomcatに直接置けばいいのか!?
そんなのこのムックのどこにも載って・・・・・・。
・・・。載ってました~。(T_T)

本では、postgresql.jarをコピーし、WEB-INF\lib に置けばいい、みたいなことが書いてありました。
しかも、ここに置いておけばCLASSPATHを設定しなくても勝手に読んでくれるそうです。
で、 jdbc7.1-1.2.jar をWEB-INF\libに置いたら、ちゃんと動くようになりました!!

もっとしっかり本読んでおけば・・・・・。ま、ファイル名が違うことには気づいたんだから良しとするか。

| | コメント (0) | トラックバック (0)