Java 实现HttpSessionListener

Java 实现HttpSessionListener,java,servlets,web.xml,httpsession,servlet-listeners,Java,Servlets,Web.xml,Httpsession,Servlet Listeners,我面临着一个新的问题,并且已经了解到我的listener类将在读取web.xml时被实例化。我在listener类中有几个函数,主要servlet的doPost(与数据库(mysql)交互以读取/写入有关用户的数据)以及HttpSessionListener的方法使用这些函数。那么是什么阻止容器加载侦听器类呢。我得到了404错误 片段: public class EntryServlet extends HttpServlet{ public void doPost(HttpServletReq

我面临着一个新的问题,并且已经了解到我的listener类将在读取web.xml时被实例化。我在listener类中有几个函数,主要servlet的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
}

这种做法是完全错误的。你应该从另一边开始。创建一个
Player
对象来实现并使用它

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问题。只要数据库连接超时,该应用程序就会崩溃,因为它已打开太长时间。您应该在尽可能短的范围内打开和关闭连接、语句和结果集。也就是说,在执行SQL查询的同一
try
块的
finally
块中关闭它们。

您的PlayerList构造函数中有一些空的catch块。放置一些e.printStackTrace()以查看发生了什么。在本例中,实例化侦听器的不是容器,而是您,因为您调用PlayersList playa=new PlayersList()//listener classI清空它们以使代码简短:P System.out将在何处打印结果?我不知道如何检查错误消息。你能解释一下这一部分吗:在本例中,实例化侦听器的不是容器,而是你,因为你调用PlayersList playa=new PlayersList();我链接的另一个问题是,当web.xml被read.System.out和System.err打印到控制台时,侦听器由容器实例化。是的,侦听器由容器实例化,并在会话被破坏时由容器调用。但是你在代码中声明的那个类被你实例化为一个普通类,与容器无关。那么解决方案是什么呢?我不知道。我想你得调试一下。你得到了404,但你还不知道是什么引起的。是你们自己去发现的,深入挖掘。我能知道工作有什么问题吗?除了糟糕的方法!因为您正在
doPost()
内部构造一个
HttpSessionListener
实例。它打算在
web.xml
中注册,并由servletcontainer自己创建。在整个webapp的生命周期中,只需要一个实例就可以拦截所有用户会话。我应该如何维护数据库连接?每个玩家对象一个?不,每个SQL事务一个。如果要重用连接,请使用连接池。您绝对不应该在执行SQL查询的方法块之外声明
连接
或其他SQL资源。您好,我现在面临一个问题<代码>请求.getSession().setAttribute(“播放器”,播放器)当我刷新页面时,这一行再次执行,导致前一个播放器被解除绑定。如何修复它?