我正在使用Spark(用于Java)为Web创建一个简单的跳棋游戏(这是一个课程)。我一直坚持这个问题,我对这个问题的研究并没有给我带来任何帮助。
在这个项目中,我们使用Spark(Spark + Jetty),FreeMarker,JS,HTML,CSS等.JS的整个代码库都是给我们的,如果我们做得对,它就按预期工作。我们不应该触摸JS。
现在,我正在尝试为用户点击游戏中的resign按钮创建一个POST方法。如果是这种情况,JS应该向'/ resignGame'发送一个POST,我已经创建了一个路由:
@Override
public Object handle(Request request, Response response) throws Exception {
Map<String, Object> vm = new HashMap<String, Object>();
vm.put("title", "Welcome!");
final Session session = request.session();
boolean sessionHasUser = session.attribute("username") != null;
if (!sessionHasUser) {
request.session().attribute("errorMessage", "You tried to resign a game, but you are not logged in.");
response.redirect("/");
return null;
}
final String username = (String) session.attribute("username");
if (gameLobby.isPlayerInGame(username)) {
Game game = gameLobby.getGame(username);
gameLobby.endGame(game);
Message message = new Message("Successfully resigned.", Message.Type.info);
System.out.printf("Converting object to JSON: %s\n", message.toString());
String json = gson.toJson(message);
System.out.printf("JSON: %s\n", json);
System.out.printf("Setting body to %s\n", json);
response.body(json);
response.redirect("/");
return null;
} else {
request.session().attribute("errorMessage", "You tried to resign a game, but you are not in a game.");
response.redirect("/");
return null;
}
}
差不多,这里发生的事情是我在会话中检查用户。之后,如果用户在会话中,我会获得用户名并检查玩家是否在游戏中。如果他们在游戏中,我就结束游戏。这是我收到错误的地方。以下是/ resignGame协议的说明:
总结一下,我们在响应主体中放置了一个Message对象(以JSON形式),如果resign成功则'type'为'info',如果resign不成功则为'error'。为了测试,我假设辞职是成功的,用户应该被带回主屏幕。因此,正如您在代码中看到的,我创建了消息对象,我打印出一些信息以确保它正确转换为JSON,然后将其放入响应主体并将其重定向回到主页。
然而,这不起作用。这是控制台输出:
Converting object to JSON: com.webcheckers.model.Message@4e873b6c
JSON: {"text":"Successfully resigned.","type":"info"}
Setting body to {"text":"Successfully resigned.","type":"info"}
但这是我收到的错误:
这个错误使得似乎将错误的东西发送到JS中。我不确定这里发生了什么,所以我发帖求助。我能够提供您要求的任何信息。
如果有人有Spark和这类东西的经验,请回复!
编辑:我没有重定向,而是添加了一个Spark.halt()来修复正在看到的302错误,但是现在又向我发送了一个新的弹出窗口:它说“未知错误(状态= 200)错误:SyntaxError:JSON输入的意外结束”
所以现在似乎输入的结束而不是开头。但是,控制台输出仍然是相同的(如将对象转换为json然后发送json时所见)
控制台视图: