开发者学堂课程【Java Web开发系列课程 - Struts2框架入门:模型驱动一】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/537/detail/7299
模型驱动一
又叫做 ModelDriven,重新写一个 Action 名字叫做 userModelAction。
实现一个 ModelDriven 的接口,把实现的类写上去。Get Model 的一个方法,直接改 user 即可。
看一下源码,这是一个 ModelDriven 的接口,里面有 Get Model,返回的是 action里面的对象。
ModelDriven 有一个拦截器
简单看一下,找 ModelDriven,是 opensymphony 下面的 ModelDriven 完成的。
拦截器,根据 intercept 的方法。判断这个是否是 ModelDriven 的类型。
public void setRefreshModelBeforeRes(boolean val)
this. refreshModelBeforeResult=val;
BOverride
public String intercept(ActionInvocati invocation) throws Exception
object action= invocation. getAction()
if (action instanceof ModelDriven)
ModelDriven modelDriven=(ModelDriv)action
Valuestack stack invocationgetstack();
object model= modelDriven. getModel();
if (model I= null)
stack. push(model);
if (refreshModelBeforeResult){
invocation.addPreResultListener(new RefreshModelBeforeResult(,mode1)
}
return invocation.invoke();
}
/**
要实现接口,之所以实现接口,在 modeldriven instances 里面,不是属于他的处理方法,进不来。
实现了这个接口,就是这个类型,限定了它。观察源码,观察底层的东西。
它把表达上的数据设置到对象上面来,struts2去完成这些功能,都是通过这些拦截器去完成的,这已经提到过,有这样的概念。
有 ModelDriven 拦截器去完成对象的赋值,他来了就判断,不属于他就不会做事情。你 action 要实现 ModelDriven 接口。
一旦 Action 属于 ModelDriven,转换成 ModelDriven,注意 ModelDriven 里面有一个 get model,如果不去写 get model,不能赋值。model 不等于 null,而默认情况是空,应该给他一个对象。
原因是可以判断他,做完之后去看一下这些值,刷新以后去设置,把user对象往值里面放。
写完之后要写 register,输出 user,返回 Action.SUCCESS。页面要简单一点,现在请求 regmodle 界面,改一改,要不然重名。
配置一下,name=regModle,成功以后,到显示页面,断点启动,为了看一下如何执行。
请求 regModle,点击,然后填写年龄邮箱,提交,应该走到 ModelDriven。
现在直接调过去,得到值了,还需要设置。DefaultAction invocation,再去请求一下,直接走到 proxy,需要一步一步走。
DefaultActioninvocation 重新提交一下请求,有的端点必须跟进去,否则进不去。下一步,有的时候找不到,就会跳出。
应该走到 DefaultActioninvocation 里。
找 struts3.4,确定,小屏幕,进入到 Dispatcher下,往下走,Actionproxy Factory先进去,creatactionproxy,找 DefaultActionproxyFactory 这个类,不用管container。
现在在 dispatcher 这个类,最后有一个 proxy,会有一个 getInvocation,判断它,往里面走,继续走,注意看一下,有一个 inv,走进去看一下。
现在还没有值,往下走,走回来再进去,在 proxy Execute 执行,注意 proxy,调用它的执行,要去往下走。在 dispatcher 里,走断点,跳过去,非常麻烦。
这里面有一个 get Invocation 之类的,往里面走之前设置,再往下走,这个DefaultInvocation,看 Modeldriven,往下走,每次判断一下,然后是 invoke,它会去调用下一个,刚刚走 invoke 方法,它的 invoke 方法是调用拦截器的。
Invocation 的设置地方,应该是走过了断点。通过 Modeldriven,把这个值设置过来。
jsp 页面
<form action="regModel. action"method="post">
用户名:<input type="text"name="name"/><br
密码:<input type="pas sword"name="pd"/><br>
年龄:<input type="text"name="age
<br>
邮箱:<input type="text"name=email"/><br>
<input type="submit"value="提交/
</form>
UserModelAction
publicclassUserModelActionimploments ModelDriven<User>{
private User user=new User();
public String register
System.out. println(user);l
return Action.SUCCESS;
}
public User getModel(){
return user;
}
属性驱动和模型驱动,自选,如果属性较多可以使用模型驱动。