2013-07-09 24 views
0

我有我想要讓用戶輸入四個輸入字段,然後創建一個新文檔的XPage中實例化第二託管bean,並立即在同一個頁面上的Dojo數據網格中的文件顯示。我爲所有後端數據使用託管的bean。我有一個bean用於主文檔,第二個bean用於每個相關數據。我將使用UNID將它們綁定在一起。輸入字段都綁定到shipperBean。如何在一個XPage

我的問題是,父母和只有第一子文件被創建。看起來我需要實例化一個新的bean,但我認爲這是爲你完成的,就像在爲你管理。

以我按鈕我有以下SSJS:

var POdata:NotesDatabase = session.getDatabase(database.getServer(), "PO\\PO-data"); 
lineItemBean.saveLineItem(POdata); //MUST save line item in order to tie Shipper to Line Item 
var liUNID = lineItemBean.getThisUNID(); 
var poUNID = lineItemBean.getParentUNID(); 
shipperBean.saveShipper(POdata, liUNID, poUNID); 
shipperBean.deleteCurrentShipper(); 

該按鈕執行對錶保持輸入的局部刷新。 saveShipper()方法將bean保存到不同nsf中的新文檔中。 deleteCurrentShipper()方法簡單地將實例變量設置爲null。這會導致它們被清除並準備好下一個文檔。正確更新前端以反映清除值。在第一次之後輸入的任何值都不會保存到新文檔中,儘管它們每次都在前端被清除。

我需要在每次創建新實例,或者我可以重用像我試圖相同的實例?

我應該使用一個POJO,而不是創造它自己?

我不該使用SSJS,做這一切在另一個Java方法和調用?

我應該讓第二個bean成爲第一個屬性嗎?

有什麼簡單的我失蹤了嗎?

回答

1

我建議不要使用託管bean,因爲它似乎沒有爲您的過程增加很多價值。實際上試圖重置bean及其內容可能會導致問題發生。相反,定義一系列java類,並使用一個範圍爲預期生命週期(通常爲查看或請求)的對象數據源。然後,每次創建新的「對象」時,create方法都會建立父類的新實例。嘗試在SSJS中編碼的業務邏輯儘可能少。 SSJS的目的應該是將前端(XSP代碼)綁定到後端(java類)。即當我點擊按鈕A時,它應該觸發適用於父類的單個方法調用。創建額外的(子)類來封裝不同的對象。如果你有多對一的關係,Knut已經向我們建議了一些類。然後,父類的保存方法可以觸發將子類保存回Notes文檔。

+0

「,因爲它似乎沒有爲你的過程增加很多價值」 - 你可以自己管理它,當然,但我認爲在大多數情況下,管理生命週期值得使用bean。 –

+0

感謝您的回答。處理所有這些將會花費我一點時間,但我絕對會更新這些內容,並讓您知道最適合我項目的方法。 –

+0

我通過更改爲POJO或普通舊Java對象並使用構造函數自己創建對象來實現它。我不必像以前那樣把班改成一個大豆。現在我有更好的控制。感謝所有的答案,但是我會和Peter的答案一起去討論,因爲「使用託管bean似乎並沒有增加太多價值」。在這種情況下,我會說這是一個圓孔的方形釘。再次感謝Peter,Frantisek和Knut! –

1

如果定義在faces-config.xml中「管理」豆那麼就意味着它得到上一次使用自動實例。但是,它只會在您定義的範圍內(例如會話)存在一個實例。託管bean的每個用法都指向這個實例。

在您的例子這意味着lineItemBean在第一次只創建了按按鈕,然後同一個實例用於每單擊下一步按鈕。

我覺得你的情況最好是走這條路:

  • 在數據庫中創建您的shipperBean
  • 添加新lineItemBean到列表中的方法saveShipper()和創建文檔內的List<lineItemBean>
  • 添加方法getAllLineItems()返回List<lineItemBean>向您的數據網格提供數據
+0

謝謝克努特,我認爲這是有道理的。當我回到辦公室時,我會在週四嘗試。 –

1

我會建議使用這種方法:http://www.mindoo.de/web/blog.nsf/dx/16.07.2009095816KLEBCY.htm

你的豆應實現地圖界面和get()方法根據關鍵參數提供子對象。這樣你可以擁有非常簡單和「好」的綁定。假設你有一個提供對象「行」的「表」bean(子對象沒有被定義爲faces-conig.xml!中的bean)。在表格的get()方法中,您將實例化並緩存或從緩存中檢索適當的行對象。某些單元格的EL是「#{table [row_key] .attribute}」。