JavaWeb----学习(30)----struts2---ModelDriven 拦截器

1.如果 Action 类实现了 ModelDriven 接口,该拦截器将把 ModelDriven 接口的 getModel() 方法返回的对象置于栈顶

2.ModelDriven工作原理:

     2.1 action类实现ModelDriven接口:

public class EmpAction implements RequestAware,ModelDriven<Employee>

    2.2 浏览器发送请求,先到ModelDriven 拦截器,调用 ModelDrivenInterceptor的intercept()方法:

      

public String intercept(ActionInvocation invocation) throws Exception {
             //获取Action对象:此时为EmpAction对象,此时该 Action 已经实现了 ModelDriven 接口
		Object action = invocation.getAction();
             //判断 action 是否是 ModelDriven 的实例
		if ((action instanceof ModelDriven)) {
                        //强制转换为 ModelDriven 类型
			ModelDriven modelDriven = (ModelDriven) action;
                        //获取值栈
			ValueStack stack = invocation.getStack();
                       //调用 ModelDriven 接口的 getModel() 方法
                       //即调用 EmpAction的 getModel() 方法
			Object model = modelDriven.getModel();
			if (model != null) {
      //把 getModel() 方法的返回值压入到值栈的栈顶. 实际压入的是 EmpAction的 employee 成员变量
				stack.push(model);
			}
			if (this.refreshModelBeforeResult) {
				invocation.addPreResultListener(new RefreshModelBeforeResult(
						modelDriven, model));
			}
		}
		return invocation.invoke();
	}

2). 执行 ParametersInterceptor 的 intercept 方法: 把请求参数的值赋给栈顶对象对应的属性. 若栈顶对象没有对应的属性, 则查询


                                                                              值栈中下一个对象对应的属性...

3). 注意: getModel 方法不能提供以下实现. 的确会返回一个 Employee 对象到值栈的栈顶. 但当前 Action
的 employee 成员变量却是 null.

             

public Employee getModel() {
    return new Employee();
}

猜你喜欢

转载自blog.csdn.net/lsh15846393847/article/details/87915904