9_用ModelDriven接收参数
关于DTO 的问题,刚才有的人说,我这里放了DTO,我上面还需要DomainModel吗?如果需要就可以放,不需要就完全可以不放了,那下面的getter和setter方法需不需要改了?当然要改,肯定要改成 setUserDTO()或者是 getUserDTO()什么的,好了关于DTO 的内容我们就到这里。
我们来看一下最后一种接收参数的方式,最后一种方式并不常用,不过了这种方式里面隐含了一种非常重要的程序设计的思想,所以了在这里我们要好好的谈一谈这个内容,这种方式叫 ModelDrivenParamInput ,我们先来看一下它的表现,
部署 09项目,访问 http://localhost:8080/Struts2_0900_ModelDrivenParamInput/
如下图所示:
点击 添加用户 ,如下图所示
我在这里调用的是 user action的add()方法,这时候我仍然写的是 name= a age=8 ,而且里面跟好玩的是,大家知道我们用name=a
我没有什么name 还有age,我没有写,这是因为我的这个UserAction 实现了一个接口,这个接口叫ModelDriven,就是模型驱动,所以大家应该慢慢的就会意识到当Struts 2 的一个Action接收到一个参数或者是一个请求之后,它的这些个请求的处理过程,往往是交给后面的这些模型去处理,想想看是不是这样啊?所以什么叫MVC?
M就是 Model ,就是Action里面保存的这些东西,它就是用来处理我们的这些请求的,
V就是view (视图),这个视图的话就是我处理完之后的结果来动态的定义对应的视图,
C就是 Control (控制器),谁来控制我用哪个模型来处理了?谁来控制我要到哪个视图去?是不是就是这个 UserAction.java这个Action啊?是的。看你在这里面存的是谁了,看你在这里返回的结果是谁了?这样MVC的概念在Struts 里面的应用就已经诞生了。
V就是那些个JSP视图,M就是我们后台的这些歌Model(如User),C就是各种各样的action,然后由C来控制着双方,他们之间互相的通信。然后把Model和View的耦合度解开来。
所以把请求的产生,请求的处理,请求的结果全给分开了,这样的好处就是各自自己都可以定义,定义完了之后,不会对其他的产生影响,如果要改变,我就变一下,重新配置就可以了,。所以了慢慢的MVC的概念在脑子里面就会产生了。
所以它为什么叫ModelDriven ,因为它认为这里定义的user是一个 Model ,注意了,用第三种方式的时候,这个 Model(即 User)你必须得自己new,因为此时 Struts 2 就不会帮你new 了,好我们来看一下这个ModelDriven 接口,这个源码是 xwork里面的,上次的项目中我们加载过,但是这个项目中我就不加载了,我们就看里面的一个方法,这个里面其实就一个方法,叫getModel()方法,那么也就是说我实现这个方法,把我的这个Model返回回来就可以了,如下图所示:
当然这里不要忘了用泛型,否则的话,大家还需要做类型强制转换,所以我这里实现了getModel()方法,然后返回user。那Struts 2 怎么往里面把参数传给user了?
画个图,大家看一下这个过程:叫它 ModelDriven
严格来讲了,这个应该是Struts 2的内部处理过程,至于是那个程序处理的,大家先不管,总而言之,是Struts 2的内部处理过程,Struts 2 接收到了两个参数,就是这个filter接收到两个参数了,然后了就会去new 那个Action,在new Action的时候了,它发现一个东西,发现Action实现了一个ModelDriven接口,首先了吧这个Action给new出来,接下来它就会问,原来你小子还实现了ModelDriven接口,真正里面可能没有这个方法,我们说的是过程,它说它实现了。既然你实现了ModelDriven接口,那么我是不是可以去调用你的getModel()方法?是的。既然我调用了你的getModel()方法,你是不是应该返回给我一个Model啊?是的。这样你就给了我那个user了,我既然拿到了合格User,我是不是就可以调用这个Model的setName()方法了?是的,当然我还可以接着调用它的setAge()方法,好这个大家明白了吗?所以了实现了ModelDriven接口就用这么一个好处,就是你具体的是什么Model它不管,它直接调用你的getModel()方法,然后往里面设东西,
这种方式并不常用,只不过通过这种方式,你就会知道,原来Struts2的这种MVC就是这个意思,那么问大家Struts2 在