`

使用redirect避免重复提交 ,struts1.x struts2.x

 
阅读更多

 

 

 

避免重复提交这个问题在Web应用开发领域应该是一个老生常谈的问题了,主流的一些Web应用框架也提供了方便使用的功能来实现这个需求,比如Struts的Token。但是有些时候,可能用户确实需要刷新提交之后所转到的页面,比如假设如下的需求:用户注册了一个账号,但是这个账号需要管理员批准才可以进行工作,于是,用户在注册页面填写了详细信息之后,提交,转到详细信息页面,然后刷新这个页面来查看自己的状态。此时,我觉得使用redirect是非常方便的。

以下是redirect在Struts1和Struts2中的实现:

 

Struts1

在Struts1中,有一个org.apache.struts.action.ActionRedirect的类,这个类是ActionForward类的子类,是专门用来做redirect跳转的。使用起来非常的简单,只需在你的Action类的方法中,返回一个ActionRedirect类的实例即可。

----------------------------------------------------

ActionRedirect redirect = new ActionRedirect(mapping.findForward("detailAction")); // 这里是在struts-config.xml文件中定义的<forward>节点的name属性
        redirect.addParameter("id", user.getId()); //这里是要在url后面附加的参数名称及其值

return redirect;

----------------------------------------------------

 

Struts2:

在Struts2中,情况有所不同。但是Struts2里面的方式,更加的合理,因为不需要在Action代码中编码来完成,完全是通过配置完成的。在配置文件struts.xml中,

----------------------------------------------------

        <action name="userCreate" method="create" class="lab.action.UserAction">
            <result name="detailAction" type="redirect-action">
                <param name="actionName">userDetail</param>
                <param name="namespace">/</param>
                <param name="parse">true</param>
                <param name="user.id">${user.id}</param>
            </result>
        </action>
        <action name="userDetail" method="detail" class="lab.action.UserAction">
            <result name="detailPage">userDetail.jsp</result>
        </action>

----------------------------------------------------

 

这里,userCreate是创建用户的Action,userDetail是查看用户详细信息的Action,都是由类lab.action.UserAction来提供工作。如果从一个action redirect到另外一个action,那么redirect的result的type为redirect-action。

其中,参数actionName为要跳转到的action的name,无需.action后缀,struts框架会根据你配置的属性来确定后缀是什么。namespace为搜索action时使用的命名空间。parse是表示要对参数进行解析。后面的几个参数就是根据实际需要来定义参数名称和参数的值,这里会由struts框架将这些参数附加到URL后面。例如在上面的例子中,user.id为参数名,${user.id}为参数值,该值通过解析userCreate对应的类中的user属性的id属性来得到,和在jsp页面使用方式相同,其实都是来自于Value Stack。

 

如果是要redirect到一个jsp页面,并且带有参数(这种情况应该很少),按照struts2的文档描述:

----------------------------------------------------

<result name="success" type="redirect">
  <param name="location">foo.jsp</param>
  <param name="parse">false</param>
</result>
<package name="passingRequestParameters" extends="struts-default" namespace="/passingRequestParameters">
   <-- Pass parameters (reportType, width and height) -->
   <!--
   The redirect-action url generated will be :
   /genReport/generateReport.jsp?reportType=pie&width=100&height=100
   -->
   <action name="gatherReportInfo" class="...">
      <result name="showReportResult" type="redirect">
         <param name="location">generateReport.jsp</param>
         <param name="namespace">/genReport</param>
         <param name="reportType">pie</param>
         <param name="width">100</param>
         <param name="height">100</param>
      </result>
   </action>
</package>

----------------------------------------------------
另外,对于比如查询统计这样的功能,用户刷新页面的几率是非常大的,这种情况下,建议使用get方式来提交form,以避免IE那个总是跳出来的对话框。

相比于forward方式的跳转而言,redirect的跳转会在浏览器地址栏暴露更多的信息,可能会被使用者恶意篡改,所以在使用redirect的时候,要对数据在后台进行更加严格和全面的校验。

 

以下是实验代码的链接,在压缩包中,去掉了struts相关的lib包,如果要在本地运行这个实验应用,只需把对应struts版本的struts<version>-blanck-<version>.war里面的lib目录下的jar文件取出则可。

实验在Windows XP SP2, resin-3.2.1, Sun JDK 1.5, struts 1.2.9/struts 2.0.11.1下运行通过。如果是使用struts1,需要把应用编译成Java 1.4格式的(如果是使用Eclipse,只需修改应用的compile level即可)。

 

转载: http://www.blogjava.net/yoda/archive/2009/01/12/250931.html

分享到:
评论

相关推荐

    Struts1.x常用的开发包,需要学习struts1.x朋友可以下载

    10. **预定义的结果类型**:Struts1.x定义了一些预设的Action结果类型,如转发(forward)、重定向(redirect)、流(stream)等,方便开发者快速处理Action的返回结果。 11. **生命周期管理**:Struts1.x对...

    魔乐科技Struts2.x框架笔记

    **Struts2.x与Struts1.x对比**:相较于Struts1.x,Struts2.x具有更多的优势,如不再强制要求ActionForm,配置文件更简洁,处理流程更加清晰。具体而言,请求首先被过滤器捕获,然后根据`struts.xml`文件的配置调用...

    Struts 2.X权威指南(第3版) 第二章源码

    开发者需要了解如何定义Action类,如何使用注解或XML配置文件来配置它们,以及如何使用Execute-and-Redirect模式来防止重复提交。 接下来,Struts 2的配置文件是理解和使用框架的重要部分。可能包括了struts.xml或...

    struts2.x所有包及配置文件

    这个压缩包"struts2.x所有包及配置文件"包含了Struts2框架的核心组件、扩展和配置文件,用于构建和管理Java web应用。 1. **核心组件**: - `struts2-core.jar`:这是Struts2框架的基础,包含了Action、Result、...

    struts1.x示例小程序

    Struts1.x是一款经典的MVC(Model-View-Controller)框架,由Apache软件基金会开发,广泛应用于Java Web应用程序的开发。这个"struts1.x示例小程序"是为初学者和开发者提供的一种学习资源,旨在帮助理解并掌握Struts...

    Struts1.x.pdf

    DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd"&gt; &lt;struts-config&gt; 的类全名"/&gt; ...

    struts1.x_Tags

    - `&lt;redirect&gt;`: 实现URL重定向,通常用于跳转到外部资源或者防止表单重复提交。 - `&lt;include&gt;`: 用于在页面中嵌入其他页面或资源,提供动态包含的功能。 2. **HTML标签库(HTML Tags)**: - `&lt;html:form&gt;`: 创建...

    百度文库 struts2.x深入浅出 全部代码1

    在“百度文库 struts2.x深入浅出 全部代码1”中,我们可以找到牛牧老师整理的一系列关于Struts2.x的实践代码和学习资源。这个压缩包包含了以下几个关键部分: 1. **struts2_OtherTag**: 这个部分可能涵盖了Struts2...

    快乐编程-知识分享-Struts1.x学习-1.2入门-001

    总的来说,学习Struts1.x需要掌握MVC模式,理解其核心组件如Action、Form Bean和配置文件的使用,熟悉视图层的实现以及相关的开发工具和库。通过实践和项目经验,可以逐步深入理解这个框架,并提升Java Web开发技能...

    Struts1.x系列教程文档【技术文档】

    Struts1.x是一款经典的Java Web框架,由Apache软件基金会开发,用于构建基于MVC(Model-View-Controller)设计模式的Web应用程序。本教程旨在帮助初学者和开发者深入理解Struts1的核心概念、架构和使用方法。以下是...

    Struts 2.X权威指南 第20章

    Struts 2.X是Java企业级开发中广泛使用的MVC框架,它提供了强大的控制层解决方案,使得开发者可以更高效地构建可维护、可扩展的Web应用程序。本章聚焦于Struts 2的高级特性和实践,以下是根据标题“Struts 2.X权威...

    struts2.pdf

    2. **路由决策**:核心控制器`FilterDispatcher`根据URL中的Action名和配置文件(struts.xml)中的定义来确定应调用哪个Action。 3. **执行拦截器链**:在调用具体的Action之前,会首先经过一系列的拦截器。这些拦截...

    Struts2防止重复提交解决方案

    1. **配置拦截器**:在你的Struts2配置文件(通常是`struts.xml`或`struts-default.xml`)中,添加`token`拦截器到拦截器栈中。例如: ```xml &lt;param name="includeMethods"&gt;input,back,cancel,browse ...

    j2ee学习struts2.x总结1

    这个"j2ee学习struts2.x总结1"的主题着重于初学者如何理解和掌握Struts2的基础知识,以及如何进行环境搭建。下面将详细讨论相关知识点。 1. **Struts2简介**: Struts2是Apache软件基金会的一个项目,它是Struts1...

    Struts2文件上传下载和表单重复提交问题

    - **页面跳转(Redirect After Post)**:处理完请求后,使用`redirect`或`redirectAction`结果,将用户重定向到新的URL,避免回退按钮导致的重复提交。 4. **Struts2配置** 对于以上功能的实现,Struts2的配置...

    Struts2解决表单重复提交

    除了直接使用redirect,还可以使用redirectAction,并在result中配置actionName参数,这样提交后会通过另一个action来执行,从而避免了直接刷新带来的重复提交问题。 在具体实现上,通过修改result元素的type属性来...

    struts1初级教程

    ### Struts1初级教程知识点详解 #### 一、Struts1.x基础知识介绍 ...此外,读者还可以参考《Struts2系列教程》来了解Struts1.x与Struts2.x之间的差异,从而更好地理解两者的设计理念和技术特点。

    struts2.jar

    2. **配置文件**:Struts2使用XML配置文件(通常命名为struts.xml)来定义Action的映射、结果类型和其他设置。这个文件是Spring容器的一部分,允许进行依赖注入。 3. **拦截器(Interceptors)**:拦截器是Struts2...

Global site tag (gtag.js) - Google Analytics