2013-04-18 5 views
2

JSP показывает неправильные (старые) значения

Я использую сервлет как контроллер, JSB для модели и Java Beans для информации. Вот код:

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: (Session)

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; 
     } 
    } 
} 

Итак, проблема, что я испытываю, что с новой нагрузкой JSP в сервлет (запрос диспетчеру ....) это на самом деле должны показать обновленные значения в новый JSP. Поскольку с game.setSpielerScore() он меняет некоторые переменные, но он продолжает показывать значения, заданные с помощью вызова конструктора.

У меня есть три возможных идеи, почему это происходит:

1) Что-то не так в JSP кодекса, можно оленья кожа собрать значения правого объекта.

2) Что-то не так с Session JavaBeans, оно не возвращает правильную игру для сеанса или что-то в этом роде.

3) Это Безразлично `обновляет переменные объекта Game правильно

ответ

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. Учитывая это, мы можем просто поместить игру в запрос, где я пытаюсь вытолкнуть всю информацию до полагаясь на сеанс. –