次の問題:
私はコントローラーとしてサーブレット、モデルには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 サーブレット呼び出し:
<a id="dice" href="GameServlet?action=wurfeln" tabindex="4">
<img id="diceImage" src="img/wuerfel1.png" alt="Würfel mit einer Eins" />
</a>
サーブレット:
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;
}
}
}
したがって、私が経験している問題は、サーブレット(リクエストディスパッチャー....)でのJSPの新しいロードにより、実際には新しいJSPで更新された値が表示されるはずです。これによりgame.setSpielerScore()
、いくつかの変数が変更されますが、コンストラクター呼び出しで設定された値が引き続き表示されます。
なぜこれが起こるのか、3つの考えがあります。
1) JSP コードに問題があります。正しいオブジェクトの値を収集できない可能性があります。
2) セッション JavaBeans に何か問題があります。セッションなどに適切なゲームが返されません。
3) Game オブジェクトの変数が正しく更新されない