原文:http://www.po-soft.com/blog/yongtree/937.html
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代码
-
public
interface
FlashScope
extends
Map, Serializable {
-
-
-
-
-
void
next();
-
-
-
-
-
-
-
Map getNow();
-
}
第二开始编写该接口
Struts2
的实现:
StrutsFlashScope.java
这个实现很好理解,无非内部定义了两个
Map
,将保存在里面的数据,在两个
Map
里来回的转移,这样就保证在下一次重定向请求时,我们只需要将其中一个
Map
的数据转移到另外一个
Map
中,而清楚掉一个
Map
。这样就保证在重定向时,该作用域下依然保存数据。而在第二次的请求时,如果没有新的数据加进来,原来的数据将会被清空。通过这种方式,
Flash
的作用域的数据只能保持在下一次的重定向请求中。
第三步也是很关键的一步,如果我们不去清理该作用域下的数据,那么这个作用域就无法达到应有的效果。这就需要我们在每次重定向的时候要执行作用域的
next()
方法,来清理数据。
我们编写的是
Struts2
的实现,我们就需要在
Struts2
的过滤器中植入对
Flash Scope
处理的操作。看
OecpStruts2FilterDispatcher.java
Java代码
-
public
class
OecpStruts2FilterDispatcher
extends
StrutsPrepareAndExecuteFilter {
-
@Override
-
public
void
doFilter(ServletRequest req, ServletResponse res,
-
FilterChain chain)
throws
IOException, ServletException {
-
HttpServletRequest request = (HttpServletRequest) req;
-
HttpServletResponse response = (HttpServletResponse) res;
-
try
{
-
prepare.setEncodingAndLocale(request, response);
-
prepare.createActionContext(request, response);
-
prepare.assignDispatcherToThread();
-
if
(excludedPatterns !=
null
-
&& prepare.isUrlExcluded(request, excludedPatterns)) {
-
chain.doFilter(request, response);
-
}
else
{
-
request = prepare.wrapRequest(request);
-
ActionMapping mapping = prepare.findActionMapping(request,
-
response,
true
);
-
if
(mapping ==
null
) {
-
boolean
handled = execute.executeStaticResourceRequest(
-
request, response);
-
if
(!handled) {
-
chain.doFilter(request, response);
-
}
-
}
else
{
-
-
-
-
FlashScope fs = (FlashScope) ActionContext.getContext()
-
.getSession().get(StrutsFlashScope.FLASH_SCOPE);
-
if
(fs !=
null
) {
-
fs.next();
-
}
-
execute.executeAction(request, response, mapping);
-
margin: 0px; padding: 0
分享到:
相关推荐
Grails Grails Grails Grails Grails
grails-2
Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南Grails权威指南
grails-3.0.5-ga (2/2), for somebody who can not download
详细介绍grails框架的奥秘,英文版你值得拥有
[Apress] Grails 2 权威指南 (英文版) [Apress] The Definitive Guide to Grails 2 (E-Book) ☆ 出版信息:☆ [作者信息] Jeff Scott Brown, Graeme Rocher [出版机构] Apress [出版日期] 2013年01月23日 ...
在学习任何东西之前,最... 2,将%GRAILS_HOME%\bin添加到环境变量path中,过程与“将GROOVY_HOME目录下的bin追加到环境变量path中”相似 (如果只想进行Grails开发,可以不设GROOVY_HOME) 二,创建Grails Demo程序
Grails项目的应用越来越多,而对于初学者来说,在Eclipse下搭建Grails项目是一个难题,这个文档将教会你如何搭建Grails项目,希望对你有所帮助。
Grails入门指南中文pdf -- 针对grails1.0.4更新,附加idea8 开发grails的流程
Grails1.1中文文档
grails+Xfire webservice
grails 用户登录的例子,必须登录后才可以查看信息,并且只有admin用户才可以创建用户,此例子,只要将grails 的环境配好,就可以用了,用的是自带的数据库,如果需要mysql 可以更改。
将Grails与JQuery集成起来
grails-2.1.zip.001
详细讲解grails开发环境配置。 详细讲解grails连接mysql数据库,crud开发
Grails 中文 参考手册
Grails专为下一代JavaWeb应用程序而设计的框架,其借助于Groovy动态语言,使Web开发变得简单而方便。Grails尽量为更多现有的Java项目创建一个全面的框架(不仅局限于视图处理),这和当前一些Java框架提供给用户的一...
grails3.2.8 part1