構建數據庫數據的樹狀結構

本教程介紹如何用數據庫中的數據,動態地構建一個樹狀結構。使用 NetBeans Visual Web Pack 5.5,構建一個兩頁應用程序,第一頁包含一個 Tree 組件。使用來自數據庫的名稱,將一級節點填充在 Tree 中,使用人員的 trip 填充二級節點。trip 節點與第二頁鏈接,顯示該 trip 的詳細信息。

目錄

l      設計主頁

l      連接數據庫

l      使用數據庫表格構建樹狀結構

l      添加詳細信息

l      添加代碼

l      定以頁面導航

l      更多操作 Action 方法與 Tree 節點綁定

l      關於選擇 Tree 節點的一點說明

 

 

本教程將使用以下技術和資源

JavaServer Faces 組件/
Java EE
平臺

1.2 with Java EE 5*
1.1 with J2EE 1.4

Travel 數據庫

 

 

必需的

BluePrints AJAX 組件庫

不是必需的

* 該教程發佈時只有 Sun Java System Application Server 支持 Java EE 5

本教程與 Sun Java Application Server PE 9.0 Update Release 1 Tomcat 5.5.17 配合使用。

設計主頁

從構建包含 Tree 組件和 TRIP 數據庫表格的主頁開始。

  1. 創建一個新的可視化 Web 應用程序項目,並將其命名爲 DatabaseTree

2.      Palette Basic 部分將一個 Tree 組件拖動到頁面上鍵入 Travel Information並按 Enter Properties 窗口中,將 id 屬性設置爲 displayTree,將 clientSide 屬性設置爲 True

clientSide True 時,每個子節點(無論展開與否)都被髮送給客戶端,但是在父節點展開之前它們是不可見的。 clientSide False 時,僅提供展開父節點的子節點。

3.      選擇 Tree Node 1,右鍵單擊,從彈出菜單中選擇 Delete

在本應用程序中不需要 IDE 創建的初始 tree 節點因爲正在以編程方式填充 tree。如果未刪除該節點,在 JSP 標記屬性中設置的值將優於運行時設置,該頁將顯示此節點。

  1. Palette 中將 Message Group 組件拖動到頁面上較邊遠的位置比如頁面的右上角。

連接數據庫

下一步,將頁面與 Travel 數據源中的數據庫表格連接。然後使用 Query Editor 修改用於檢索數據的 SQL 查詢,使遊客的姓名按字母順序顯示,旅行日期則按時間順序顯示。

1.      打開 Runtime 窗口展開 Databases 節點驗證 Travel 數據庫已連接。

如果代表 TRAVEL 數據庫標記的 jdbc 節點斷開而且不能展開該節點 IDE 未與數據庫連接。右鍵單擊 TRAVEL jdbc 節點,並從彈出菜單中選擇 Connect。如果出現 Connect 對話框,爲 Password 輸入 travel,選擇 Remember Password During This Session,然後單擊 OK。如果未看到 TRAVEL 數據庫的 jdbc 節點,請參見 NetBeans Visual Web Pack 安裝說明,瞭解有關使數據庫爲 IDE 所用的信息。

注意如果正在使用 Apache Tomcat在嘗試連接數據庫之前 derbyClient.jar 文件複製到 /common/lib 目錄

2.      展開 TRAVEL 數據庫的 jdbc 節點然後展開 Tables 節點。

3.      TRIP 節點拖動到 Visual Designer 上面。

Outline 窗口顯示 Page1 部分的 tripDataProvider 節點以及 SessionBean1 部分的 tripRowSet 節點。

4.      Outline 窗口中右鍵單擊 tripRowSet 節點並選擇 Edit SQL Statement

在編輯區域出現帶有 TRIP 表格圖的 Query Editor

5.      Runtime 窗口中拖動 Travel > Tables > PERSON 節點並將其放置在 Query Editor Trip 表格圖的旁邊,另一個表格圖出現,且在兩個表格圖之間帶有鏈接或連接。

  1. PERSON 表格中清除對 PERSONID 複選框的選擇。

7.      Query Editor Design Grid 找到 TRAVEL.PERSON 表格的 NAME 行。單擊 Sort Type 單元格,並在下拉列表中選擇 Ascending

此操作將數據庫表格中的姓名按姓氏字母順序分類。

8.      找到 TRAVEL.TRIP 表格的 DEPDATE 行。單擊 Sort Type 單元格,並在下拉列表中選擇 Ascending

此操作將旅行日期按照由早到晚的順序分類。使用數據庫表格構建樹狀結構

現在添加一個請求 bean 屬性來保存應用程序中兩個頁都要使用的信息。然後向 prerender() 方法添加代碼,使用 TRIP PERSON 數據庫表格動態地構建 Tree 組件。

1.      打開 Page1使 Outline 窗口可見。在 Outline 窗口中右鍵單擊 RequestBean1 節點並選擇 Add > Property。將屬性命名爲 personId將類型輸入爲 Integer然後單擊 OK

該屬性保存遊客的 ID,如下圖所示。然後構建一個使用該屬性的 Trip 詳細頁面將當前遊客的 id 傳遞給 Page 1。設置該屬性時,Page 1 將該遊客的節點展開。

注意:由於該版本產品存在一個錯誤,可能需要關閉彈出菜單,然後再一次右鍵單擊 RequestBean 節點,激活 Add 子菜單。

2.      打開 Java Editor 中的 Page1然後滾動到 prerender 方法使用以下黑體顯示的代碼替換 prerender 方法的主體部分

代碼示例 1Page1 prerender 方法

    public void prerender() {

        // If the Request Bean's personId is set, then

        // we just came back from the Trip page

        // and had displayed a selected trip.

        // We use the personId later to determine whether

        // to expand a person's node

        Integer expandedPersonId = getRequestBean1().getPersonId();

        try {

            // Set up the variables we will need

            Integer currentPersonId = new Integer(-1);

            // If nbrChildren is not 0 then this is a

            // postback and we have our tree already

            int nbrChildren = displayTree.getChildCount();

 

            if (nbrChildren == 0) {

                // List of outer (person) nodes

                List outerChildren = displayTree.getChildren();

                // Erase previous contents

                outerChildren.clear();

                // List of inner (trip) nodes

                List innerChildren = null;

                // Execute the SQL query

                tripDataProvider.refresh();

                // Iterate over the rows of the result set.

                // Every time we encounter a new person, add first level node.

                // Add second level trip nodes to the parent person node.

                boolean hasNext = tripDataProvider.cursorFirst();

                while (hasNext) {

                    Integer newPersonId =

                            (Integer) tripDataProvider.getValue(

                            "TRIP.PERSONID");

                    if (!newPersonId.equals(currentPersonId)) {

                        currentPersonId = newPersonId;

                        TreeNode personNode = new TreeNode();

                        personNode.setId("person" + newPersonId.toString());

                        personNode.setText(

                                (String)tripDataProvider.getValue(

                                "PERSON.NAME"));

                        // If the request bean passed a person id,

                        // expand that person's node

                        personNode.setExpanded(newPersonId.equals

                                (expandedPersonId));

                        outerChildren.add(personNode);

                        innerChildren = personNode.getChildren();

                    }

 

                    // Create a new trip node

                    TreeNode tripNode = new TreeNode();

                    tripNode.setId("trip" +

                            tripDataProvider.getValue("TRIP.TRIPID").toString());

                    tripNode.setText(

                            tripDataProvider.getValue("TRIP.DEPDATE").toString());

                    tripNode.setUrl("/faces/Trip.jsp?tripId=" +

                            tripDataProvider.getValue("TRIP.TRIPID").toString());

                    innerChildren.add(tripNode);

                    hasNext = tripDataProvider.cursorNext();

                }

            }

 

        } catch (Exception ex) {

            log("Exception gathering tree data", ex);

            error("Exception gathering tree data: " + ex);

        } 

     }

      


  1. 該代碼讀取 trip 記錄這些記錄按 personId 順序排列。代碼爲每個 personId Tree 中創建一個新的一級節點。然後代碼爲與該 personId 相關的每個 trip 創建一個二級節點(嵌入節點)。最後,代碼將二級 trip 節點與 tripNode_action 方法綁定,本節的後面將創建該方法。

  2. Alt-Shift-F 來修正未發現類的錯誤。在 Fix Imports 對話框中確保 java.util.List 出現 Fully Qualified Name 字段中然後單擊 OK 

5.      運行項目。

Web 瀏覽器打開並顯示 Tree 組件,該組件在每個一級節點顯示有一個人員的姓名。展開一個節點,顯示該人員的旅行日期。注意,姓名按姓氏的字母順序顯示,日期按時間先後順序顯示,在下一節,您將添加代碼以便在用戶單擊 trip 節點時導航到第二頁。第二頁顯示用戶所選 trip 的詳細信息。

添加詳細信息頁

在此嚮應用程序添加了第二頁。本頁使用了 Property Sheet 組件,動態地顯示用戶在第一頁上所選 trip 的詳細信息。

  1. 打開 Projects 窗口右鍵單擊 Web Pages 節點然後從彈出菜單中選擇 New >Page。將新頁命名爲 Trip

2.      打開 Runtime Window然後將 Tables > TRIP 節點拖動到 Trip 頁面的 Visual Designer 上。在對話框中選擇 Create SessionBean1 tripRowSet1 旁邊的單選按鈕.
Outline
窗口顯示 Trip 部分中的 tripDataProvider1 節點以及 SessionBean1 部分中的 tripRowSet1 節點。

  1. Outline 窗口中右鍵單擊 tripRowSet1 節點並選擇 Edit SQL Statement

4.      Query Editor Design Grid 右鍵單擊 TRIPID 行中的任一單元格然後選擇 Add Query Criteria。在對話框中,將 Comparison 下拉菜單設置爲 =Equals,然後選擇 Parameter 單選按鈕。單擊 OK

TRIPID Criteria 列中可以看到 =?它在 SQL 查詢中添加以下 WHERE 子句。

WHERE TRAVEL.TRIP.TRIPID = ? 

  1. Visual Designer 中打開 Trip Page。從 Palette Basic 部分將一個 Hyperlink 組件拖動到頁面上鍵入 Home並按 Enter

6.      Hyperlink 組件的 Properties 窗口中單擊 action 屬性的省略號(…)按鈕從下拉列表中選擇 hyperlink1_action,然後單擊 OK

IDE hyperlink1_action 事件處理程序添加到 Java 源。

  1. Palette 中將 Message Group 組件拖動到頁面並將其放在 Hyperlink 組件的右面。

8.      Palette Layout 部分 Property Sheet 組件拖動到頁面上。將它放在 Hyperlink 組件的下方。

Property Sheet 組件爲佈置 trip 信息提供了一個容器。Property Sheet 組件包含 Property Sheet Section Property Sheet Section 則包含 Property 組件。

9.      選擇 Property Sheet Section 1 Properties 窗口中, label 屬性設置爲 Trip Details

注意如果項目源級別被設置爲 1.4則在 Properties 窗口中更改屬性表標籤後屬性表標籤不會被更新。

  1. Outline 窗口中展開 propertySheet1 > section1然後選擇 property1 節點。在 Properties 窗口中 label 屬性設置爲 Departure Date並按 Enter

  2. Outline 窗口內選擇 section1右鍵單擊並從彈出菜單中選擇 Add Property。在 Properties 窗口中,將 label 屬性設置爲 Departure City並按 Enter

12. Palette 中拖動 Static Text 組件並把它放在 Outline 窗口中 property1 節點上。

Static Text 成爲 property1 的一個子結點。Visual Designer 中也出現了 Static Text

13. 右鍵單擊 Static Text 組件然後從彈出菜單中選擇 Bind to Data。如有必要單擊 Bind to Data Provider 選項卡將該選項卡置於前端。在對話框中,選擇 Data 字段中的 TRIP.DEPDATE

Visual Designer Static Text 組件中出現當前日期。

  1. Static Text 組件添加到 property2。將 Static Text TRIP.DEPCITY 綁定。

 


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章