проблема в файле свойств - PullRequest
0 голосов
/ 13 января 2010

Я хочу загрузить файл свойств при запуске tomcat. Поэтому я использую servletContextListener, чтобы сделать это, и я могу получить значения файла свойств для моего веб-приложения. Но я хочу сохранить то же значение после изменения файла свойств после входа в веб-приложение. Но когда я изменяю значение файла свойств и снова захожу в систему, оно меняет значение на новое. Я хочу сохранить то же значение, которое было загружено когда Tomcat был запущен. Как я могу это реализовать?

Моя кодировка указана ниже

import javax.servlet.*;
import java.io.IOException;
import java.util.Properties;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.io.*;
import java.util.ResourceBundle;


public final class sysProperties  implements javax.servlet.ServletContextListener {   
   private static Properties props = new Properties();
   private static String file_name = "com/util/contact.properties";

   public addSystemProperties() {
   }

   public void contextInitialized(ServletContextEvent servletContextEvent) {

        // Get the context
        ServletContext servletContext = servletContextEvent.getServletContext();

        // Set a context attribute
        try {
            // props.load(servletContext.getResourceAsStream(file_name));
            props.load(getClass().getClassLoader().getResourceAsStream(file_name));

            System.out.println(" Application X is starting");

            servletContext.setAttribute("h1",props.getProperty("home.h1"));
            servletContext.setAttribute("h2",props.getProperty("home.h2"));

            System.out.println("h1"+servletContext.getAttribute("h1"));
            System.out.println("h2"+ servletContext.getAttribute("h2"));
            ;

        } catch (Exception e) {
            System.out.println(" Error setting context attribute: " + e.getMessage());
        }
    }

   public void contextDestroyed(ServletContextEvent servletContextEvent) {

        // Get the context
        ServletContext servletContext = servletContextEvent.getServletContext();

        // Output the context variable we set earlier
        System.out.println(" Application X is shutting down");
        System.out.println(" Value of h1 is: " + servletContext.getAttribute("h1"));
        System.out.println(" Value of h2 is: " + servletContext.getAttribute("h2"));

        // Clean up (not really necessary as the context is being destroyed, but let's be neat)
        servletContext.removeAttribute(props.getProperty("h1"));
        servletContext.removeAttribute(props.getProperty("h2"));   
    }
}

Ответы [ 2 ]

0 голосов
/ 19 февраля 2013

Я пытался сделать то же самое.

Я закончил тем, что заново создал файл свойств вне папки приложения, а затем прочитал новый файл в веб-сервисе.

class SetKey{

PrintWriter output = null;

public void writeToFile(HashMap map, String fileName) throws Exception {
    Properties properties = new Properties();
    Set set = map.keySet();
    Iterator itr = set.iterator();
    while (itr.hasNext()) {
        String key = (String) itr.next();
        String value = (String) map.get(key);
        properties.setProperty(key, value);
    }
    properties.store(new FileOutputStream(fileName), "");
}

}

А затем, в контексте слушателя:

               SetKey wtp;
                wtp = new SetKey();
                HashMap map = new HashMap();
                map.put("NewKey", Value);
0 голосов
/ 13 января 2010

Я подозреваю, что по какой-то причине инициализация вашего контекста вызывается более одного раза. Вы видите это заявление о печати несколько раз "Приложение X запускается"? Если это вызывается несколько раз, то способ убедиться, что ваши свойства не загружают новые данные, это убедиться, что они загружаются только один раз ... см. Код

....
private static Properties props = null;
....
public void contextInitialized(ServletContextEvent servletContextEvent) {

    // Get the context
    ServletContext servletContext = servletContextEvent.getServletContext();

    // Set a context attribute
    try {
        // props.load(servletContext.getResourceAsStream(file_name));
        if (props == null)
        {
            props = new Properties();
            props.load(getClass().getClassLoader().getResourceAsStream(file_name));
        }
        System.out.println(" Application X is starting");

        servletContext.setAttribute("h1",props.getProperty("home.h1"));
        servletContext.setAttribute("h2",props.getProperty("home.h2"));

        System.out.println("h1"+servletContext.getAttribute("h1"));
        System.out.println("h2"+ servletContext.getAttribute("h2"));
    } catch (Exception e) {
        System.out.println(" Error setting context attribute: " + e.getMessage());
    }
}    

Используя нулевое состояние, чтобы проверить, загружен ли он ранее, вы можете убедиться, что он загружен только один раз. Конечно, вы можете использовать логический или какой-то другой индикатор.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...