私はjspでプロジェクトを行いました.私はプロジェクト全体の戦争をしました.この戦争を別のマシンに展開すると、ログインに失敗したというエラーが表示されます.cz私のデータベース(SQLサーバー2005)のユーザー名とパスワード(現在はハードコードされています) jsp ファイル内) は、別のマシンとは異なります。接続の問題を発生させることなく、プロジェクトを任意のマシンで実行できるようにするためのトリックが必要です。cz 私は自分のプロジェクトのこのような種類のソフトウェアを作成したいのですが、それは多くのマシンに配布されます。その場合、この接続の問題は発生しないはずです Pl z は私を助けてくれます。
4 に答える
ハードコーディングではなくxmlファイルでデータベース関連の資格情報を構成し、展開中にxmlファイルで変更できます。その他のトリックは、プロパティファイルを使用して同じことを実行できることです。
別の方法でデータ ソースを定義すると、データ ソース ルックアップを使用して接続を取得できます。
したがって、最終的には、要件が何であるかに依存し、それに基づいてソリューションを提供できます。
もちろん、ハードコードされた資格情報を Web アプリに保存することはできません。
そのため、デプロイ先のサーバーの外部に保管する必要があります。
データソースなどの特定のコンテナー機能以外では、次のことができます。
1)Java設定を使用しますが、特にLinuxでTomcatを使用している場合、それらには非常に多くのバグがあるため、考慮しません(実行しました、掃除しました)
2) 接続プロパティを外部ファイルに入れます。これが私がそれを行う方法です:
WEB-INF ディレクトリに、これらのプロパティの承認済みの場所をすべてリストしたテキスト ファイルがあります。このファイルは、すべてのサーバーにそのままデプロイされます。例を次に示します。
# This file lists all the locations where mysoft will look for
# an XML config file when starting.
# It's recommended to use links to simplify parameterization but
# it's also possible to enrich this file.
# standard windows locations
c:\mycomp\mysoft\config\config.xml
d:\mycomp\mysoft\config\config.xml
# standard linux location
/var/lib/mycomp/mysoft/config/config.xml
そして、私の webapp は、初期化時に最初に見つかったファイルを選択するだけです。これを行うために、テキスト ファイルを読み取って構成を保存する ServletContextListener を実装しました。
これは私のリスナーの非常に単純化されたバージョンです:
public class MySoftServletContextListener implements ServletContextListener {
public final static String CONFIG_LIST_PATH = "/WEB-INF/config-paths.txt";
@Override
public void contextInitialized(ServletContextEvent contextEvent) {
InputStream list = context.getResourceAsStream(WORLD_LIST_PATH);
try {
BufferedReader listReader = new BufferedReader(new InputStreamReader(list));
String line;
while ((line=listReader.readLine())!=null) {
if (line.length()<4 || line.charAt(0)=='#') continue;
File file = new File(line);
if (file.exists()) {
// log config from the file and, for example, store it in a singleton
break;
} else {
log.info("No config in file " + line + " (file doesn't exist)");
}
}
list.close();
} catch (IOException e) {
e.printStackTrace();
log.severe("Error while looking for a config : " + e.toString());
}
}
}
サーブレット コンテキスト リスナーは、次のように web.xml で参照されます。
<listener>
<listener-class>com.mycomp.mysoft.webapp.MySoftServletContextListener</listener-class>
</listener>
答えは、ユーザー名とパスワード (または実際にはこれらのような構成の詳細) を jsp ファイルにハードコードしないことです。
同じ war を異なる環境にデプロイできるように、できれば war ファイルの外部で、接続の詳細を外部化する必要があります)
接続の詳細をプロパティ ファイルに配置し、そこから読み取る必要があります。次に、環境ごとに異なる war をビルドするようにビルド プロセスを構成するか、1 つの war をビルドして展開ごとにこれを展開し、接続プロパティを上書きしてから war を再パックします。Web サーバーによっては、他のオプションがあります。
これをどの環境で実行していますか - Tomcat? ボス?
資格情報だけではありません。データベース プロパティをハードコーディングしないでください。JavaEE は、実行時にデータソースを構成する素晴らしい方法を提供します。
- Servlet 3.0 Container を使用している場合は、web.xml でデータソース プロパティを設定し、データソースを使用できます。
- アプリケーションで特定の名前のデータソース リソースを検索し、必要なデータソースをバインドできます。リソース アノテーションを定義すると、サーブレット コンテナにデータソースを注入させることもできます。