2

私は同様の問題に直面しており、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
}
4

1 に答える 1

7

このアプローチは完全に間違っています。あなたは反対側からそれをしているべきです。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の問題があります。このアプリケーションは、開いている時間が長すぎるためにDBが接続をタイムアウトするたびにクラッシュします。可能な限り短いスコープで、接続、ステートメント、および結果セットを開いたり閉じたりする必要があります。つまり、SQLクエリが実行されたfinallyのとまったく同じブロックのブロックでそれらを閉じます。try

于 2011-03-10T13:20:21.640 に答える