【问题标题】:Java Servlet: getting info from a DB and showing it on the screen [duplicate]Java Servlet:从数据库中获取信息并将其显示在屏幕上[重复]
【发布时间】:2024-05-23 14:50:01
【问题描述】:

我使用 Tomcat、Mysql 和 Servlets 开发了一个应用程序。

用户可以选择的选项之一是在网络浏览器上查看数据库表之一的信息。当用户选择此选项时,将使用一个 servlet。此 servlet 打开与数据库的连接并遍历行,显示信息。这没有问题。

为了在浏览器中显示这些信息,我使用了很多“out.println()”行。

虽然功能已实现,但我想知道是否有任何其他方式可以在浏览器上显示此信息。如果有人可以命名方法或提供示例链接,那就太好了。

非常感谢。

【问题讨论】:

    标签: java html servlets


    【解决方案1】:

    创建一个Javabean 类,它代表表的每个项目(行)。创建一个 DAO 类,该类使用 JDBC 返回这些项目的列表。然后在 servlet 中,只需使用 HttpServletRequest#setAttribute() 将项目列表放入请求范围内,使用 RequestDispatcher#forward() 将请求转发到 JSP 文件并使用 JSTL 迭代项目列表(只需将 jstl-1.2.jar 放入 @ 987654334@)c:forEach标签。

    基本启动示例:

    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        List<Item> items = itemDAO.list();
        request.setAttribute("items", items); // It's now available as ${items} in EL.
        request.getRequestDispatcher("/WEB-INF/result.jsp").forward(request, response);
    }
    

    result.jsp 看起来像这样:

    <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
    
    ...
    
    <table>
        <c:forEach items="${items}" var="item">
            <tr>
                <td>${item.someProperty}</td>
                <td>${item.anotherProperty}</td>
            </tr>
        </c:forEach>
    </table>
    

    有关更多提示和示例,您可能会发现this article 是一个有用的起点。

    你问这个是件好事。将表示逻辑放在 Servlet 类中是一种不好的做法。需要消除 Servlet 类中的任何 out.println() 语句。它属于一个 JSP 文件。

    更进一步,您还可以使用 MVC 框架,这样您基本上只得到一个 Javabean 类和一个 JSP 文件(即 servlet 的角色已被 MVC 框架接管)。

    【讨论】:

    • 您好,按照您的建议,我已经能够从我的 servlet 中删除所有 out.println。但是,我无法在创建 Javabean 类的 html 页面中打印数据库的内容。这个类有 3 个属性(标题、作者、专辑)。我能够将数据库表的每一行存储在 List 元素中(我已经使用:items.get(i).getTitle()、items.get(i).getAuthor() 和 items.get( i).getAlbum() 为每一行)。到目前为止,一切看起来都还不错。然后我将列表放入请求中,并将请求转发到 jsp 文件中。
    • 在 jsp 文件中一切正常。问题是不打印请求中发送的信息。它确实打印了表的标题(Title Author Album),但看起来 之间的代码没有任何影响。 jstl-1.2.jar 文件按照您的指示放置。我错过了什么吗?谢谢
    • 您使用的是哪个 Tomcat 版本? web.xml 中声明了哪个 Servlet 版本?生成的页面源是什么样子的? (在浏览器中右键单击页面并选择“查看源代码”)。您应该看不到任何 Java/JSP 标记,而只能看到纯 HTML。还可以尝试将${items}“plain vanilla”放入JSP 中,看看它是否在真实Java 代码中打印出与items.toString() 相同的值。顺便说一句,在Java中,taglibs也是区分大小写的,应该是&lt;c:forEach&gt;
    • 安装目录说是Tomcat 6.0。在 web.xml 它说:java.sun.com/xml/ns/javaee" xmlns:xsi="w3.org/2001/XMLSchema-instance" xsi:schemaLocation ="java.sun.com/xml/ns/javaee java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> 当我在 jsp 文件中使用 ${items} 时,它在浏览器中打印的信息与提供 items.toString() 的信息相同。谢谢
    • 好的,一切看起来都很好。 JSTL 只是没有她的工作 :) 页面源代码怎么样?顺便说一句,您是否根据其文档在 JSP 顶部声明了 taglib? java.sun.com/products/jsp/jstl/1.1/docs/tlddocs/c/…我看到我的回答中没有提到它。我会尽快更新我的答案(编辑:完成)。
    【解决方案2】:

    只需在众多web framework中选择一个

    【讨论】:

      【解决方案3】:

      尝试使用Java Server PagesJavaServer Pages Standard Tag Library。带有 JSTL 的 JSP 是一种使用类似 html 的语法 (xml) 来创建动态 Java 网页的方法。 JSP 在运行时转换为 Servlet。

      【讨论】:

        【解决方案4】:

        有很多不同的方法来实现相同的(感谢丰富的网络框架作品) 列举几个:

        纯 Servlet(如您所做的那样)

        Servlet + JSP

        Servlet + JSP(使用 JSTL)

        涉及 JSP 和动作类的 Struts 框架

        Spring webflows(涉及 JSP)

        Velocity、Tapestry、Cocoon、Stripes(都需要 JSP 知识)……而且无穷无尽

        一种理想的方法是将内容从 Servlet 中分离出来。 内容应该进入 JSP 等页面。 Servlet 的 out.println 是如此.. 90 年代。 从那时起,Java Web 技术已经取得了长足的进步。 干杯!

        【讨论】: