1. Action 实现 ModelDriven 接口后的运行流程

1). 先会执行 ModelDrivenInterceptor 的 intercept 方法.

public String intercept(ActionInvocation invocation) throws Exception {
//获取 Action 对象: EmployeeAction 对象, 此时该 Action 已经实现了 ModelDriven 接口
//public class EmployeeAction implements RequestAware, ModelDriven<Employee>---这里就是我Action类实现的ModelDriven接口

Object action = invocation.getAction();

//判断 action 是否是 ModelDriven 的实例
if (action instanceof ModelDriven) {
//强制转换为 ModelDriven 类型
ModelDriven modelDriven = (ModelDriven) action;
//获取值栈
ValueStack stack = invocation.getStack();
//调用 ModelDriven 接口的 getModel() 方法
//即调用 EmployeeAction 的 getModel() 方法
/*自己在Action类中实现ModelDriven接口时重写了getModel()方法
public Employee getModel() {
employee = new Employee();
return employee;
}
*/
//实际就是为了获取到我们返回的对象
Object model = modelDriven.getModel();
if (model != null) {
//把 getModel() 方法的返回值(也就是我想压入栈顶的对象)压入到值栈的栈顶. 实际压入的是 EmployeeAction 的 employee 成员变量
stack.push(model);
}
if (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();
}

时间: 2024-10-13 15:56:08

1. Action 实现 ModelDriven 接口后的运行流程的相关文章

使用 paramsPrepareParamsStack 拦截器栈后的运行流程

2. 使用 paramsPrepareParamsStack 拦截器栈后的运行流程 1). paramsPrepareParamsStack 和 defaultStack 一样都是拦截器栈. 而 struts-default 包默认使用的是defaultStack 2). 可以在 Struts 配置文件中通过以下方式修改使用的默认的拦截器栈 <default-interceptor-ref name="paramsPrepareParamsStack"></defau

Action实现prepareable接口后定义前置方法

// 访问每一个action的方法都会先调用此方法:前置方法 @Override public void prepare() throws Exception { System.out.println("prepare"); } // input,save方法之前执行 public void prepareInput() throws Exception { System.out.println("prepareInput:" + id); if (id != nu

关于有继承modelDriven接口的action的ajax调用传入参数

如   Model类如下,Teacher,public class Teacher{ private Integer id: priavte  String name; private School school; } 而School, public class School{ private Integer id: priavte  String name; } 上面的Teacher,School省去了getter和setter方法. action类如下 public class Teache

【Android】如何实现Android程序在手机锁屏后继续运行

最近笔者在做一个功能,就是实现Android程序在锁屏后可以继续运行,笔者在网上查了一些资料,现在整理出来,希望能够对你有所帮助. 1.如何监听屏幕锁屏 监听屏幕锁屏可以通过如下方式来实现,直接通过代码来判定,或通过监听器来实现 1)通过代码来判定屏幕的锁屏状态 可以通过PowerManager的isScreenOn方法,代码如下: PowerManager pm = (PowerManager) context.getSystemService(Context.POWER_SERVICE);

设置Qt程序在Windows开机后自动运行

(转自:http://blog.csdn.net/weiren2006/article/details/7443362) 让软件在系统启动时自动运行,可通过修改注册表实现. 在\HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\Run中添加需启动的程序路径,代码如下: voidautoStart(boolflag){//写入注册表,开机自启动HKEYhKey;//找到系统的启动项LPCTSTRlpRun=(wchar_t*)

Advanced Installer 打包后,安装包在WIN10下重启后再次运行安装的解决办法

原文:Advanced Installer 打包后,安装包在WIN10下重启后再次运行安装的解决办法 前几个月使用Advanced Installer 打包了一堆安装包,其中有使用默认主题的,也有根据UI设计更改过一些功能的,当时在Windows7下测试没有任何问题,就直接上线给用户使用了. 这两天在禅道上发现指派了一个BUG过来,描述的内容是在Windows10下安装包会出现重启后再次自动运行的问题,见鬼了,没有写过自启动注册表啊,马上打开工程查看,发现了一个很奇怪的现象,下面来介绍. 1.当

iis6手工创建网站后无法运行php脚本

给人搬了十几个网站,老站用西部数码建站助手创建的,现在过期了无法继续创建,只能在Internet 信息服务(IIS)管理器创建网站,创建下来都没问题,但是就是无法打开网站. 测试打开txt文档.静态页面都能打开,一到打开php文件就直接就挂了,无法打开,什么报错都没有. 之前有用iis6以外的服务器创建过网站,都是直接创建就可以运行. 没报错不好找问题,百度用别人的方法操作也不行.实在没办法,只能对着之前用建站助手创建的网站配置,放下架子,一个个看过去,结果发现用建站助手创建的网站ISAPI拓展

如何让linux程序在ssh shell关闭后继续运行?

我们经常会碰到一种情况,用ssh远程登录到linux服务器后,启动一个脚本跑任务,如果这个任务耗时比较久,就得等着,如果此时由于网络原因,ssh连接断了,再重新登录服务器,原来的任务就没了,得重新运行一次.有没有办法让任务切到后台,ssh退出后还能继续运行呢? 当然有-,而且很简单: 1. 在ssh shell中运行脚本,比如我运行一个批量下载脚本: python download-app-annie.py 2. 按下ctrl-z中断脚本运行,此时系统提示: ^Z [1]+  Stopped  

界面显示后延时运行代码《转》

procedure timerfun(handle:Thandle;msg:word;identer:word;dwtime:longword);stdcall; begin killtimer(handle,identer);//关闭定时器 //接下来为代码段end; procedure TForm1.FormShow(Sender: TObject); begin settimer(self.handle,0,1000,@timerfun); end; 加载界面后再运行代码段