【问题标题】:JSP shows wrong (old) valuesJSP 显示错误(旧)值
【发布时间】:2013-04-18 13:55:10
【问题描述】:

以下问题:

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

<a id="dice" href="GameServlet?action=wurfeln" tabindex="4">
                            <img id="diceImage" src="img/wuerfel1.png" alt="W&uuml;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;
        }
    }
}

所以我遇到的问题是,随着 Servlet(请求调度程序 ....)中 JSP 的新负载,它实际上应该在新 JSP 中显示更新的值。由于使用game.setSpielerScore(),它会更改一些变量,但它会继续显示使用构造函数调用设置的值。

我有三个可能的想法为什么会发生这种情况:

1) JSP 代码有问题,可能没有收集到正确对象的值。

2) Session JavaBeans 出了点问题,它没有为会话返回正确的游戏或其他东西。

3) 没有正确更新游戏对象的变量

【问题讨论】:

    标签: html jsp servlets javabeans server-side


    【解决方案1】:

    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"/>
    

    【讨论】:

    • 你先生是个天才!大赞! :)
    • 很高兴,我能帮上忙。需要注意的一点是,即使我们不在会话中存储游戏,您也应该看到跨会话对游戏的修改。由于您正在使用对对象的引用,因此将对实际对象进行更改,这类似于 Java 如何将对象传递给方法,传递引用的副本。请参阅:javaworld.com/javaqa/2000-05/03-qa-0526-pass.html 鉴于此,我们可以简单地将游戏放入请求中,这是我尝试在依赖会话之前推送所有信息的地方。
    猜你喜欢
    • 1970-01-01
    • 2020-04-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-29
    相关资源
    最近更新 更多