2010-02-17 38 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