解决刷新页面造成的Form重复提交触发监听方法
Form和DirectLink组件都是使用DirectServcie,刷新页面时的重复提交,是由于DirectService生成的URL造成了。例如DirectLink的URL:
为了解决重复提交问题,当时的做法就是将DirectServcie所生成的URL修改为ExternalService的URL,如果DirectServcie的URL中没有传递参数,那么可以转换为PageService。
为了方便调用,我通常将"转URL"方法写在engine中:
package com.tapestry4.test;
import java.util.HashMap;
import java.util.Map;
import org.apache.tapestry.Tapestry;
import org.apache.tapestry.engine.BaseEngine;
import org.apache.tapestry.engine.IEngineService;
import org.apache.tapestry.services.ServiceConstants;
public class MyEngine extends BaseEngine {
/**
* 根据传递进来的页面名称,返回一个PageLink方式的url,配合RedirectException即可完成PageLink跳转。
*
* @param pageName
* 页面名称
* @return
*/
@SuppressWarnings( { "deprecation", "unchecked" })
public String getPageLinkUrl(String pageName) {
IEngineService service = this.getService(Tapestry.PAGE_SERVICE);
Map parameters = new HashMap();
parameters.put(ServiceConstants.PAGE, pageName);
return this.getInfrastructure().getLinkFactory().constructLink(service,
false, parameters, true).getURL();
}
/**
* 根据传递进来的页面名称,返回一个ExternalLink方式的url,配合RedirectException即可完成ExternalLink跳转并传递参数。
*
* @param pageName
* 页面名称
* @param param
* 需要传递的参数
* @return
*/
@SuppressWarnings( { "deprecation", "unchecked" })
public String getExternalLinkUrl(String pageName, Object[] param) {
if (param == null) {
return this.getPageLinkUrl(pageName);
}
IEngineService service = this.getService(Tapestry.EXTERNAL_SERVICE);
Map parameters = new HashMap();
parameters.put(ServiceConstants.PAGE, pageName);
parameters.put(ServiceConstants.PARAMETER, param);
return this.getInfrastructure().getLinkFactory().constructLink(service,
false, parameters, true).getURL();
}
}
当我们需要"转URL"时,可以在监听方法中:
// Form登陆表单的监听方法
public String loginSubmit(IRequestCycle cycle) {
MyVisit visit = this.getMyVisit();
visit.setUserName(this.getUsername());
throw new RedirectException(((MyEngine) this.getEngine()).getPageLinkUrl("FirstPage"));
// return "FirstPage";
}
// DirectLink的监听方法
public IPage testDirectLink() {
throw new RedirectException(((MyEngine) this.getEngine()).getExternalLinkUrl("FirstPage", new Object[] { "testDirect" }));
// FirstPage page = this.getFirstPage();
// page.setTestString("testDirect");
// return page;
}
当然,你并不一定要在Engine类中添加我这里的两个"转换URL"方法,你可以在任何页面注入
<inject property="linkFactory" object="infrastructure:linkFactory"/>
获取到LinkFactory的实例即可。
PS:启动自定义engine类的方法,在application文件中:
<application name="MyTapestry" engine-class="com.tapestry4.test.MyEngine">
come from:http://confluence.redsaga.com/pages/viewpage.action?pageId=681