将Grails的Flash Scope移植到Struts2
发布时间:2020-12-15 18:18:01 所属栏目:百科 来源:网络整理
导读:Web应用程序中一个常见的用法是,先对请求进行处理然后将请求重定向到另外一个控制器、servlet或其他对象。这种做法本身没什么问题,但是当请求被重定向时它会创建一个崭新的request,并将原本保存在request属性中的数据全都清除掉,因此重定向的目标操作就
Web应用程序中一个常见的用法是,先对请求进行处理然后将请求重定向到另外一个控制器、servlet或其他对象。这种做法本身没什么问题,但是当请求被重定向时它会创建一个崭新的request,并将原本保存在request属性中的数据全都清除掉,因此重定向的目标操作就无法再获得这些数据。当我们使用struts2的actionmessage的时候,遇到重定向,这些消息全都over了。
有些开发者为了避免上述情况的发生而将这些信息保存在session中。这种做法很好,但开发人员会经常忘记清除临时数据,并且需要开发人员自行维护session的状态。无疑增加了程序的开发的复杂性和无畏的性能浪费。
为了解决这个问题,Grails模仿Rails引入了Flash Scope。flash对象只将数据保存在下一次的请求中,在下一次请求之后会自动清除其中的数据。这样不仅减小了开发人员的负担,也使我们能够专注于当前的问题而不用担心其他问题。
Flash作用域的确可以很好的解决这个问题,可惜我们常用的SSH框架中,却一直缺少这样一个作用域,不知道Struts2的开发者能不能在以后的版本中增加这样的一个功能。等不了他了,还是我们自己手工创造这样一个对象来解决现有的问题吧。
最简单的办法,就是将Grails的实现移植到Struts2中。
首先我们下载Grails的源代码包,并找到Flash对象,将其实现按步照班的移植到struts2中。主要修改主要包括两个部分。第一是将Grails的request上下文改成struts2的;第二删掉我们不适用的Grails对错误信息的处理。
下面就开始简单的介绍修改后的程序,主要有三个类。
第一我们定义一个Flash对象的接口:FlashScope.java
Java代码
第二开始编写该接口Struts2的实现:StrutsFlashScope.java
Java代码
这个实现很好理解,无非内部定义了两个Map,将保存在里面的数据,在两个Map里来回的转移,这样就保证在下一次重定向请求时,我们只需要将其中一个Map的数据转移到另外一个Map中,而清楚掉一个Map。这样就保证在重定向时,该作用域下依然保存数据。而在第二次的请求时,如果没有新的数据加进来,原来的数据将会被清空。通过这种方式,Flash的作用域的数据只能保持在下一次的重定向请求中。
第三步也是很关键的一步,如果我们不去清理该作用域下的数据,那么这个作用域就无法达到应有的效果。这就需要我们在每次重定向的时候要执行作用域的next()方法,来清理数据。
我们编写的是Struts2的实现,我们就需要在Struts2的过滤器中植入对Flash Scope处理的操作。看OecpStruts2FilterDispatcher.java
Java代码
该类继承了Struts2原有的过滤器,在web.xml中,将Struts2的配置换成该过滤器。在该过滤器中,我们对每次新的请求都调用了FlashScope的next()方法,对数据进行清理。
如果我们为了使用方便,我们可以设计一个Action的顶级类,比如BaseAction.java,在该类中,我们定义flash的属性。
Java代码
我们在action就可以flash.put(“message”,”我是struts2的flash作用域”);在页面上我们只需要通过<s:property value=”%{flash.message}”/>来显示。这样,我们删除一篇文章后重定向到文章列表,我们就可以把“删除成功”这样的信息,显示在重定向的文章列表上。而再次刷新文章列表,该消息就消失了。 附件下载请移到:http://www.oecp.cn/hi/yongtree/blog/937 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |