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

时间:2010-02-17 11:02:05

标签: java jsp servlets

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

response.getWriter().println

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

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

输出

secondline This is the first line

这是一个已知问题。为将页面打印到页面的JSP页面设计HelperClass的最佳方法是什么。任何指针都将非常感激。

1 个答案:

答案 0 :(得分:6)

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

${bean.property}

这就是全部。使用servlet来控制,预处理和后处理请求。使用taglib(例如JSTL)和EL来访问和显示后端数据。

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

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;
}

web.xml中的servlet映射到url-pattern /persons。 JSP隐藏在/WEB-INF中,因此没有人可以直接访问它而不首先请求servlet(否则会得到一个空表)。

现在,这是persons.jsp的样子,它使用JSTL(只需在/WEB-INF/lib jstl-1.2.jar中删除c:forEach来迭代List它使用EL来访问后端数据和bean属性。 servlet将List<Person>作为请求属性,名称为persons,以便EL中的${persons}可以使用它。 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打印数据”;)要了解有关JSTL的更多信息,请查看Java EE tutorial part II chapter 7并了解有关EL的更多信息,请查看Java EE tutorial part II chapter 5。要了解有关PersonDAO背后的更多信息,请查看this article