私は、特定のユーザー向けに多数の画像(または共通ファイル)をGlassfishサーバーに格納するサーブレットを提供するJavaEEプロジェクトに取り組んでいます。ファイルを標準のWebプログラミングに保存するための標準のディレクトリがあるかどうか疑問に思います。
たとえば、ファイルをアップロードしたい3人のユーザーがいますが、サーバーに保存できますか?
標準のディレクトリはありません。サーバー上に各ユーザーにディレクトリを作成することをお勧めします。例: ユーザーが登録すると、一部のデータがデータベースに送信され、このユーザーのディレクトリも作成されます。このユーザーは、任意のファイルを自分のディレクトリにアップロードできます。
PSサーバー上の任意の場所にディレクトリを作成し、サーバーのJNDIリソースでディレクトリのパスを構成して、アプリケーションを検索できます。
java.util.Porperties の JNDI プロパティを処理するクラスを作成するPropertiesObjectFactory
必要があります (glassfish 2 を使用している場合)。または、カスタム ObjectFactory を作成することもできます。Glassfish 3 にはすでにこの機能があります。org.glassfish.resources.custom.factory.PropertiesFactory に設定されています。
Glassfish 管理コンソールを開き、[リソース] -> [JNDI] -> [カスタム リソース] に移動し、[新規] をクリックします。jndi/users_directories などの JNDI 名を入力し、リソース タイプ " java.util.Properties
" を選択し、Factory クラス: を指定org.glassfish.resources.custom.factory.PropertiesFactory
します。[プロパティの追加] をクリックし、eg: の名前を指定users.directories
して、値の列にディレクトリ パスをコピーします。この場合: /server/glassfish/users
. [OK] をクリックします。
アプリケーション サーバーを再起動します。
アプリケーションでルックアップを行います。
public Properties getProperties(String jndiName) {
Properties properties = null;
try {
InitialContext context = new InitialContext();
properties = (Properties) context.lookup(jndiName);
context.close();
} catch (NamingException e) {
LOGGER.error("Naming error occurred while initializing properties from JNDI.", e);
return null;
}
return properties;
}
アプリケーションでこのメソッドを呼び出すときは、アプリケーション サーバーで構成した JNDI 名を指定します: jndi/users_directories
。deploymet 記述子でリソースをマップした場合は、java:comp/env/jndi/users_directories を使用する必要があります。
春を使用して同じことをしたい場合:
<jee:jndi-lookup id="usersDirectories"
jndi-name="jndi/users_directories"/>
または、glassfish 2 を使用している場合は、カスタムの PropertiesObjectFactory クラスを作成します。
public class PropertiesObjectFactory implements Serializable, ObjectFactory {
/**
* File property name.
*/
public static final String FILE_PROPERTY_NAME = "org.glassfish.resources.custom.factory.PropertiesFactory.fileName";
/**
* Implemented method from object factory interface.
*
* @param obj object
* @param name name
* @param nameCtx context name
* @param environment environment
* @return file properties
* @throws Exception if error occurs
*/
public Object getObjectInstance(Object obj, Name name, Context nameCtx, Hashtable<?, ?> environment)
throws Exception {
Reference ref = (Reference) obj;
Enumeration<RefAddr> refAddrs = ref.getAll();
String fileName = null;
Properties fileProperties = new Properties();
Properties properties = new Properties();
while (refAddrs.hasMoreElements()) {
RefAddr addr = refAddrs.nextElement();
String type = addr.getType();
String value = (String) addr.getContent();
if (type.equalsIgnoreCase(FILE_PROPERTY_NAME)) {
fileName = value;
} else {
properties.put(type, value);
}
}
if (fileName != null) {
File file = new File(fileName);
if (!file.isAbsolute()) {
file = new File(System.getProperty("com.sun.aas.installRoot") + File.separator + fileName);
}
try {
if (file.exists()) {
try {
FileInputStream fis = new FileInputStream(file);
if (fileName.toUpperCase().endsWith("XML")) {
fileProperties.loadFromXML(fis);
} else {
fileProperties.load(fis);
}
} catch (IOException ioe) {
throw new IOException("IO Exception during properties load : " + file.getAbsolutePath());
}
} else {
throw new FileNotFoundException("File not found : " + file.getAbsolutePath());
}
} catch (FileNotFoundException fnfe) {
throw new FileNotFoundException("File not found : " + file.getAbsolutePath());
}
}
fileProperties.putAll(properties);
return fileProperties;
}
}
このクラスの .jar ファイルを作成し、サーバーのグローバル ライブラリ ディレクトリに配置します。このファクトリ クラスを JNDI リソースに提供し、サーバーを再起動すると、上記と同じルックアップを使用できます。