Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > подключение файла *.properties


Автор: katala 13.5.2006, 17:56
у меня такая проблема. есть файл filter.properties
в web.xml пишу 
Код

<filter>    
        <filter-name>SessionCheckerFilter</filter-name>    
        <filter-class>filter.SessionCheckerFilter</filter-class>    
        <init-param>
            <param-name>properties</param-name>
            <param-value>/WEB-INF/conf/filter.properties</param-value>
        </init-param>
    </filter>

потом в классе 

Код

public class SessionCheckerFilter implements Filter {    
    private String filter_properties; 
    Properties p = new Properties();
    public void init(FilterConfig filterConfig) throws ServletException {    
        filter_properties=filterConfig.getInitParameter("properties");
        if (filter_properties == null || filter_properties.length() == 0) {
            filter_properties = filterConfig.getServletContext().getInitParameter("properties");
        }
        try {
              p.load(new FileInputStream(filter_properties));
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("FileNotFound");
        } catch (IOException e) {
            System.out.println("IOException");
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }

и при запуске проекта появляется на консоли ошибка 
Код


java.io.FileNotFoundException:\WEB-INF\conf\filter.properties (Системе не удается найти указанный путь)
    at java.io.FileInputStream.open(Native Method)
    at java.io.FileInputStream.<init>(FileInputStream.java:106)
    at java.io.FileInputStream.<init>(FileInputStream.java:66)
    at filter.SessionCheckerFilter.init(SessionCheckerFilter.java:23)
    at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:225)
    at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:308)
    at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:79)
    at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3698)
    at org.apache.catalina.core.StandardContext.start(StandardContext.java:4349)
    at org.apache.catalina.core.ContainerBase.addChildInternal(ContainerBase.java:823)
    at org.apache.catalina.core.ContainerBase.addChild(ContainerBase.java:807)
    at org.apache.catalina.core.StandardHost.addChild(StandardHost.java:595)
    at org.apache.catalina.core.StandardHostDeployer.install(StandardHostDeployer.java:277)
    at org.apache.catalina.core.StandardHost.install(StandardHost.java:832)
    at org.apache.catalina.startup.HostConfig.deployDirectories(HostConfig.java:701)
    at org.apache.catalina.startup.HostConfig.deployApps(HostConfig.java:432)
    at org.apache.catalina.startup.HostConfig.start(HostConfig.java:983)
    at org.apache.catalina.startup.HostConfig.lifecycleEvent(HostConfig.java:349)
    at org.apache.catalina.util.LifecycleSupport.fireLifecycleEvent(LifecycleSupport.java:119)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1091)
    at org.apache.catalina.core.StandardHost.start(StandardHost.java:789)
    at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1083)
    at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:478)
    at org.apache.catalina.core.StandardService.start(StandardService.java:480)
    at org.apache.catalina.core.StandardServer.start(StandardServer.java:2313)
    at org.apache.catalina.startup.Catalina.start(Catalina.java:556)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:324)
    at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:287)
    at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:425)
FileNotFound

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

Автор: ALKS 13.5.2006, 18:16
 зачем таким жутким способом properties читатать???? это специально задуманный мазохизм? 

Автор: katala 13.5.2006, 18:33
поскажи правильный способ. я ведь толком с ними и не работал

Добавлено @ 18:35 
не класс фильтр у меня там по другим причинам используется. вот само подключение
Код

filter_properties=filterConfig.getInitParameter("properties");    
        if (filter_properties == null || filter_properties.length() == 0) {    
            filter_properties = filterConfig.getServletContext().getInitParameter("properties");    
        }    
        try {    
              p.load(new FileInputStream(filter_properties));    
            }
 

Автор: w1nd 13.5.2006, 21:04
Я не уверен, что в WEB-INF можно вот так запросто лазить. Если апликуха не запакована, то поможет ServletContext.getRealPath(). 

Автор: ALKS 13.5.2006, 21:40
Цитата(katala @ 13.5.2006,  18:33)
поскажи правильный способ. я ведь толком с ними и не работал

Добавлено @ 18:35 
не класс фильтр у меня там по другим причинам используется. вот само подключение
Код

filter_properties=filterConfig.getInitParameter("properties");    
        if (filter_properties == null || filter_properties.length() == 0) {    
            filter_properties = filterConfig.getServletContext().getInitParameter("properties");    
        }    
        try {    
              p.load(new FileInputStream(filter_properties));    
            }

класс java.util.ResourceBundle предназначен, в частности, для того чтобы работать с файлам properties.

три основных пакета: java.lang, java.io и java.util . ты должен знать для чего предназначен каждый класс в этих пакетах.

katala, правильно ты с properties не работал никогда. но разобраться самостоятельно конечно не так просто как спросить на форуме и особо не вникая схватить готовое решение. не помню, писал я тебе или нет, но повторюсь - найди и прочти полностью одну книгу по Java. и еще настоятельно рекомендую хотябы проглядеть все статьи по java вот отсюда: http://forum.vingrad.ru/index.php?act=module&module=vingradfaq 
времени много не займет, а представление получиш о очень многих аспектах.  

Автор: Tirael 13.5.2006, 21:51
Слушь....название какое-то знакомое )))) 
Ты бы попросил, я бы тебе готовый дал  smile  smile  smile 

То что ты делаешь, надо делать наверное не в фильтре, а в листенере. 
Вот, например так :
Код

import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletException;
import java.util.ResourceBundle;
import java.util.Properties;
import java.util.Enumeration;
import java.io.InputStream;
import java.io.FileInputStream;

public class LocalePropertiesListener implements ServletContextListener {

    public void contextDestroyed(ServletContextEvent sce) {

    }
    public void contextInitialized(ServletContextEvent sce) {

        Properties props;
        String path = "/WEB-INF/classes/" + sce.getServletContext().getInitParameter("ChatPropertyFileName");
        path = sce.getServletContext().getRealPath(path);
        try {
            if (path != null) {
                InputStream fis = new FileInputStream(path);
                props=new Properties();
                props.load(fis);

                // многа кода

                fis.close();
        } catch(Exception e) {};
    }
}


а в web.xml вот что записанно
Код

    <context-param>
        <param-name>ChatPropertyFileName</param-name>
        <param-value>roomList.properties</param-value>
    </context-param>
...............................
    <listener>
        <listener-class>ru.vchat.web.listeners.LocalePropertiesListener</listener-class>
    </listener>


Цитата(katala @  13.5.2006,  17:56 Найти цитируемый пост)
 не понятно в чем проблема. может вы подскажите 

Настораживает то,  почему у тебя в стэк-трэйсе слэш не туда смотрит?
Возможно, действительно попробуй через realPath

Цитата(w1nd @  13.5.2006,  21:04 Найти цитируемый пост)
Я не уверен, что в WEB-INF можно вот так запросто лазить.

А почему бы и нет ?

Добавлено @ 22:01 
Еще одна вещь. В настройках проекта у тебя папочка /WEB-INF/conf причисленна к Source Folders ? Если нет, попробуй запихнуть не в /conf, а в /WEB-INF/classes.  

Автор: onsh76 14.5.2006, 01:56
katala, 
Простой совет начинающему: properties файлы должны быть в classpath-е. 
Tirael тебе уже подсказал что к чему. 
Если решил всерьез заниматься JEE web applications , то сервлет спекс - это как библия... 
Удачи. 

Автор: katala 14.5.2006, 13:16
вот как я сделал(и все пркрасно работает)

Код

package filter;
import javax.servlet.*;
import javax.servlet.GenericServlet;
import javax.servlet.http.HttpServletRequest;    
import javax.servlet.http.HttpServletResponse;    
import javax.servlet.http.HttpSession;    

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.Properties;


public class SessionCheckerFilter implements Filter {    
    private String filter_properties; 
    Properties p = new Properties();
    public void init(FilterConfig filterConfig) throws ServletException  {    
        filter_properties=filterConfig.getInitParameter("properties");
        if (filter_properties == null || filter_properties.length() == 0) {
            filter_properties = filterConfig.getServletContext().getInitParameter("properties");
        }
        try{
            if (filter_properties != null) {
                String realPath = filterConfig.getServletContext().getRealPath(filter_properties);
                if (realPath != null) {
                    filter_properties = realPath;
                }
                p.load(new FileInputStream(filter_properties));
            }
        }catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
            System.out.println("FileNotFound");
        } catch (IOException e) {
            System.out.println("IOException");
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        
    }    
    public void destroy() {    
    }    
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {    
        HttpServletRequest req = (HttpServletRequest) request;    
        HttpServletResponse res = (HttpServletResponse) response;    
        String contextPath = req.getContextPath();    
        String RequestURI =req.getRequestURI();
        HttpSession session = req.getSession(false);    
        //if(p.getProperty(req.getRequestURI()).equals("deny"))
        //System.out.println("RequestURI="+RequestURI+" p.getProperty(req.getRequestURI()= "+p.getProperty(RequestURI)+"!");
        
        if(session==null){
            req.getSession(true);
            req.getSession(false).setAttribute("property",p);
        }
        
        if( (session!=null && session.getAttribute("client")!=null) || p.getProperty(req.getRequestURI()).equals("deny")) {    
            chain.doFilter(request, response);    
        }else 
        {    
            req.getSession(false).setAttribute("request",req.getRequestURI());
            res.sendRedirect(contextPath + "/showLogin.html");    
        }    
    }    
}
.  но ввсе равно спасибо за помощь.

Цитата

Простой совет начинающему: properties файлы должны быть в classpath-е

вот с этим я не согласен
и с этим тоже 
Цитата

Я не уверен, что в WEB-INF можно вот так запросто лазить.
 

Автор: Tirael 14.5.2006, 13:54
И все таки рекомендую сделать чтение .properties не в фильтре, а в листенере. А сам объект Properties p сохранять в контескте.

Ибо:
1. Фильтры немного не для того преднозначенны. 
2. Ты можешь захотеть обратиться к данным из этого файла еще несколько, но уже из других мест. 

Автор: katala 14.5.2006, 14:00
Цитата

1. Фильтры немного не для того преднозначенны. 
2. Ты можешь захотеть обратиться к данным из этого файла еще несколько, но уже из других мест

ну во-первых фильтр не для этого и в методе  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException  вроде написано. 
а на счет 2 пункта достигается  одной строкой
    
 
Код

Properties p=(Properties)request.getSession(false).getAttribute("property");
 

Автор: Tirael 14.5.2006, 15:46
Стоп...

У тебя для каждой сессии будет свой пропери ? 
А зачем ? 
 

Автор: katala 14.5.2006, 15:53
почему???? он ведь один и тот же.  

Автор: Tirael 14.5.2006, 17:09
Один то он один, но зато в каждой сессии. 

Код

            req.getSession(false).setAttribute("property",p);

ты для каждого нового клиента делаешь новый атрибут.  А зачем ? Это же нехорошо. Клиентов много - много сессий - много одинаковых объектов. Сохраняй в контекст одну копию, а потом можешь доставать ее когда тебе надо. 

Автор: katala 14.5.2006, 18:56
самое интересное что мне и нужно на каждого клиента своя сессия поэтому здесь так я думаю можно сделать. а вообще в других случаях может ты и прав надо делать подругому но в данной ситуации это не значительно   

Автор: Tirael 14.5.2006, 21:05
Я тебя не понял. Или ты меня не понял. Или то и другое сразу.....
Чтоб убрать непонятки, скажи: 

Твой объект Properties p изменяется в программе ? 
Если да, то изменения в нем должны влиять на всех пользователей, или только и исключительно на одного ? 


З.Ы. Я считаю, что хранить сами объекты в сессии нехорошо. И тому есть причины. Чтобы изменить объект, который храниться в сессии, ты должен:
1. Достать его из сессии.
2. Изменить объект
3. Опять записать уже измененый объект обратно в сессию.


Слишком накладно. Как насчет того, чтоб хранить в сессии не сам объект, а некоторый его идентефикатор. Тогда, чтоб изменить объект тебе надо будет:
1. Достать идентефикатор из сессии
2. Найти объек через идентефикатор
3. Изменить объект


На мой взгляд это удобнее, быстрее, красивее. smile 
 

Автор: katala 14.5.2006, 22:51
Цитата

Твой объект Properties p изменяется в программе ? 

нет я только беру оттуда данные.
а по поводу этого 
Цитата

З.Ы. Я считаю, что хранить сами объекты в сессии нехорошо. И тому есть причины. Чтобы изменить объект, который храниться в сессии, ты должен:
1. Достать его из сессии.
2. Изменить объект
3. Опять записать уже измененый объект обратно в сессию.

Слишком накладно. Как насчет того, чтоб хранить в сессии не сам объект, а некоторый его идентефикатор. Тогда, чтоб изменить объект тебе надо будет:
1. Достать идентефикатор из сессии
2. Найти объек через идентефикатор
3. Изменить объект

я тоже только беру объек.  поэтому на скорость не влияет 

Автор: Tirael 14.5.2006, 23:09
Цитата(katala @  14.5.2006,  22:51 Найти цитируемый пост)
нет я только беру оттуда данные.

Ну тогда зачем хранить эти данные в КАЖДОЙ сессии ? 
Сохрани из в КОНТЕКСТЕ. 
Один раз.
На все времена.
И будет тебе счастье .....  smile  smile 

Вот полный пример листенера, который, в моем случае, читает данные из файла .properties (а именно: имена и описания комнат чата), создает соответствующие объекты (комнаты чата, список комнат чата) и сохраняет нужный объект в контексте ( список комнат чата)
Код

import ru.vchat.web.ChatRoomList;
import ru.vchat.web.ChatRoom;

import javax.servlet.ServletContextListener;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletException;
import java.util.ResourceBundle;
import java.util.Properties;
import java.util.Enumeration;
import java.io.InputStream;
import java.io.FileInputStream;

public class LocalePropertiesListener implements ServletContextListener {

    public void contextDestroyed(ServletContextEvent sce) {

    }
    public void contextInitialized(ServletContextEvent sce) {
        String bundle = sce.getServletContext().getInitParameter("VChatBundle");
        ResourceBundle resourceBundle = ResourceBundle.getBundle(bundle);
        sce.getServletContext().setAttribute("VChatBundle",resourceBundle);

        ChatRoomList roomList = new ChatRoomList();
        Properties props;
        String path = "/WEB-INF/classes/" + sce.getServletContext().getInitParameter("ChatPropertyFileName");
        path = sce.getServletContext().getRealPath(path);
        int maxOfMessages = Integer.parseInt(sce.getServletContext().getInitParameter("MaxOfMessages"));
        //System.out.println("MaxOfMessages: " + maxOfMessages);
        //System.out.println("path: "+ path);
        try {
            if (path != null) {
                InputStream fis = new FileInputStream(path);
                props=new Properties();
                props.load(fis);

                String roomName;
                String roomDescr;
                Enumeration keys = props.keys();
                while(keys.hasMoreElements()) {
                    roomName = (String)keys.nextElement();
                    roomDescr = (String)props.getProperty(roomName);
                    ChatRoom chatRoom = new ChatRoom(roomName, roomDescr);
                    chatRoom.setMaximumNumberOfMessages(maxOfMessages);
                    //System.out.println(roomName+" = "+ roomDescr);
                    roomList.addRoom(chatRoom);
                }
                fis.close();
                sce.getServletContext().setAttribute("roomList", roomList);
            } else {

            }
        } catch(Exception e) {};
    }
}
 

Потом можно легко получить данный объект. Например (из сервлета) вот так :
Код

ChatRoomList roomList = (ChatRoomList)getServletContext().getAttribute("roomList");
 

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)