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ü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ü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ü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 правильно
Вы сударь это гениальная! Большой THX! :) –
Рад, я мог бы помочь. Следует отметить, что вы должны увидеть изменения в игре через сеансы, хотя мы не храним игру в сеансе. Поскольку вы работаете со ссылкой на объект, изменения будут сделаны на фактическом объекте, это похоже на то, как Java передает объекты методам, передавая копию ссылки. См .: http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.html. Учитывая это, мы можем просто поместить игру в запрос, где я пытаюсь вытолкнуть всю информацию до полагаясь на сеанс. –