使用struts 注解解决重复提交有关问题

使用struts 注解解决重复提交问题

    如何解决表单的重复提交问题?目前使用表单提交的方式大致分为两种,一种是原生的表单提交方式,另外一种是ajax提交表单。前一种提交表单后,这次请求地址会记录到浏览器的历史记录中,如果点击浏览器的刷新按钮会出现数据的重复的提交问题。而后者使用ajax提交是不记录到历史记录中的,不过在开发过程中由没有对提交后的页面或者按钮做处理(主要是屏蔽用户再次点击),用户再次点击会出数据重复提交问题。这时可能你会说,我们可以使用数据库的唯一约束呀,如果用hibernate可以在字段属性上添加unique属性(此属性依赖于数据库的唯一约束)。这可能是一种解决方案,他需要依赖于数据库,如果按照常规的分层方式这个操作一直到了持久层才发现,能不能吧层次往外提升一下呢?那就是我们今天要讲到的struts2 的注解token的配置实现。

         我们这里要讲的是token的配置,如果您还没有了解如何注解配置struts2 和拦截器的配置,最好先看一下。

         首先是token的拦截器栈配置,为了提交性能我们希望对某些方法配置token,当然了你也可以配置个全局的拦截器栈,你得为所有的请求添加token令牌。

         struts.xml中配置tokenSessionStack如下:

<interceptors>
<interceptor-stack name="tokenSessionStack">  
<interceptor-ref name="tokenSession"/>
<interceptor-ref name="defaultStack"/> 
</interceptor-stack> 
</interceptors>
 
<global-results>
         <result name=”invalid.token”>xxxx.jsp</result><!—配置重复提交的错误页面-->
</global-results>

 

 

    配置解说<interceptor-stack name="tokenSessionStack">  这一行中的tokenSessionStack是来自于struts2中的struts-default.xml中的,我们也可以自己在上面定义一行,使用struts默认的token连接器或者自己实现Interceptor接口的拦截器,defaultStack也是来自于struts-default.xml中的一般情况这个要配置你自己业务相关的连接器。

 

    接下来就是如何在action层添加注解?

    在action层添加注解有两种方式一种添加在类上,另一种就更明确一些直接添加到方法级别。

添加在类上使用的是@InterceptorRef或者@InterceptorRefs,在方法上面使用@Action@Action中配置interceptorRefs参数,具体配置看下面:

  第一中方式

@InterceptorRe(“tokenSessionStack”)
public class UserAction extends ActionSupport {

 

  或者

@InterceptorRefs{@InterceptorRe(“tokenSessionStack”)}
public class UserAction extends ActionSupport {

 

   这种方式配置的拦截器会拦截这个action中的所有的方法。

   第二中方式在方法中配置:

public class UserAction extends ActionSupport {
    @Action(value=”save”, interceptorRefs={@InterceptorRe(“tokenSessionStack”)})
    public String save(){

 

   这种配置的方法需要注意的是,如果在类上配置了 @Namespace或者 @Namespaces的在前台提交的表单的url@Action参数value不同的要改成value的值,否则拦截器不起作用。