Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1188314
  • 博文数量: 89
  • 博客积分: 10546
  • 博客等级: 上将
  • 技术积分: 1510
  • 用 户 组: 普通用户
  • 注册时间: 2004-10-16 01:24
文章分类

全部博文(89)

文章存档

2012年(7)

2011年(4)

2010年(5)

2009年(52)

2008年(21)

分类: Java

2009-03-22 00:36:38

想像一下,在一些电子购物网站中,如果在最后支付时,如果因为网络等因素,可能需要一段等待时间。如果你是个急性子,多点击了两下提交按扭。结果可能就是你为同一单物品,支付了两次,或者网站的处理是送给两份相同的物品。

这是你不愿意看到的,所幸的是,一些浏览器作了优化处理。比如 Firefox,在提交表单数据的过程中多次提交会视为同一次提交。但是,你仍然回避不了另外一个问题。提交完成之后,点击了浏览器刷新按扭,又会重新提交表单。

Struts 1 提供了一种简单的方法,来解决这个问题。在表单初始化时,设置一个隐藏的token值,提交时会比较token值。Stripes 没有提供这一方法。

使用 RedirectResolution

使用 RedirectResolution 替代 ForwardResolution, 是最简单的方法。

RegisterActionBean 中的 register方法修改成如下。

public Resolution register() {
return new RedirectResolution("/success.jsp");
}

重新运行程序,你会发现表单提交之后。浏览器地址栏中地址变成 ,而不是之前的 。你可能已经发现,另外还有一个问题就是,结果页面无法显示注册信息。

很 多其它 web 框架提供了一个 Flash Scope来解决这个问题。Flash类似 Session,Request,它的生命周期比普通 Request 长,比 Session 短。Flash 通常也是基于 Session来实现,它跨越当前请求和下一个请求,保证了下一请求中还能读取当前请求中的属性,在下一请求结束后, Flash 就过期。Stripes 提供一个类似的实现,但是 Stripes 的实现的依赖 Session 过期。

你可以把 ActionBean 放入 Flash scope中。

public Resolution register() {
return new RedirectResolution("/success.jsp").flash(this);
}

重新运行程序,进行测试。

FlashScope

Stripes 提供了一个 FlashScope 类,处理 Flash 状态。

你可以将用下面的方法将 ActionBean 添加到 Flash Scope 中。

FlashScope.getCurrent(getContext().getRequest(), true).put(this);			

将其它对象放入 Flash Scope 也很简单。

public Resolution register() {
addMessage("Registered successfully!");
addMessage("Congratulations!");
return new RedirectResolution("/success.jsp").flash(this);
}

public void addMessage(String message) {
FlashScope scope = FlashScope.getCurrent(getContext().getRequest(), true);
List messages = (List) scope.get("messages");
if (messages == null) {
messages = new ArrayList();
scope.put("messages", messages);
}
messages.add(message);
}

JSP 页面显示信息。

<%@taglib prefix="c" uri="" %>
...

${msg}


...

重新运行这个程序,体验一下。

阅读(2063) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~