使用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的值,否则拦截器不起作用。