2012-08-16 126 views
2

我們使用的是struts 1.2.2,這裏有一個情況。 所以我們有2個窗體FormA和FormB。 我們還有2個ActionA和ActionB操作。struts 1.2 - 將一個值從一個動作傳遞到另一個動作

現在ActionA在調用時獲取FormA作爲提交的bean。它執行所有處理,保存表單,創建OrderId,如果成功則轉發給ActionB。 ActionB然後根據OrderId填充FormB,然後轉發到下一個jsp。

我們不希望2行爲共享表單,因爲內容非常不同,我們希望表單僅表示它在jsp頁面上表示的內容。同樣在每個頁面上,我們都將內容保存在Db上。該流程有5頁,一頁可以在2頁之後離開 - 再次返回並從第1頁開始。但是頁面1和頁面2應從數據庫中檢索數據並顯示。因此,如果存在orderID,我們通過從數據庫中獲取數據來基於該orderId填充表單。

但是我沒有找到一個簡單的方法將這個orderId從一個動作傳遞給另一個動作。

我不能在ActionA的末尾使用request.setAttribute(),因爲控件到達ActionB時它現在有一個全新的請求對象。我猜測從一個動作到另一個動作發生的轉發請求會被刷新。但是,如果它轉發給jsp,請求將被保留。

不想將訂單存儲在會話session.setAttribute()有人可能試圖爲書籤的網址,然後該網頁將只需拿起上次存儲的OrderId會話,並嘗試來處理。

也沒有辦法,我們可以把它放在formbeans,因爲這是不共享。

一種選擇是將URL作爲參數傳遞給參數,例如, ActionB?OrderId = 89。然而,不利的一點是有人可以更改URL中的orderId並嘗試爲該隨機orderId提取數據。雖然我們可以隨時進行檢查以防止某人未被授權查看屬於另一位客戶的訂單,但此時這是一個複雜的過程。同樣在Struts 1.2.2中,我想我將不得不以編程方式創建一個新的ActionForward對象,然後在當前路徑末尾顯式附加「?OrderId = 89」。

任何幫助朋友?

回答

2

其實,我會把它放在會議中。然後,當您從ActionB中檢索它時,請立即刪除它。

Integer orderId = session.getAttribute("myapp.OrderId"); 
session.removeAttribute("myapp.OrderID"); 

這通常稱爲Flash範圍變量。 Struts中沒有官方的Flash範圍,但是這可以模擬它。

基本上,由於ActionA會在會話中設置這個變量,轉發給ActionB,並且ActionB會將它從會話中刪除並刪除它,所以擔心重新加載OrderId不在這裏。只有在ActionA完成之後但在ActionB運行之前他們停止了請求,這是非常不可能的,並且只要在他們查看ActionB後就會被移除,這可能不會那麼糟糕。

這也讓你在ActionB中檢查以確保OrderID在會話中,如果沒有,則轉發回ActionA。

相關問題