后台表单验证的设计问题

现在后台验证方式是

@Before(XXXValidator.class)

一个请求对应一个Validator子类,感觉有些冗余。

如果能把粒度在细一些,到函数级别,是否能更灵活一些?

@Before(XXXValidator::validateYYY)

场景:一个页面如果有多个请求都需要验证的情况下,方便把代码放到一个验证类中。

对jfinal还不是很熟,开发过程中的一点想法,仅供参考。

评论区

JFinal

2018-04-03 14:40

用同一个 Validator ,然后里头用 actionKey 做分流就可以了,可以重用

JFinal

2018-04-03 14:43

Validator 主要用于 form 表单提交,尤其是提交的数据比较多的情况

一般情况在 controller 中直接 if 判断就完事了,不需要写 validator

此外,还有一种用法是表单提交全用 ajax,所有验证在 Service 层来做,你手头的 club 代码里头 LoginService、RegService 就是这么用的

注意这个 LoginService、RegService 同时也用了 Validator,是当时开发的时候先用了 Validator,其实只要在业务层中做一次就可以了

伯洋

2018-04-03 15:00

@JFinal
谢谢,我试试用actionKey的方法

伯洋

2018-04-03 15:07

在 controller 中直接 if判断,项目稍微多一些的时候,action的代码量就长了,感觉代码不太美观

JFinal

2018-04-03 15:14

@伯洋 还有一个方向是自定义注解,然后在拦截器中通过 inv.getMethod().getAnnotation(...) 拿到注解,自由定义 Validator

可以多尝试一下,jfinal 当然也曾经考虑过很多其它方案,只是做出来以后不是极简,或者学习成本太高,所以都废弃了

例如,jfinal 曾有一个设置,是这么来用的:
@Validator("userName", require=true, errorMsg="用户名不能为空")

但这都不如在现在的设计之下,通过 API 引导式来得方便,现在的设计,可以用
this.
这样就自动提示有哪些 validateXxx 系列的方法,就像点菜一样,不仅降低了学民成本,而且 API 引导式可以避免输入性错误

JFinal

2018-04-03 15:17

@伯洋 用 actionKey,可以拆分去弄,代码美观取决于写法:
if (actionKey.equals("/user/login"))
loginValidate();
else if (actionKey.equals("/user/login"))
....
然后将 loginValidate() 这些独立去实现

伯洋

2018-04-03 15:25

@JFinal
我试试在验证和错误处理中分别根据actionKey分流
protected void validate(Controller c) {
if (actionKey.equals()){
}
}
protected void handleError(Controller c) {
if (actionKey.equals()){
}
}

热门反馈

扫码入社