2012-11-08 184 views
2

我正在爲我的應用程序使用帶有磁貼的Struts 2。在struts2中避免動作執行兩次

在應用程序中我使用的是動作類說「A」用不同的動作的方法,如添加,*編輯*,保存,* savesuccess *等。

在頁面中,當我點擊一個複選框時,我使用window.open方法通過調用執行某些數據庫操作並返回的操作類A的操作方法「edit()」來打開彈出窗口結果彈出窗口。
在執行一些修改後,我將表單提交給操作類A中名爲「save()」的操作方法,並將結果頁返回到相同的彈出窗口。
問題是當我關閉彈出窗口時,操作再次執行並在控制檯和異常中顯示空值。
我認爲這可能是由於瀏覽器,所以我嘗試event.returnValue = false在彈出窗口中的點擊事件,但仍然面臨着問題。
我在struts2中瞭解了令牌攔截器。但是當我在頁面中使用標籤時,它顯示404錯誤。
我將感謝那些誰提供與在瓷磚Struts2的使用令牌攔截一些例子..
struts.xml的

<action name="*Com" method="{1}" class="com.act.A"> 
    <result name="add" type="tiles">add</result> 
    <result name="edit" type="tiles">edit</result> 
    <result name="save" type="tiles">save</result> 
    <result name="savesuccess" type="tiles">savesuccess</result>  

父頁彈出窗口開放代碼:

editwindow=window.open("editCom?id="+id+"&name="+name+"..and son on","edit","width=605px,height=270px,channelmode=no,left=250px,location=no,menubar=no,status=no,titlebar=no,toolbar=no,top=250px,scrollbars=yes,resizable=no"); 

Popwindow編輯窗口提交代碼

<form name="editpage" action="saveCom" method="post"> 
    .......... 

點擊提交按鈕打開它在同一popwindow了新的一頁這樣

<html> 
<script type="text/javascript"> 
function check1(){ 
window.opener.location="savesuccessCom"; 
} 
</script> 

<body onunload="check1"> 
<form name="editsave" method="post" action="" > 
..... 
<p>Changes Saved Successfully</p> 
<input type="button" name="Saved" id="Save" value="Save" onclick="self.close();event.returnValue=false;"/> 
</form> 
</body> 
</html> 

請幫我解決這個問題之後。

+1

請張貼你正在使用的一些jsp代碼,並得到問題。 – sunleo

+2

問題出在結果頁面和struts2之間,瓷磚只是構建結果的另一種方式,所以不應該扮演重要角色。你用ajax發送一個彈出顯示的請求是否正確?當你關閉對話時,會發送第二個請求?如果是這種情況,這是一個JS錯誤,與struts無關。令牌攔截器是一個可能的解決方案,但修復一個簡單的JS錯誤似乎更明顯,如果是這樣的話。 – Quaternion

+0

@Quaternion,謝謝你的建議。對不起,我沒有使用Ajax發送請求。我只使用JavaScript。第二個請求是不發送給彈出的開放函數,它調用表單提交函數(在這個例子中,它再次調用「saveCom」動作,而不是「editCom」動作。如果可能的話,你可以指出javascript錯誤。 –

回答

3

在第二頁中,您給出的操作是action =「」。

我認爲該頁面因該操作=「」而刷新。

我相信你沒有從這個頁面傳遞任何值到下一頁,因爲你正在用self.close()關閉頁面。

因此,刪除該表單標籤並再次嘗試。這將解決問題:-)