2011-09-07 47 views
3

我是Struts2的新手,來自PHP背景,我經常有相同的文件處理GET和POST請求,如果請求是POST,處理表單請求。在struts2中通過GET或POST控制操作方法

我目前擁有的在struts.xml中以下內容:

<action name="ProcessData" class="ProcessDataAction"> 
    <result name="*">processdata.jsp</result> 
</action> 
<action name="ProcessDataUpload" class="ProcessDataAction" method="upload"> 
    <result name="*">processsdata.jsp</result> 
</action> 

,工作正常,但困擾我的是,處理文章的網址是不同的,因爲現在如果用戶重新加載頁面時,他們得到的錯誤而不是簡單地看到GET頁面的內容。

所以我的問題是,有什麼辦法告訴struts2調用一個方法,如果它是一個GET請求,另一種方法,如果它是一個POST請求?

+1

您必須在您的Action類中使用req.getMethod()來區分GET和POST並相應地放置您的邏輯。 – Reddy

+2

@Reddy:將這樣的邏輯放在動作類中不會擴展,因爲您需要然後在所有您想要的行爲中複製邏輯。這對於攔截器或者動作映射器來說更是一份工作。 –

+0

當一個頁面發送數據到一個行動爲什麼要關心,如果它來自後或獲得?你當然可以把許多動作放在一個文件中,但爲什麼要一個文件,或者一個用於GET,另一個用於POST是令人困惑的。 – Quaternion

回答

5

Struts2不提供您開箱即用的內容。如果您想要強制某個特定的操作方法只能通過某些HTTP方法調用,那麼您需要創建一個自定義攔截器並可能需要一些自定義註釋。

如果你只是想同樣的動作來處理顯示形式和處理它,那麼你就可以做到以下幾點:

public class MyAction { 
    public String execute() { 
    return INPUT; 
    } 

    public void validate() { 
    // perform any form validation needed 
    } 

    public String submit() { 
    // process the form and then redirect 
    } 
} 

在你的表格,你會提交過程數據提交! !!將操作與操作方法名稱分開。它提供了您已有的內容,但不需要在struts.xml中顯式映射每個方法。

但它困擾我,處理POST的URL是不同的,因爲現在如果用戶重新加載頁面,他們會得到一個錯誤,而不是簡單地看到GET頁面的內容。

成功發佈後重定向用戶完全無效此點。看看「發佈後重定向」或「發佈/重定向/獲取」模式)。

1

不是默認情況下,沒有。 IMO最乾淨的解決方案是通過查看請求類型的攔截器來調整方法名稱。例如,我有一個簡單的查找executeGet和executePost方法的例子。

不管它是不是一個好主意......不同的問題。

+0

您能否詳細說明該實現?爲什麼你認爲這不是一個好主意? – dimo414

+1

IIRC沒有太多需要說明的地方。 ActionInvocation有一個ActionProxy,ActionProxy有一個methodName屬性。我想我只是根據請求類型改變了它(我可能是100%錯誤記憶)......我不得不挖。我不是說這是一個好的或壞的想法,我只是不相信這很重要。 –

相關問題