因为在struts1的版本中,属性的拦截以及控制的处理是被封装为两个对立的ActionForm、Action来获取 HttpServerRequest的参数、控制访问MAPPING的。而在Struts2中我们可以直接通过Action来获取请求参数,并把处理的 资源映射返回给struts.xml指向对应的视图资源或者模型或者控制器进行下一步的处理。发现Struts2中的 Action 负责了struts1的 ActionForm以及Action的双重任务。如果我们习惯了struts1的开发方式,在Struts中提供模型驱动的方式来分解 Action的任务,这种模式是通过专门的JavaBean来封装请求。
下面我们来比较一下:属性驱动和模型驱动的区别
一、属性驱动的例子 :
![【转】Strut2的属性驱动,模型驱动的理解 - JeromeCen - JeromeCen 收藏代码](https://i-blog.csdnimg.cn/blog_migrate/8bf224e4a874a374d7fadac465ad536f.png)
![【转】Strut2的属性驱动,模型驱动的理解 - JeromeCen - JeromeCen 【转】Strut2的属性驱动,模型驱动的理解 - JeromeCen - JeromeCen](https://i-blog.csdnimg.cn/blog_migrate/81de7ae0b877b49d09357d7c856701ab.gif)
- public class Login implements Action //继承Action接口
- {
- private String username;
- private String password;
- // 在属性驱动里面是依靠getter/setter方法获存取请求参数
- public void setUsername(String username)
- {
- this .username = username;
- }
- public String getUsername()
- {
- return this .username;
- }
- public void setPassword(String password)
- {
- this .password = password;
- }
- public String getPassword()
- {
- return this .password;
- }
- // 默认的方法
- public String execute() throws Exception
- {
- return SUCCESS;
- }
- }
-
二、 模型驱动例子 - //模型使用JavaBean的设计方式
- //和Struts1的ActionForm是一样
- public class UserBean
- {
- private String username;
- private String password;
- public void setUsername(String username)
- {
- this .username = username;
- }
- public String getUsername()
- {
- return this .username;
- }
- public void setPassword(String password)
- {
- this .password = password;
- }
- public String getPassword()
- {
- return this .password;
- }
- }
- //实现Action
- public class Login implements Action,ModelDriver<UserBean> //必须继承ModelDriver 且指明具体的UserBean类型
- {
- private UserBean model = new UserBean();
- public String execute() throws Exception
- {
- if (getMode().getUsername().equals( "scott" )
- && getMode().getPassword().equeals("tiger" ) )
- {
- return SUCCESS;
- }
- else
- {
- return ERROR;
- }
- }
- p ublic UserBean getModel()
- {
- return model;
- }
- }
其实,模型驱动必须实现ModelDriver接口,以及必须实现getMode()方法,该方法把Action和以及对应的Model实例关联。
配置属性驱动和模型驱动的方式一样,在struts.xml文件中配置对应的Action即可,那他怎么实现的?
那么,我们要看到 Struts2是一个拦截器为核心的框架 ,在struts_default.xml文件里面可以发现对应的拦截器的设置。
三、在JSP页面访问的区别:
而我们在属性驱动模型下在JSP中访问属性时:
<s:property value="username">
而在模型驱动模型下在JSP中访问属性时:
<s:property value ="model.usename">
但是,Struts2会自动识别使用何种驱动模式,省略model.系统仍能自动会关联到model.username的属性值。
四、选择属性驱动和模型驱动的问题:
当JSP表单的属性和 数据持久层对象的数据成员一致 的话就用strut2的模型驱动,代码统一。
当表单的属性和数据持久层对象的数据成员不一致的话就用属性驱动,因为如果用模型驱动要两个bean,一个与数据持久层对象,一个与提交的表单对应。