реализация HttpSessionListener - PullRequest
       30

реализация HttpSessionListener

2 голосов
/ 10 марта 2011

Я сталкиваюсь с подобной проблемой и узнал, что мой класс слушателя будет создан при чтении файла web.xml. У меня есть несколько функций в классе слушателя, которые используются doPost основного сервлета (который взаимодействует с базой данных (mysql) для чтения / записи данных о пользователях.) Наряду с методами HttpSessionListener. Итак, что мешает контейнеру загрузить класс слушателя. Я получаю ошибку 404.

сниппет:

public class EntryServlet extends HttpServlet{
public void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {


    PlayersList playa = new PlayersList(); //listener class

    if(!playa.isExisting(params[3])){
        if(params[1].equals("Register")){           
            playa.addPlayer(params);
        }
    }       
    else
        out.println("Username already exists");


    if(playa.isExisting(params[argUName],params[argUPwd])){
        HttpSession session = request.getSession(true);     
        session.setMaxInactiveInterval(600);            
        HashMap playersMap = playa.getActivePlayers();
        //code . .
    }
    else
        out.println("Couldn't locate player Name!");    
        out.println(playa.getIn());         
}

Класс слушателя:

public class PlayersList implements HttpSessionListener{
private Connection cn;
private Statement st;

PlayersList(){
    try{
        Class.forName("com.mysql.jdbc.Driver");
        cn =  DriverManager.getConnection("jdbc:mysql://localhost/homeDbse\'","root","");
        st = cn.createStatement();
    }
    catch(ClassNotFoundException ce){}
    catch(SQLException se){}
    catch(Exception e){}
}   

public boolean isExisting(String player){
    //interaction with dbse
}   

public void addPlayer(String[] args){
    //interaction with dbse

}   
public void sessionCreated(HttpSessionEvent se){
    //session managing
}   
public void sessionDestroyed(HttpSessionEvent se){
    //session managing
}

1 Ответ

6 голосов
/ 10 марта 2011

Такой подход совершенно неверен. Вы должны делать это с другой стороны. Создайте Player объект, который реализует HttpSessionBindingListener и используйте его вместо этого.

public class Player implements HttpSessionBindingListener {

    @Override
    public void valueBound(HttpSessionBindingEvent event) {
        // Add player to list.
    }

    @Override
    public void valueUnbound(HttpSessionBindingEvent event) {
        // Remove player from list.
    }

    // ...

}

valueBound() будет срабатывать, когда вы делаете

Player player = new Player(name);
request.getSession().setAttribute("player", player);

valueUnbound() будет запущен по истечении сеанса или при удалении атрибута.


Вне зависимости от конкретной проблемы в вашем коде есть серьезные проблемы с JDBC. Это приложение будет аварийно завершать работу всякий раз, когда БД прерывает соединение, потому что оно было открыто слишком долго. Вы должны открыть и закрыть соединение, оператор и набор результатов в кратчайшем из возможных объеме. То есть закройте их в блоке finally того же блока try, где был выполнен SQL-запрос.

...