我对JSP中的代码重用有疑问。我有一个JSP页面example.jsp,该页面发出对数据库的调用并获取结果。我有一个Java类HelperClass.java,它接受一条记录并打印出不同的字段
example.jsp
HelperClass.java
response.getWriter().println
现在,我的JSP页面也具有HTML,问题是HelperClass打印出的内容出现在JSP页面中的内容之前。例如
<body> This is the first line <br/> HelperClass.printdata("second line"); </body>
输出是
第二行这是第一行
这是一个已知的问题。HelperClass为JSP页面设计将内容打印到页面的最佳方法是什么。任何指针将不胜感激。
HelperClass
只是不要使用“ HelperClass来打印数据”。这是没有道理的。那里有EL。
${bean.property}
就这样。使用Servlet来控制,预处理和后处理请求。使用taglibs(例如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类。
Person
public class Person { private Long id; private String name; private String email; private Integer age; // Add/generate getters and setters here. }
该PersonDAO#list()方法只是返回List的Person从数据库对象:
PersonDAO#list()
List
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(否则将得到一个空表)。
web.xml
url-pattern
/persons
/WEB- INF
现在,persons.jsp它看起来像这样:它使用JSTL(只需将jstl-1.2.jar放到中/WEB- INF/lib)c:forEach来对a进行迭代,List并使用EL来访问后端数据和bean属性。Servlet已为List<Person>as请求属性添加了名称,persons以便${persons}在EL中可用。每次迭代c:forEach都会Person返回一个实例,以便您可以使用EL显示它们的属性。
persons.jsp
/WEB- INF/lib
c:forEach
List<Person>
persons
${persons}
<%@ 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教程第二部分第7章,而要了解有关EL的更多信息,请查看Java EE教程第二部分第5章。要了解有关PersonDAO背后内容的更多信息,请查看本文。