3
回答
jfinal 防止表单重复提交,返回原页面问题..
终于搞明白,存储TCO原来是这样算的>>>   

大体上需求是这样的

    想要实现统一的防止表单重复提交

    

config里面是这样的:add("/demo", DemoController.class,"/");
在controller里面写了这个
createToken("token", 30*60);

在页面上面写了
<input name="token" id="loginToken" value="${token}" type="hidden">

然后写了个validtor
public class TokenValidator extends Validator{

	@Override
	protected void validate(Controller c) {
		validateToken("token", "tokenMsg", "请不要重复提交");
	}

	@Override
	protected void handleError(Controller c) {
		return;
	}
}



这时候问题来了

jsp所在路径:webRoot/demo.jsp

我设置了me.setBaseViewPath("/WEB-INF/view");

demo.jsp里面表单请求的action是,localhost/demo/method

这时候,如果检测到是重复提交(检测结果是正确的)

按道理应该是回到原页面(/demo.jsp)

但是现在跳转的页面却是

/WEB-INF/view/demo.jsp

上面的防止表单重复提交方法已经正常使用了,只是判断为重复提交返回原页面的时候,出现问题

因为写的是公共的防止表单重复提交,所以hanlderror里面不能写死返回页面

求解决办法,或者更合适的防止表单重复提交方法..

虽然移动文件到baseViewPath就能解决,但还是想问问有没有更灵活的解决办法

举报
厌恶自己
发帖于2年前 3回/1K+阅
共有3个答案 最后回答: 2年前

    由于 baseViewPath 是有用的,所以在 render 时会去这个目录的子目录找模板文件。几个简单办法:

1:在提交表单的url中问号挂参: /xxx/yyy?goto=zzz.html,然后在Validator.handleError中这样:render(getPara("goto"));

2:与方法1类似,再用一个隐藏域来传递要跳去的页面。

3:在 handleError 方法中使用RenderFactory.me().getDefaultRender(action.getViewPath() + action.getMethodName()); 得到一个 render,然后 controller.render(得到的render对象)即可,注意这里传递的action.getViewPath() 值需要处理一下,去除 baseViewPath这部分

    最后,既然使用了 baseViewPath,为何还在在项目根下面存放模板文件,建议模板文件有一个共同的根,例如你设置的 baseViewPath 就是模板根目录。

--- 共有 1 条评论 ---
厌恶自己还是老大讲的精辟,我之前一直认为'baseViewPath'不够灵活,现在想想,是我没转过弯来..感谢老大指点迷津 2年前 回复
顶部