佛山电信要求对寻宝的首页全新改版,当中出现了一个看上去不大,但有点头痛的问题。
从寻宝的首页里登录,如果验证码错误或者用户名密码错误,出现了原来互动平台的登录页面,非常不好看,这个问题必须着手改进。
从用户的角度来看这个流程,如果登录的时候不小心输错了验证码或用户名密码,最好是返回原来的页面,并提示出错信息;或者返回到一个专门的出错提示页面,让用户重新输入用户名和密码来登录。
这两种选择的用户体验应该都差不多,但比较喜欢第一种选择,而且觉得没什么难度。以用户输入了错误的验证码举例,当用户输入了错误的验证码并提交后,验证码检验器检验到了错误的验证码,并添加了一个FieldError到Action里。我们配置了一个名为WorkflowIntercepter的拦截器,这个拦截器捕捉到了FieldError后,自动将Action停止执行,并返回一个名为input的Result。
一开始想得很轻松,因为webwork有一个ChainingIntercepter和ChainResult的组合,可以ActionContext里的属性从前一个Action复制到另一个Action,理想情况下,FiledError亦会同进复制到了后面的那个Action里,然后在后面的Action里将提示信息alter出来,这样就轻松实现了流程的控制了。
着手试了一下,非常遗憾的是这方法是行不通的,出错信息并没有显示出来。看了一下webwork的源代码,原来ChainResult只是复制了ActionContext里的值栈和各种http请求的参数,并没有复制Action里的各种错误信息。
看来这里是关键了,首先试过创建了一个继承ChainResult的Result,在Action执行完后复制错误信息,从Log来看实际结果跟想法是一样,但从页面里却读不到错误信息的值,估计Action执行后再读取这个方法行不通。
继承的方法行不通,唯有将ChainResult的代码复制出来,然后修改一下它的代码,在执行另一个Action前复制错误信息。从以下的Log里可以看出执行流程。
12:21:57,203 INFO ActionChainWrapResult:139 - 原action:promotLoginFs
12:21:57,203 INFO ActionChainWrapResult:140 - 原action错误信息:用户不存在或密码有误!
12:21:57,218 INFO ActionChainWrapResult:151 - 后action:index
12:21:57,234 INFO ActionChainWrapResult:152 - 后action错误信息设值前:
12:21:57,234 INFO ActionChainWrapResult:156 - 后action错误信息设值后:用户不存在或密码有误!
最后,实现一个Intercepter,将ChainingIntercepter和WorkflowIntercepter组合起来,在触发Action错误时返回input的Result,否则继续执行Chain链。
从寻宝的首页里登录,如果验证码错误或者用户名密码错误,出现了原来互动平台的登录页面,非常不好看,这个问题必须着手改进。
从用户的角度来看这个流程,如果登录的时候不小心输错了验证码或用户名密码,最好是返回原来的页面,并提示出错信息;或者返回到一个专门的出错提示页面,让用户重新输入用户名和密码来登录。
这两种选择的用户体验应该都差不多,但比较喜欢第一种选择,而且觉得没什么难度。以用户输入了错误的验证码举例,当用户输入了错误的验证码并提交后,验证码检验器检验到了错误的验证码,并添加了一个FieldError到Action里。我们配置了一个名为WorkflowIntercepter的拦截器,这个拦截器捕捉到了FieldError后,自动将Action停止执行,并返回一个名为input的Result。
一开始想得很轻松,因为webwork有一个ChainingIntercepter和ChainResult的组合,可以ActionContext里的属性从前一个Action复制到另一个Action,理想情况下,FiledError亦会同进复制到了后面的那个Action里,然后在后面的Action里将提示信息alter出来,这样就轻松实现了流程的控制了。
着手试了一下,非常遗憾的是这方法是行不通的,出错信息并没有显示出来。看了一下webwork的源代码,原来ChainResult只是复制了ActionContext里的值栈和各种http请求的参数,并没有复制Action里的各种错误信息。
看来这里是关键了,首先试过创建了一个继承ChainResult的Result,在Action执行完后复制错误信息,从Log来看实际结果跟想法是一样,但从页面里却读不到错误信息的值,估计Action执行后再读取这个方法行不通。
继承的方法行不通,唯有将ChainResult的代码复制出来,然后修改一下它的代码,在执行另一个Action前复制错误信息。从以下的Log里可以看出执行流程。
12:21:57,203 INFO ActionChainWrapResult:139 - 原action:promotLoginFs
12:21:57,203 INFO ActionChainWrapResult:140 - 原action错误信息:用户不存在或密码有误!
12:21:57,218 INFO ActionChainWrapResult:151 - 后action:index
12:21:57,234 INFO ActionChainWrapResult:152 - 后action错误信息设值前:
12:21:57,234 INFO ActionChainWrapResult:156 - 后action错误信息设值后:用户不存在或密码有误!
最后,实现一个Intercepter,将ChainingIntercepter和WorkflowIntercepter组合起来,在触发Action错误时返回input的Result,否则继续执行Chain链。