登录验证struts2

类需要继承ActionSupport,重写execute方法,
详细:在Struts2应用中,我们发现,如果通过验证框架验证录入后,如果出现错误,应用会自动回到录入页面,这是为什么?在Struts2中,Action、Interceptor 需要返回String类型的result,框架才能通过配置好的转向来决定下一个视图是哪个页面。那么验证框架是怎么做到的呢?
源代码分析:
第一、
通过struts2-core-2.0.11.jar中的struts-default.xml文件我们可以看到
程序代码<package name="struts-default" abstract="true">
<interceptor-stack name="defaultStack">
...
<interceptor-ref name="validation"/> 验证框架Interceptor
<interceptor-ref name="workflow"/> 工作流Interceptor
</interceptor-stack>此处的指出的两个Interceptor是和我们讨论的问题有关系的两个Interceptor。
程序代码<interceptor name="validation" class="org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor"/>
<interceptor name="workflow" class="com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor"/>由此我们知道了需要看的源代码的路径。
第二、
分析AnnotationValidationInterceptor:
AnnotationValidationInterceptor继承自ValidationInterceptor(package com.opensymphony.xwork2.validator)
在AnnotationValidationInterceptor中的doIntercept方法中我们看到
程序代码protected String doIntercept(ActionInvocation invocation) throws Exception {

Object action = invocation.getAction();
//此处框架只是用了Annotation的方式来查看,现在触发Action方式是否是不需要验证的,如果不需要就直接触发
//否则使用父类的方法
if (action != null) {
Method method = getActionMethod(action.getClass(), invocation.getProxy().getMethod());
SkipValidation skip = (SkipValidation) method.getAnnotation(SkipValidation.class);
if (skip != null) {
return invocation.invoke();//直接触发
}
}
return super.doIntercept(invocation);//使用父类的方法
}那么我们继续来看父类的方法
在ValidationInterceptor中
程序代码protected String doIntercept(ActionInvocation invocation) throws Exception {
doBeforeInvocation(invocation);

return invocation.invoke();
}此处有个核心方法doBeforeInvocation,注意是在触发Action之前执行的方法,这也是为什么验证框架不通过就进不了Action方法的原因所在。
程序代码 protected void doBeforeInvocation(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
String context = invocation.getProxy().getActionName();
String method = invocation.getProxy().getMethod();

if (log.isDebugEnabled()) {
log.debug("Validating "
+ invocation.getProxy().getNamespace() + "/" + invocation.getProxy().getActionName() + " with method "+ method +".");

}
//此处是初始化AnnotationActionValidatorManager类(静态初始化)
//通过这个类的validate方法来验证的
//此方法不具体解释,主要是根据已经配置好的验证规则(XML)来验证,如果出现错误就会addFieldError
if (validateAnnotatedMethodOnly) {
ActionValidatorManagerFactory.getInstance().validate(action, context, method);
} else {
ActionValidatorManagerFactory.getInstance().validate(action, context);
}

}
第三、
好,到此为止我们已经知道验证器是如何工作的,如何添加验证错误的了,那么回到我们的问题,Struts2是怎么回到原有页面的?我们还有一个类没有解释,就是DefaultWorkflowInterceptor,来看代码:
程序代码 public class DefaultWorkflowInterceptor extends MethodFilterInterceptor {
...
private String inputResultName = Action.INPUT;//"input"
...
protected String doIntercept(ActionInvocation invocation) throws Exception {
Object action = invocation.getAction();
if (action instanceof Validateable) {
//这里会触发Action中validate和validateDo开头的方法,来进行验证
...
}


if (action instanceof ValidationAware) {
ValidationAware validationAwareAction = (ValidationAware) action;

if (validationAwareAction.hasErrors()) {
//如果之前addFieldError后,这里就会捕捉到
if (_log.isDebugEnabled()) {
_log.debug("Errors on action "+validationAwareAction+", returning result name 'input'");
}
return inputResultName;//关键在此处
}
}

return invocation.invoke();
}
}应该看到了吧,其实回到原来页面只是一种假象,Struts2中默认input是录入页面,这样这里就默认回到了“原来的页面”,如果我们的录入页面不是input所指的页面,恐怕就会有问题了。因此在做Struts2应用的时候,最好一个action只有一个录入页面,否则会有些麻烦了。因此如果想做一个业务异常的拦截器的话,最好也是返回input,从这里也能看出Struts2也在向ROR学习,约定高过配置的思想。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值