用于打印内容的JSP帮助程序类
我有一个关于JSP中代码重用的问题。 我有一个JSP页面example.jsp
,它发出对数据库的调用并获取结果。 我有一个java类HelperClass.java
接受记录并打印出不同的字段
response.getWriter().println
现在我的JSP页面也有HTML,问题是HelperClass打印的内容出现在JSP页面中的内容之前。 例如
This is the first line
HelperClass.printdata("second line");
输出是
secondline这是第一行
这是一个已知的问题。 为JSP页面设计HelperClass
的最佳方法是将页面打印到页面。 任何指针都将非常感激。
只是不要使用“HelperClass来打印数据”。 这毫无意义。 那里有你的EL。
${bean.property}
就这样。 使用servlet来控制,预处理和后处理请求。 使用taglib(例如JSTL)和EL来访问和显示后端数据。
这是Servlet的基本启动示例,它在JSP中显示之前预处理请求:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { List 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()
方法只返回DB中的Person
对象List
:
public List list() throws SQLException { Connection connection = null; Statement statement = null; ResultSet resultSet = null; List persons = new ArrayList (); 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; }
将weblet中的servlet映射到/persons
的url-pattern
。 JSP隐藏在/WEB-INF
因此没有人可以直接访问它而不首先请求servlet(否则会得到一个空表)。
现在,这里是persons.jsp
样子,它使用JSTL (只需在/WEB-INF/lib
删除jstl-1.2.jar ) c:forEach
迭代List
并使用EL访问后端数据和bean属性。 servlet已将List
作为请求属性与名称persons
放在一起,以便EL中的${persons}
可以使用它。 c:forEach
每次迭代都会返回一个Person
实例,以便您可以使用EL显示它们的proeprties。
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> ... ${person.name} ${person.email} ${person.age}
请通过http://example.com/contextname/persons调用它。 就这样。 不需要“HelperClass来打印数据”;)要了解有关JSTL的更多信息,请查看Java EE教程第二部分第7章,并了解有关EL的更多信息,请查看Java EE教程第二部分第5章 。 要了解有关PersonDAO背后的更多信息,请查看此文章 。