struts 属性驱动与模型驱动
一、属性驱动
<span style="font-size:18px;"><form action="register.do" name="RegisterForm" method="post"> Username:<input type="text" name="username"><br> Password:<input type="password" name="password"><br> </form></span>
<span style="font-size:18px;">public class LoginAction extends ActionSupport { private String username; private String password; public String get username() { return uname; } public void set username(String username) { this. username = username; } public String getpassword() { return password; } public void setpassword(String password) { this. password = password; } @Override public String execute() throws Exception { return ActionSupport.SUCCESS; } }</span>
二、模型驱动
<span style="font-size:18px;"><form action="register.do" name="RegisterForm" method="post"> Username:<input type="text" name="username"><br> Password:<input type="password" name="password"><br> </form></span>
POJO的代码,其实就是普通的Java Bean:
<span style="font-size:18px;">public class User { private String username; private String password; public String get username() { return uname; } public void set username(String username) { this. username = username; } public String getpassword() { return password; } public void setpassword(String password) { this. password = password; } }</span>
<span style="font-size:18px;">public class LoginAction extends ActionSupport implements ModelDriven<User> { private User user = new User(); // 模型驱动必须实现的方法,也是ModelDriven接口中唯一的方法 public User getModel() { return user; } @Override public String execute() throws Exception { return ActionSupport.SUCCESS; } }</span>
和属性驱动的Action有很大的区别:
(1)模型驱动的Action必须实现ModelDriven接口,而且要提供相应的泛型,这里当然就是具体使用的Java Bean了。
(2)实现ModelDriven的getModel方法,其实就是简单的返回泛型的一个对象。
(3)在Action提供一个泛型的私有对象,这里就是定义一个User的user对象,并提供相应的getter与setter。
到底用哪个?建议:(1)请你统一整个系统中的Action使用的驱动模型,即要么都是用属性驱动,要么都是用模型驱动。
(2)如果你的DB中的持久层的对象与表单中的属性都是一一对应的话,那么就使用模型驱动吧,毕竟看起来代码要整洁得多。
(3)如果表单的属性不是一一对应的话,那么就应该使用属性驱动,否则,你的系统就必须提供两个Bean,一个对应表单提交的数据,另一个用与持久层。
三、实现原理
上面配置片段中配置了系统的默认拦截器栈,它包含了两个拦截器引用:model-driven和params,这两个拦截器引用又对应系统中的model-driven和params拦截器。其中params拦截器负责提取请求参数,如果使用属性驱动模式,则还负责将请求参数传给Action实例的属性;而model-driven拦截器则负责将请求参数传给模型的属性。
属性驱动,举个例子,页面上有个标签 name="user"value="admin"。最后提交到后台会以user=admin的形式。被拦截器获悉后,它就会查找action中是否有user这个参数,如果找到就调用setUser将admin赋给user.当请求返回的到jsp页面时 在将jsp编译成servlet,如果页面中有name="user"的标签,或是直接用${user}的时候,拦截器会调用action中user参数的getUser方法将user的值通过Responce发送出去。
四、总结
SSH中的模型驱动,刚开始不知道什么东西,感觉很神奇,现在一总结,豁然开朗。