Struts2拦截器实验报告

priestmoon 2010-01-12 11:00:39
struts.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd">

<struts>
<package name="struts2" extends="struts-default">

<interceptors>
<interceptor name="myInterceptor3" class="com.test.interceptor.MyInterceptor3"></interceptor>
</interceptors>

<action name="register"
class="com.test.action.RegisterAction">
<result name="success">/success.jsp</result>
<result name="input">/register2.jsp</result>

<interceptor-ref name="myInterceptor3">
<param name="includeMethods">validate,execute</param>
</interceptor-ref>
<interceptor-ref name="defaultStack"></interceptor-ref>
</action>
</package>
</struts>


RegisterAction2.java

package com.test.action;

import java.util.Date;

import com.opensymphony.xwork2.ActionSupport;

public class RegisterAction2 extends ActionSupport {

/* 一些Bean的属性和方法(略) */

public String execute() throws Exception {
System.out.println("execute~~~~");
return SUCCESS;
}

public void validate() {
System.out.println("validate~~~");
}
}


MyInterceptor3.java

package com.test.interceptor;

import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.MethodFilterInterceptor;

public class MyInterceptor3 extends MethodFilterInterceptor {

protected String doIntercept(ActionInvocation invocation) throws Exception {
System.out.println("MyInterceptor3");
System.out.println("My Interceptor3's method: "+invocation.getProxy().getMethod().toString());
String result=invocation.invoke();
return result;
}
}



实验明细:
(1)不加任何拦截器。程序在执行完validate()后,根据校验结果选择是否调用execute()。如果校验失败,则在jsp页面显示出错提示信息。实验成功。
(2)试图用MyInterceptor3拦截RegisterAction的validate()方法(通过设置includeMethods="validate"),无效。实验失败。
(3)由于Jsp页面用到了输入校验,照道理,如果validate()校验未通过的话,程序不可能执行execute()。这一点可以从未加拦截器之前的实验结果证实。然而,如果在MyInterceptor3中加入"includeMethods=execute"指定拦截execute(),则点击按钮提交表单校验失败后,会发现在执行validate()之前,拦截execute,但execute()函数却未执行。
(控制台日志:
MyInterceptor3
My Interceptor3's method: execute
2010-1-12 22:42:47 com.opensymphony.xwork2.validator.ActionValidatorManagerFactory <clinit>
信息: Detected AnnotationActionValidatorManager, initializing it...
validate~~~~)

如果输入校验通过,则发现execute被调用。


问题:
(1)为什么设置了对validate()的拦截却无效呢?
(2)拦截器在执行validate()方法之前对execute()进行拦截,为什么?
(3)拦截器对execute()进行了拦截,却没有执行execute()方法,这又是为什么?
...全文
313 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
SambaGao 2010-01-14
  • 打赏
  • 举报
回复
validate()的过程

1.
将请求参数转换为Bean的属性
2.
是否出现异常(Exception) 否
3.
通过反射调用validatexxx()方法
4.
调用validate()方法
5。
是否存在fieldError 否
6.
调用Action方法(如execute())
priestmoon 2010-01-13
  • 打赏
  • 举报
回复
up
zishanyan 2010-01-13
  • 打赏
  • 举报
回复
深夜发帖啊,顶一下,慢慢看
priestmoon 2010-01-12
  • 打赏
  • 举报
回复
自己先顶一下!
相信这个实验对于理解Struts2的拦截器很有帮助。
回帖者最好从程序流程和代码的角度剖析实验现象和结果。
集思广益,大家共同学习进步!

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧