我正在尝试使用 Spring MVC 制作这个 2 人网络游戏应用程序。我有会话范围的 beanPlayer
和应用程序范围的 bean GameList
,它们创建和存储Game
实例并将它们传递给Players
. 玩家创建游戏并从中获取其 ID GameList
,其他玩家将 ID 发送到GameList
并获取Game
实例。该Game
实例将其玩家作为属性。问题是每个玩家只看到自己而不是另一个。
每个玩家看到的示例:
- 第一个玩家(Alice)创建一个游戏:
Creator: Alice, Joiner: Empty
- 第二个玩家(鲍勃)加入游戏:
Creator: Bob, Joiner: Bob
- 第一个玩家刷新她的浏览器
Creator: Alice, Joiner: Alice
我想让他们看到的是Creator: Alice, Joiner: Bob
。实现这一点的简单方法是保存有关玩家的信息而不是对玩家的引用,但是游戏对象需要调用其玩家对象的方法,因此这不是解决方案。
我认为这是因为aop:scoped-proxy
会话范围的 Player bean。如果我理解这一点,那么 Game 对象引用了代理,它指的是当前会话的 Player 对象。Game 实例可以以某种方式保存/访问其他 Player 对象吗?
dispatcher-servlet.xml中的 bean :
<bean id="userDao" class="authorization.UserDaoFakeImpl" />
<bean id="gameList" class="model.GameList" />
<bean name="/init/*" class="controller.InitController" >
<property name="gameList" ref="gameList" />
<property name="game" ref="game" />
<property name="player" ref="player" />
</bean>
<bean id="game" class="model.GameContainer" scope="session">
<aop:scoped-proxy/>
</bean>
<bean id="player" class="beans.Player" scope="session">
<aop:scoped-proxy/>
</bean>
controller.InitController中的方法
private GameList gameList;
private GameContainer game;
private Player player;
public ModelAndView create(HttpServletRequest request,
HttpServletResponse response) throws Exception {
game.setGame(gameList.create(player));
return new ModelAndView("redirect:game");
}
public ModelAndView join(HttpServletRequest request,
HttpServletResponse response, GameId gameId) throws Exception {
game.setGame(gameList.join(player, gameId.getId()));
return new ModelAndView("redirect:game");
}
model.gameList中调用的方法
public Game create(Player creator) {
Integer code = generateCode();
Game game = new Game(creator, code);
games.put(code, game);
return game;
}
public Game join(Player joiner, Integer code) {
Game game = games.get(code);
if (game!=null) {
game.setJoiner(joiner);
}
return game;
}