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ü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:(會議)
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)不`噸更新遊戲對象的變量正確
你的先生是一個天才要比! 大THX! :) –
很高興,我可以幫忙。有一件事要注意,即使我們沒有將遊戲存儲在會話中,也應該在會話中看到對遊戲的修改。由於您正在處理對象的引用,因此將對實際對象進行更改,這與Java將對象傳遞給方法以及傳遞引用副本的方式類似。請參閱:http://www.javaworld.com/javaqa/2000-05/03-qa-0526-pass.html鑑於此,我們可以簡單地將遊戲放在請求中,這是我嘗試在所有信息之前依靠會議。 –