【问题标题】:Using Servlets and HTML使用 Servlet 和 HTML
【发布时间】:2011-01-02 16:12:27
【问题描述】:

我对 servlet 的使用有疑问。

在我正在构建的应用程序中,我使用 Html 页面向用户询问信息。

想象一个 Html 页面,它允许用户请求在屏幕上查看数据库的内容。我正在做的是:

1.- 在 Html 页面中,我正在调用一个 servlet,它将打开与数据库的连接。 2.- servlet 构建用户将看到的网页。

我的问题是:还有其他方法吗?我是否必须在 servlet 中构建网页,或者是否有任何方法可以将数据库中包含的信息发送到将构建网页的 .html 文件(在我的情况下,我需要在屏幕上显示一个包含所有信息)?

谢谢

【问题讨论】:

    标签: java html servlets


    【解决方案1】:

    我的 java 生锈了,但是...

    在您的数据访问层中,遍历结果集并构建自定义对象并将其插入到 ArrayList;

    class DataAccess {
        public ArrayList foo() {
            // Connect to DB
            // Execute Query
            // Populate resultSet
            ArrayList result = new ArrayList();
            while (resultSet.hasNext()) {
                CustomObject o = new CustomObject();
                o.setProperty1(resultSet.getInt(1));
                o.setProperty2(resultSet.getString(2));
                // and so on
                result.add(o);
            }
            return result;
        }
    }
    

    从您的Servlet 调用此方法。填充 ArrayList 后,将其放在 Request 对象上并转发到您的 .jsp 页面

    ArrayList results = DataAccessClass.foo();
    Request.setAttribute("Results", results);
    

    在您的 jsp 中,使用 scriptlet 构建您的标记

    <% foreach (CustomObject o in Request.getAttribute("Results"))
    {%>
    <td><%= o.getProperty1()</td>
    <td><%= o.getProperty2()</td>
    <% } %>
    

    祝你好运

    【讨论】:

      【解决方案2】:

      Servlet 旨在控制、预处理和/或后处理请求,而不是呈现数据。 JSP 作为一种视图技术,提供了编写 HTML/CSS/JS 的模板。您可以借助 JSTL 等标记库控制页面流程,并使用 EL 访问任何范围属性。

      首先创建一个SearchServlet 并将其映射到/search 的一个url-pattern 上并实现doGet()doPost(),如下所示:

      protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          // Preprocess request here and finally send request to JSP for display.
          request.getRequestDispatcher("/WEB-INF/search.jsp").forward(request, response);
      }
      
      protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
          // Postprocess request here. Get results from your DAO and store in request scope.
          String search = request.getParameter("search");
          List<Result> results = searchDAO.find(search);
          request.setAttribute("results", results);
          request.getRequestDispatcher("/WEB-INF/search.jsp").forward(request, response);
      }
      

      这是 JSP /WEB-INF/search.jsp 的样子,它利用 JSTL(只需将 JAR 放入 /WEB-INF/lib)来控制页面流。

      <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
      <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
      
      ...
      
          <form action="search" method="post">
              <input type="text" name="search">
              <input type="submit" value="search">
          </form>
      
          <c:if test="${not empty results}">
              <p>There are ${fn:length(results)} results.</p>
              <table>
                  <c:forEach items="${results}" var="result">
                      <tr>
                          <td>${result.id}</td>
                          <td>${result.name}</td>
                          <td>${result.value}</td>
                      </tr>
                  </c:forEach>
              </table>
          </c:if>
      

      注意JSP放在/WEB-INF中,防止用户通过URL直接访问。他们被http://example.com/contextname/search强制使用servlet。

      要了解更多关于 JSP/Servlets,我可以推荐Marty Hall's Coreservlets.com tutorials。想了解更多searchDAO背后的逻辑,我可以推荐这个basic DAO tutorial

      更进一步,您可以随时考虑使用构建在 Servlet API 之上的 MVC 框架,例如 Sun JSFApache StrutsSpring MVC 等,这样您就基本结束了只有 Javabeans 和 JSP/XHTML 文件。一般的 MVC 框架将负责收集请求参数、验证/转换它们、使用这些值更新 Javabean、调用一些 Javabean 操作方法来处理它们等等。这使得 servlet “多余”(不过它仍被用作框架的核心处理器)。

      【讨论】:

        【解决方案3】:

        最终浏览器必须向服务器发送请求以获取数据库信息。您可以通过多种方式做到这一点:

        1. 在 servlet 中构建整个页面(可能是最简单的)
        2. 在包含(比如)XML 数据的 servlet 中构建一个页面,浏览器将其呈现为 HTML(通过 XSL/Javascript 等)。如果您希望浏览器控制格式和显示,这可能是合适的。
        3. 构建一个包含 AJAX 请求的页面以返回服务器并获取数据。这可能更适合定期更新的数据或更具交互性的应用程序。

        有很多方法可以给这只猫剥皮。我怀疑你正在做最简单的,这很好。我倾向于在没有明确要求的情况下这样做,这意味着我需要做其他事情。使事情复杂化的进一步要求可能包括在屏幕上放不下太多数据时对数据进行分页。上述所有解决方案都可以以某种方式结合这一点。

        【讨论】:

        • 感谢您的回答。我还认为我在这里做的是最简单的事情(我的应用程序产生了一些结果,我想构建一个用户友好的环境)。我只是想知道我在这里是不是在做某种疯狂的事情,或者是不能做的事情。谢谢!
        • 我认为它完全合理,除非您有特定要求或性能考虑使其不切实际
        • 如果我想选择您描述的第二个选项......那会是什么?我的 servlet 连接到 MySQL 并在浏览器中打印一个表,其中包含存储在数据库中的信息。有什么我可以看到和研究的例子吗?谢谢
        【解决方案4】:

        除了 Servlet,Java 还具有 JSP 页面,这些页面是 HTML 和自定义标记(包括 Java 标准标记库或 JSTL)的混合体,最终编译成 Servlet。

        还有其他用于制作 Web 应用程序的技术,包括 Java Server Faces (JSF)、Apache StrutsSpring 等……尤其是 Spring,在现代 Web 应用程序开发中得到了非常广泛的应用。

        不过,最终,就像 Brian Agnew 所说的那样……您必须从浏览器到服务器来回通信。这些只是促进这一点的各种技术。

        【讨论】:

          猜你喜欢
          • 2019-08-20
          • 2012-01-25
          • 1970-01-01
          • 2015-03-27
          • 1970-01-01
          • 2020-02-04
          • 2014-03-04
          • 2012-12-07
          • 1970-01-01
          相关资源
          最近更新 更多