Java servlet和javascript获取请求:对同一个servlet的多个请求,更新了游戏状态

时间:2019-03-01 00:52:34

标签: javascript java ajax servlets

我有:

  • Java类Game.java(包含代表游戏场的整数数组和更新该场的方法)
  • 一个servlet StartServlet(创建一个新的Game实例,对其进行1次更新并使用该字段发送JSON响应)
  • 和Javascript函数updateState()(采用servlet的 响应并基于该文档进行更改):

    public class Game  {
       private int[][] field;
    
       public Game(int size)  {
         //creates field of int[size][size] and randomly puts 1s and 0s inside
       }
    
       public void update()  {
         //updates field (1 or 0), depending on some rules
       }
    
       public String toString()  {
         //returns a String representation of the field array
       }
    
       public int[][] getField()  {return field;}
    }
    

和一个使用Game类的Servlet:

public class StartServlet extends HttpServlet {
     protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        JSONArray jsonArray = new JSONArray();
        Game game = new Game(15);
        game.update();   

        for (int i=0; i<game.getField().length; i++)  {
          //transfer data from the game's field to JSON
       }

       response.getWriter().println(jsonArray.toString());
     }
}

在前面,单击按钮时,Javascript会使用JSON返回的StartSevlet数组

$(document).on("click", "#start-button", function () {  
            //update game's state every second
            var timerId = setInterval(updateState, 1000);

            //do it for 5 seconds  
            setTimeout(function() {  
                clearInterval(timerId);
                alert( 'stop' );
            }, 5000);
});

function updateState()  {
        getResponseField(drawFieldJSON);
}

function getResponseField(callback)  {
    //gets JSON array from the servlet, stores it in Javascript's array

    callback(responseField);
}

function drawFieldJSON(responseField)  {
    //makes appropriate changes to document's divs, depending on the reponse array
}

我希望能够在Java循环中更新游戏状态,如下所示:

var timerId = setInterval(updateState, 1000);  //update game's state every second
setTimeout(function() {  //do it for 5 seconds
  clearInterval(timerId);
  alert( 'стоп' );
}, 5000);

但是,游戏并没有真正改变,因为它每次都是对servlet的新请求,并且每次都会创建一个新的Game实例。我不确定如何对其进行修改以使其正常工作,甚至不确定。

2 个答案:

答案 0 :(得分:2)

将游戏对象存储在会话中,并为每个请求从会话中获取游戏对象。这样它会为每个请求增加

答案 1 :(得分:1)

在Servlet类Game game = new Game(15);中将Game对象设为静态 在这种情况下,直到未部署Web应用程序为止,serlvet中的静态字段不仅会存在于所有会话和请求中,而且会存在于整个应用程序中。

请尝试如果您遇到任何问题或需要任何更新,请评论我将使用代码进行更新