2011-09-07 49 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%错误记忆)......我不得不挖。我不是说这是一个好的或坏的想法,我只是不相信这很重要。 –

相关问题