【问题标题】:Unable to print out list object contents using JSTL无法使用 JSTL 打印出列表对象内容
【发布时间】:2015-01-10 19:10:15
【问题描述】:

我正在从 Mysql 数据库中检索行并将每一行作为一个对象存储在列表中。 我将列表传递给请求范围,在此我尝试使用 JSTL 循环列表并访问对象变量。

这是我将行作为对象检索的方式:

    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException{

        // get list of objects
        List<Game> gameRatingsThisWeek = getHighestRatedGameThisWeek();
        request.setAttribute("gameRatingsThisWeek", gameRatingsThisWeek);

        RequestDispatcher rd = getServletContext().getRequestDispatcher("/dashboard.jsp");
        rd.forward(request, response);

    private List<Game> getHighestRatedGameThisWeek() {
        List<Game> list = new ArrayList<Game>();
        try(Connection con = ds.getConnection()){
            String query =   "SELECT overallRating, count(*) as Total, g.name"
                            +"FROM gameSurvey gs, game g"
                            +"WHERE g.id = gs.gameID AND"
                            +"date BETWEEN (NOW() - INTERVAL 7 DAY) AND NOW()"
                            +"GROUP by overallRating"
                            +"ORDER by Total desc";
            PreparedStatement ps = con.prepareStatement(query);
            ResultSet rs = ps.executeQuery();
            while(rs.next()){
                Game game = new Game();
                game.setName(rs.getString("name"));
                game.setRating(rs.getInt("overallRating"));
                game.setTotal(rs.getInt("Total"));
                list.add(game);
            }
            ps.close();

        }catch(SQLException e){}
        return list;

    }

}

我知道 SQL 查询没问题,因为我之前测试过。

这是游戏类:

public class Game {
    private int rating, total;
    private String name;

    // get
    public int getRating(){
        return rating;
    }
    public int getTotal(){
        return total;
    }
    public String getName(){
        return name;
    }

    // set
    public void setRating(int rating){
        this.rating = rating;
    }
    public void setTotal(int total){
        this.total = total;
    }
    public void setName(String name){
        this.name = name;
    }
}

在dashboard.jsp 文件中,我尝试遍历列表:

<c:forEach items="${gameRatingsThisWeek}" var="game">
    <c:out value="${game.name}"></c:out>
</c:forEach>

我导航到检索并转发到 .jsp 页面的 servlet。但是没有任何内容输出到网页。

【问题讨论】:

  • 你测试过你的list不为空吗?尝试在转发之前检查。
  • 请问如何检查?我不熟悉在 Eclipse 中调试以查看变量值。
  • 在 doGet 开始处添加断点,并在 gameRatingsThisWeek 上添加监视。为此,在调试模式下右键单击变量,然后单击“添加观察”。或者,只需在列表中添加一个 sysout(但先尝试调试器)。
  • 啊,我明白了,谢谢。显然,正如您所建议的那样,该列表是空的。我不明白为什么会这样。
  • 您的查询是串联的字符串文字,每行的末尾应该有空格。没有它们,您的 SQL 语句就会损坏。

标签: java mysql jsp servlets jstl


【解决方案1】:

您当前的查询在每个字符串文字中都缺少空格。这意味着您的数据库看到以下语句:

SELECT overallRating, count(*) as Total, g.nameFROM gameSurvey gs, game gWHERE g.id = gs.gameID ANDdate BETWEEN (NOW() - INTERVAL 7 DAY) AND NOW()GROUP by overallRatingORDER by Total desc

只需添加空格,然后再试一次。

        String query =   "SELECT overallRating, count(*) as Total, g.name "
                        +"FROM gameSurvey gs, game g "
                        +"WHERE g.id = gs.gameID AND "
                        +"date BETWEEN (NOW() - INTERVAL 7 DAY) AND NOW() "
                        +"GROUP by overallRating "
                        +"ORDER by Total desc";

【讨论】:

    猜你喜欢
    • 2016-03-13
    • 1970-01-01
    • 2019-08-14
    • 2016-11-10
    • 2021-04-16
    • 2012-09-11
    • 1970-01-01
    • 2017-01-29
    • 1970-01-01
    相关资源
    最近更新 更多