java - 用于打印内容的 JSP 帮助程序类

标签 java jsp servlets

我对 JSP 中的代码重用有疑问。我有一个 JSP 页面 example.jsp,它发出对数据库的调用并获取结果。我有一个 java 类 HelperClass.java 接受记录并打印出不同的字段

response.getWriter().println

现在我的 JSP 页面也有 HTML,问题是 HelperClass 打印出的内容出现在 JSP 页面中的内容之前。例如

<body>
    This is the first line <br/>
    HelperClass.printdata("second line"); 
</body>

输出是

secondline This is the first line

这是一个已知问题吗?为将内容打印到页面的 JSP 页面设计 HelperClass 的最佳方法是什么。任何指针将不胜感激。

最佳答案

只是不要使用“HelperClass 来打印数据”。这是没有意义的。那里有 EL。

${bean.property}

就是这样。使用 servlet 来控制、预处理和后处理请求。使用标签库(例如 JSTL)和 EL 访问和显示后端数据。

这是一个在 JSP 中显示之前预处理请求的 Servlet 的基本启动示例:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    List<Person> persons = personDAO.list(); // Get list of persons from DB.
    request.setAttribute("persons", persons); // So it's available as `${persons}` in EL.
    request.getRequestDispatcher("/WEB-INF/persons.jsp").forward(request, response); // Forward to JSP for display.
}

在这里,Person只是一个代表现实世界实体的 Javabean 类。

public class Person {
    private Long id;
    private String name;
    private String email;
    private Integer age;
    // Add/generate getters and setters here.
}

PersonDAO#list()方法只返回 ListPerson来自数据库的对象:

public List<Person> list() throws SQLException {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    List<Person> persons = new ArrayList<Person>();

    try {
        connection = database.getConnection();
        statement = connection.createStatement("SELECT id, name, email, age FROM person");
        resultSet = statement.executeQuery();
        while (resultSet.next()) {
            Person person = new Person();
            person.setId(resultSet.getLong("id"));
            person.setName(resultSet.getString("name"));
            person.setEmail(resultSet.getString("email"));
            person.setAge(resultSet.getInteger("age"));
            persons.add(person);
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }

    return persons;
}

将 servlet 映射到 web.xml 中在 url-pattern 上的 /persons . JSP 隐藏在 /WEB-INF 中这样没有人可以在不先请求 servlet 的情况下直接访问它(否则会得到一个空表)。

现在,这里是如何persons.jsp看起来,它使用 JSTL (只需将 jstl-1.2.jar 放入 /WEB-INF/lib ) c:forEach 遍历 List它使用 EL 访问后端数据和 bean 属性。 servlet 已将 List<Person>作为名称为 persons 的请求属性以便 ${persons} 可用在EL。 c:forEach 中的每次迭代给出 Person返回实例,以便您可以使用 EL 显示它们的属性。

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>

...

<table>
    <c:forEach items="${persons}" var="person">
        <tr>
            <td>${person.name}</td>
            <td>${person.email}</td>
            <td>${person.age}</td>
        </tr>
    </c:forEach>
</table>

通过 http://example.com/contextname/persons 调用它.就这样。不需要“HelperClass to print data”;)要了解有关 JSTL 的更多信息,请查看 Java EE tutorial part II chapter 7要了解有关 EL 的更多信息,请查看 Java EE tutorial part II chapter 5 .要了解更多关于 PersonDAO 背后的东西,请查看 this article .

关于java - 用于打印内容的 JSP 帮助程序类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2280034/

相关文章:

java - 在 Java Spring 应用程序中找不到包

java - 将字符串 ArrayList 转换为 Double ArrayList

java - 从表单提交中获取两个值

java - 检查 MySQL 中的重复插入

java - 表未映射

Java 应用程序 Windows 与 Mac OS X

java - 使用我的公共(public) IP 创建 ServerSocket java

javascript - jsp-如何在 JavaScript 函数中复制 URL?

java - Google App Engine + Jersey + JSP 结果为 NOT_FOUND

java - 数据库连接 - java.net.UnknownHostException