2

SpringMVCを使用してこの2人用Webゲームアプリケーションを作成しようとしています。セッションスコープのBeanPlayerとアプリケーションスコープのBeanGameListがあり、インスタンスを作成して保存Gameし、それらをに渡しますPlayers。オンプレイヤーはゲームを作成してそのIDを取得しGameList、他のプレイヤーはIDをに送信してインスタンスGameListを取得しGameます。インスタンスには、Game属性としてプレーヤーがあります。問題は、各プレイヤーが他のプレイヤーではなく自分だけを見ていることです。

各プレイヤーが見るものの例:

  1. 最初のプレーヤー(アリス)がゲームを作成します。Creator: Alice, Joiner: Empty
  2. 2番目のプレーヤー(ボブ)がゲームに参加します:Creator: Bob, Joiner: Bob
  3. 最初のプレーヤーがブラウザを更新しますCreator: Alice, Joiner: Alice

私が彼らに見てもらいたいのはですCreator: Alice, Joiner: Bob。これを実現する簡単な方法は、プレーヤーへの参照ではなくプレーヤーに関する情報を保存することですが、ゲームオブジェクトはプレーヤーオブジェクトのメソッドを呼び出す必要があるため、これは解決策ではありません。

aop:scoped-proxyセッションスコープのPlayerBeanが原因だと思います。これを理解すると、Gameオブジェクトには、現在のセッションのPlayerオブジェクトを参照するプロキシへの参照があります。ゲームインスタンスは他の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;
}
4

3 に答える 3

2

アプリケーションスコープから別のセッションスコープのBeanにアクセスすることはできません。

ただし、逆の方法で行うこともできます。アプリケーションスコープのBeanに各プレーヤーを登録します(を呼び出すことによりaddPlayer(..)

于 2010-05-24T13:57:45.693 に答える
1

私はあなたがあなたがあなた自身だけを見る理由である代理人についてあなたが正しいと信じています。プロキシへの参照は、セッション内のオブジェクトにのみ適用されます。

ゲームとプレーヤーをセッションスコープとして持つ必要がありますか?セッション間でそれらを使用しようとしているという事実は、それらがセッションスコープのデータではないことを示しています。ファクトリからそれらを作成し、それらの参照をセッションスコープのBeanに格納することができます。

または、プレーヤーをセッションスコープにする場合は、プロトタイプへの参照をセッションBeanでラップできます。次に、クロスセッションデータにプロトタイプ参照を使用し、セッション固有のローカルデータにセッションBeanを使用できます。

これを解決する方法はいくつかありますが、基本的には、クロスセッションデータをセッションスコープのBeanから、共有可能なアプリケーションスコープのBeanに移動する必要があります。

于 2010-05-24T13:54:57.980 に答える
1

はい。最も簡単な方法は、次のアノテーションを使用してプロキシを作成することです。

@Scope(value = "session", proxyMode = ScopedProxyMode.TARGET_CLASS)

Spring3.1から利用できます。昔は、XML構成でaop:scoped-proxyタグを使用する必要がありました

于 2014-05-22T08:41:16.840 に答える