2014-03-10 4 views
1

Я хочу установить данные из configures.properties через сервлет. configures.properties находится в WEB-INF/classes. Вот как я получаю данные:Настройка свойств через сервлет

public static String getDbPassword() { 
     Properties prop = new Properties(); 
     try { 
      // load a properties file 
      InputStream in = Configures.class.getResourceAsStream(INPUT_FILE); 
      prop.load(in); 

      // get the property value 
      return prop.getProperty("dbPassword"); 

     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
     return null; 
    } 

Но как установить? Это, как я сделал:

public static void setDbPassword(String str) { 
      Properties prop = new Properties(); 
      try { 
       //load a properties file 
       InputStream in = Configures.class.getResourceAsStream(INPUT_FILE); 
       prop.load(in); 
       prop.setProperty("dbPassword", str); 
       prop.store(new FileOutputStream(INPUT_FILE), null); 

      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     } 

Но я ловлю java.io.FileNotFoundException после этого. Я думаю, что это происходит после prop.store(new FileOutputStream(INPUT_FILE), null);. Как мне изменить OutputStream?

UPD: Это как INPUT_FILE выглядит:

private static final String INPUT_FILE = "/config.properties"; 

ответ

1

Вашего INPUT_FILE это путь ресурса, который getResourceAsStream рассосется по отношению к классам, но вы затем пытаетесь передать ту же строку в FileOutputStream конструктор, который будет пытаться и рассматривать его как абсолютный путь относительно корня из файловая система. Это два разных местоположения.

Вы можете использовать ServletContext.getRealPath("WEB-INF/classes" + INPUT_FILE), чтобы получить путь, необходимый для FileOutputStream.

Но проблема более высокого уровня заключается в том, что вы не должны предполагать, что ваше веб-приложение будет иметь доступ на запись к его WEB-INF, или даже если каталог существует на диске вообще (например, если приложение работает непосредственно из WAR а не каталог, распакованный на диск). Если вы хотите сохранить данные конфигурации, которые могут измениться, то он должен идти в файл в известном месте вне веб-приложение (расположение этого файла может быть параметром init), где вы знаете, что у вас будут права на чтение и запись. Это также останавливает изменение ваших изменений при развертывании новой версии приложения.

1
URL url = Configures.class.getResource(INPUT_FILE); 
File file = new File(url.toURI()); 
OutputStream outputStream = new FileOutputStream(file); 

... 

prop.store(outputStream, null); 
1

Попробуйте FileWriter вместо:

Writer writer = new FileWriter(INPUT_FILE); 
... 
prop.store(writer, null); 
+0

Нет, не работает. Никаких исключений, но ничего не меняется в свойствах. – Tony

+0

Вы развертываете с Eclipse и Tomcat? – Stefan

1

Вы можете попробовать следующее:

Во время чтения файл

URL url = classLoader.getResource(INPUT_FILE); 
InputStream in = url.openStream(); 

Хотя написание:

new FileOutputStream(url.toURI().getPath()) 
+0

Я думаю, я не могу получить свой файл с помощью URL-адреса, потому что он находится в WEB-INF – Tony

1

Любые файлы в веб-приложение следует рассматривать только для чтения. Если вы хотите изменить данные, вы должны использовать базу данных или другое хранилище данных.

J2EE рекомендует не манипулировать локальными файлами, так как это повышает проблемы кластеризации, транзакций и безопасности.

Смежные вопросы