【问题标题】:Do you take a big performance hit mixing JSP and Servlets?混合 JSP 和 Servlet 是否会对性能造成很大影响?
【发布时间】:2010-10-04 01:26:15
【问题描述】:

据我了解,JSP 无论如何都会被编译,所以我预计您会从两者中获得相似的性能。我想显示很多数据,我正在考虑使用 JSP 作为基础,并调用一个 servlet 来为表中的每一行生成代码。除非有一种好方法可以通过一次调用 servlet 来生成整个表,否则这将意味着数百次调用,我认为这不是有效的。这里的“正确”方式是什么?直接的 servlet 会产生大量丑陋的 println 代码,而直接的 JSP 会产生大量丑陋的逻辑语句......

【问题讨论】:

  • 只是我不想在主要问题中包含的后续内容。我不知道如何通过一次调用 servlet 来编写整个表,因为将所有 HTML 代码放入单个字符串中似乎很难看。或者这就是它的完成方式,丑陋与否?
  • 你颠倒了。除非您使用 ajax,否则 servlet 会调用 jsp。 jsp 生成 HTML,而不是 servlet。 jsp 的工作是格式化数据。 servlet 的工作是以可消费的方式生成它。
  • 我不确定我是否跟上了,托尼。也许这是完全不正确的技术,但我实际上是在我的 Web 浏览器中直接进入 JSP,然后我在 BODY 中有一个类似 的行。格式不好?
  • 当然是不好的形式。这也许是你在 PHP 中的做法,但那是一种完全不同的语言。

标签: java jsp servlets


【解决方案1】:

@Tony 完全正确。只是不要在 Servlet 中打印 HTML。这份工作是为 JSP 准备的。也不要在 JSP 中编写原始 Java 代码。这项工作适用于 Servlet。只要牢记这两条简单的规则,一切都会顺利。

Servlet 的工作示例:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    List<Product> products = productDAO.list(); // Obtain all products.
    request.setAttribute("products", products); // Store products in request scope.
    request.getRequestDispatcher("/WEB-INF/products.jsp").forward(request, response); // Forward to JSP page to display them in a HTML table.
}

几乎没有 JSTL 帮助的 JSP 工作示例:

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
...
<table>
    <c:forEach items="${products}" var="product">
        <tr>
            <td>${product.name}</td>
            <td>${product.description}</td>
            <td>${product.price}</td>
        </tr>
    </c:forEach>
</table>

就这么简单:)

相关问题:

【讨论】:

  • 谢谢你,Balus,这是我在整个主题中遇到的最有用的信息!就像你刚刚打开电灯开关一样!
  • 不客气。请点击底部的链接,我希望一切都会变得更加清晰。
  • @ASTX813 - 想象一下当你的老板说他希望应用程序在黑莓上运行时会发生什么。现在,您的 servlet(不太关心输出设备)将发生很小的变化。这就是 BalusC 所展示的分离之美。
  • 我的大脑,好痛。该表实际上正在输出代码 ${product.name}... 等。开始阅读此内容,但任何立即“哦,是的,您忘记...”类型的东西?我的产品对象包含所有私有字段,所以我不确定为什么 product.name 会起作用。
  • @ASTX813 - 约定说 java 对象,尤其是那些用于在 servlet 和 jsp 之间进行通信的对象,应该对每个字段都有“getter”。您不必让公众设置值,但如果他们能够获取值,这将很有帮助。如果您有一个名为name 的私有字段和一个名为getName() 的公共getter,jsp 将在看到someClass.name 时做正确的事情。它实际上会使用反射来构造getName() 方法,然后调用它。
【解决方案2】:

servlet 加载一个类似地图的数据结构,将其放入请求中,然后转发给 jsp。 jsp 迭代和格式化。当用于善而不是恶时,它非常有效。

【讨论】:

    猜你喜欢
    • 2010-12-19
    • 2021-10-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-10
    • 1970-01-01
    • 1970-01-01
    • 2011-01-28
    相关资源
    最近更新 更多