2013-04-18 75 views
2

如下問題:JSP顯示錯誤的(舊)值

我使用一個Servlet作爲控制器,JSB的型號和Java Bean的信息。下面的代碼:

HTML/JSP:

<table summary="Diese Tabelle zeigt Informationen zum aktuellen Spiel"> 
          <jsp:useBean id="game" class="model.Spiel" scope="session"/> 
          <tr><th id="leaderLabel" class="label">F&uuml;hrender</th><td id="leader" class="data"><%= game.getLeader() %></td></tr> 
          <tr><th id="roundLabel" class="label">Runde</th><td id="round" class="data"><%= game.getRound() %></td></tr> 
          <tr><th id="timeLabel" class="label">Zeit</th><td id="time" class="data"><%= game.getTime() %></td></tr> 
          <tr><th id="computerScoreLabel" class="label">W&uuml;rfelergebnis <em>Super C</em></th><td id="computerScore" class="data"><%= game.getComputerScore() %></td></tr> 
         </table> 

HTML的Servlet電話:

<a id="dice" href="GameServlet?action=wurfeln" tabindex="4"> 
          <img id="diceImage" src="img/wuerfel1.png" alt="W&uuml;rfel mit einer Eins" /> 
         </a> 

的Servlet:

if(action.equals("wurfeln")){ 
      // Get right game for the session 
      Spiel game; 
      HttpSession session = request.getSession(true); 
      if(sessions.getGame(session)==null) { 
       sessions.newSessions(session); 
       game = sessions.getGame(session); 
      } 
      else { 
       game = sessions.getGame(session); 
      } 

      // Runt methods on game 
      game.setSpielerScore(); //Spieler würfelt 
      game.setComputerScore(); //Computer würfelt 

      // Load new JSB 
      RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/table.jsp"); 
      dispatcher.forward(request, response); 
     } 

的Java Bean:(遊戲)

package model; 
import java.util.Random; 

public class Spiel { 
    private int Runde; 
    private String Zeit; 
    private int Spieler_Feld; 
    private int Spieler_Wurfelergebnis; 
    private String Spieler_Name; 
    private int Computer_Feld; 
    private int Computer_Wurfelergebnis; 
    private String Computer_Name; 
    private Random x; 

    public Spiel() { 
     this.Runde   = 1; 
     this.Zeit   = "00:00"; 
     this.Spieler_Feld = 1; 
     this.Computer_Feld = 1; 
     this.Spieler_Name = "Super Mario"; 
     this.Computer_Name = "Super C"; 
     this.x    = new Random(); 
     this.Spieler_Wurfelergebnis = 0; 
     this.Computer_Wurfelergebnis = 0; 
    } 

    public void setRound(int round) { 
     this.Runde = round; 
    } 

    public void setTime(String time) { 
     this.Zeit = time; 
    } 

    public String getTime() { 
     return this.Zeit; 
    } 

    public int getRound() { 
     return this.Runde; 
    } 

    public void newRound() { 
     this.Runde += 1; 
    } 

    public String getLeader() { 
     if(this.Spieler_Feld > this.Computer_Feld) { 
      return this.Spieler_Name; 
     } 
     else if(this.Spieler_Feld < this.Computer_Feld){ 
      return this.Computer_Name; 
     } 
     else { 
      return "beide"; 
     } 
    } 

    public void setSpielerScore() { 
     //Spieler würfelt 
     //this.Spieler_Wurfelergebnis = this.x.nextInt(3)+1; 
     this.Spieler_Wurfelergebnis = 3; 
    } 

    public void setComputerScore() { 
     //Computer würfelt 
     //this.Computer_Wurfelergebnis = this.x.nextInt(3)+1; 
     this.Computer_Wurfelergebnis = 2; 
    } 

    public int getSpielerScore() { 
     return this.Spieler_Wurfelergebnis; 
    } 

    public int getComputerScore() { 
     return this.Computer_Wurfelergebnis; 
    } 
} 

的Java Bean:(會議)

package model; 

import java.util.ArrayList; 
import java.util.HashMap; 
import java.util.List; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 
import javax.servlet.http.HttpSession; 

public class Sessions { 
    HashMap<HttpSession, Spiel> sessions = new HashMap<HttpSession, Spiel>(); 

    public void newSessions(HttpSession s) { 
     if(!sessions.containsKey(s)) { 
      Spiel newgame = new Spiel(); 
      sessions.put(s, newgame); 
     } 
    } 

    public Spiel getGame(HttpSession s) { 
     Spiel spiel = sessions.get(s); 
     if (spiel != null) { 
      return spiel; 
     } 
     else { 
      return null; 
     } 
    } 
} 

那麼我遇到的問題是,與在Servlet的JSP的新的負載(請求調度....)它實際上應該顯示更新的值新的JSP。由於game.setSpielerScore()會更改一些變量,但它會繼續顯示constructer調用設置的值。

我有三個可能的想法,爲什麼發生這種情況:

1)有些事情不對的JSP代碼,它可能犯規收集正確對象的值。

2)會話JavaBeans有什麼問題,它不會爲會話或其他事情回饋正確的遊戲。

3)不`噸更新遊戲對象的變量正確

回答

2

game屬性需要在請求中進行設置。

if(action.equals("wurfeln")){ 
      // Get right game for the session 
      Spiel game; 
      HttpSession session = request.getSession(true); 
      if(sessions.getGame(session)==null) { 
       sessions.newSessions(session); 
       game = sessions.getGame(session); 
      } 
      else { 
       game = sessions.getGame(session); 
      } 

      // Runt methods on game 
      game.setSpielerScore(); //Spieler würfelt 
      game.setComputerScore(); //Computer würfelt 

      request.setAttribute("game", game);//set the game in the request. 

      // Load new JSB 
      RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/table.jsp"); 
      dispatcher.forward(request, response); 
     } 

JSP

<jsp:useBean id="game" class="model.Spiel" scope="request"/> 
+0

你的先生是一個天才要比! 大THX! :) –

+0

很高興,我可以幫忙。有一件事要注意,即使我們沒有將遊戲存儲在會話中,也應該在會話中看到對遊戲的修改。由於您正在處理對象的引用,因此將對實際對象進行更改,這與Java將對象傳遞給方法以及傳遞引用副本的方式類似。請參閱:http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.html鑑於此,我們可以簡單地將遊戲放在請求中,這是我嘗試在所有信息之前依靠會議。 –