JSP显示错误(旧)值

时间:2013-04-18 13:55:11

标签: html jsp servlets javabeans server-side

以下问题:

我使用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 Call:

<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)Session JavaBeans出了问题,它没有为会话或其他东西回馈正确的游戏。

3)它没有正确更新Game对象的变量

1 个答案:

答案 0 :(得分: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"/>