2010-02-17 40 views
3

我对JSP中的代码重用有疑问。我有一个JSP页面example.jsp,它发出对数据库的调用并获得结果。我有一个接受的记录,并打印出不同领域用于打印内容的JSP帮助程序类

response.getWriter().println 

现在我的JSP页面HTML以及和问题是由助手类打印出来的内容出现在JSP页面中的内容之前的Java类HelperClass.java 。例如。

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

输出

secondline This is the first line 

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

回答

6

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

${bean.property} 

就这样。使用servlet来控制,预处理和后处理请求。使用taglibs(例如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()方法只是从数据库返回PersonList对象:

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上的/personsurl-pattern。 JSP隐藏在/WEB-INF中,这样没有人可以直接访问它,而无需首先请求该servlet(否则会得到一个空表)。

现在,这里是如何persons.jsp的样子,它使用JSTL(刚落,在/WEB-INF/libjstl-1.2.jarc:forEach遍历一个List,它使用EL访问后端数据和bean属性。该servlet已将List<Person>作为请求属性与名称persons放在一起,以便EL中的${persons}可用。 c:forEach中的每次迭代都会返回一个Person实例,以便您可以使用EL显示它们的proeprties。

<%@ 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。就这样。无需“帮助类打印数据”;)要了解有关JSTL的更多信息,请查询Java EE tutorial part II chapter 7并了解有关EL的更多信息,请检查Java EE tutorial part II chapter 5。要详细了解PersonDAO背后的内容,请检查this article

+0

感谢您的指点。我会研究JSTL和EL。 再次感谢。 – user275157 2010-02-17 14:15:30

+0

不客气。如果你有问题,只需在这里提问:) – BalusC 2010-02-17 14:21:31