一、概述

  所谓模型驱动,就是使用单独的JavaBean实例贯穿整个MVC流程,与之相对应的属性驱动方式,则使用属性作为贯穿MVC流程的信息携带者。属性无法独立存下,它必须依附于一个对象,这个对象就是Action实例。简单来说,模型驱动使用单独的值对象来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果。

二、应用实例  

  以前文提到的LoginAction为例,在属性驱动中的action为:

public class LoginAction extends ActionSupport
{
private static final long serialVersionUID = -5377305857336513025L;
private String username;
private String password;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
@Override
public String execute() throws Exception
{
if(getUsername().equals("xujian")&&getPassword().equals("123456"))
{
ActionContext.getContext().getSession().put("user", username);
return SUCCESS;
}
else
return ERROR;
}
}

  而在模型驱动中,我们通常上述的action分解为如下两个类:

/*
* 用于封装请求参数和处理结果
*/
public class UserBean
{
private String username;
private String password;
private String tip;
public String getUsername()
{
return username;
}
public void setUsername(String username)
{
this.username = username;
}
public String getPassword()
{
return password;
}
public void setPassword(String password)
{
this.password = password;
}
public String getTip()
{
return tip;
}
public void setTip(String tip)
{
this.tip = tip;
}
}

  还提供一个包含处理逻辑的Action类:

public class LoginAction implements Action,ModelDriven<UserBean>
{
private UserBean model=new UserBean();
@Override
public UserBean getModel()
{
return model;
}
@Override
public String execute() throws Exception
{
if(getModel().getUsername().equals("xujian")&&getModel().getPassword().equals("123")) {
getModel().setTip("哈哈,登录成功");
return SUCCESS;
}
else
return ERROR;
}
}

  从上述代码我们可以看到,在模型驱动模式中,Action必须实现ModelDriven接口,并实现getModel()方法,该方法用于把Action和与之对应的Moel实例关联起来。

  在struts-default.xml文件中,我们看到该文件配置了两个拦截器引用params和modelDriven,其中params拦截器负责提取请求参数,如果使用属性驱动模式,还负责将请求参数传递给Action实例的属性,而modelDriven拦截器负责将请求参数传递给模型的属性。

 <interceptor name="modelDriven" class="com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor"/>
<interceptor name="params" class="com.opensymphony.xwork2.interceptor.ParametersInterceptor"/>

三、总结

  模型驱动和属性驱动各有利弊,模型驱动结构清晰,但编程繁琐,属性驱动则编程简洁,但是结构不够清晰。

  通常情况下,如果表单的属性不是一一对应的话,那么就应该使用属性驱动,否则你的系统就必须提供两个Bean,一个对应表单提交的数据,另一个用于持久层。

Struts2(四)属性驱动和模型驱动的更多相关文章

  1. Struts2的属性驱动与模型驱动的区别

    1.Struts2的属性驱动. Struts2的属性驱动指的是在action中JSP页面的每一个form中的name都对应在action中有一个属性与之对应.看下面代码片段: <form act ...

  2. Struts2中属性驱动与模型驱动

    属性驱动: 1.概念 能够利用属性驱动获取页面表单元素的内容 2.步骤 1.在action中声明属性,属性的名称和页面元素中name属性的值保持一致 2.action中的属性必须有set和get方法 ...

  3. Struts2属性驱动与模型驱动

    为什么要使用属性驱动和模型驱动 struts2与struts很大的不同点在于,struts的execute方法提供了HttpServletRequest和HttpServletResponse方法在获 ...

  4. strus2中获取表单数据 两种方式 属性驱动 和模型驱动

    strus2中获取表单数据 两种方式 属性驱动 和模型驱动 属性驱动 /** * 当前请求的action在栈顶,ss是栈顶的元素,所以可以利用setValue方法赋值 * 如果一个属性在对象栈,在页面 ...

  5. action类中属性驱动和模型驱动的区别

    1.Struts2的属性驱动 在Action类中,属性××通过get××()和set××()方法,把参数在整个生命周期内进行传递,这就是属性驱动 代码如下: package org.abu.csdn. ...

  6. Struts2 属性驱动、模型驱动、异常机制

    模型驱动使用单独的VO(值对象)来封装请求参数和处理结果,属性驱动则使用Action实例来封装请求参数和处理结果. 一.使用模型驱动 1.login.action采用模型驱动模式实现,采用模型驱动时必 ...

  7. struts2 中属性驱动(其实就是struts2 action 中处理 request 的参数【old 方式servlet api 封装数据到javabean中(or beanutils)】),这里属性驱动是新方式

    1.属性驱动 a\  一般的set public class UserAction extends ActionSupport { private String username; private S ...

  8. Struts2的学习-属性驱动和模型驱动

    1.新建空项目,并托管到码云 2.设立maven 3.设置pom.xml 4.建包 5.在java包里建立两个类 package com.nf.entity; public class User { ...

  9. struts2属性驱动模型

    属性驱动模型的作用: 因为struts2与servlet API 实现了解耦,无法直接使用HttpServlet Request对象获取表单提交的参数,但Struts2提供了属性驱动模型机制来解决这个 ...

随机推荐

  1. Eclispe IDE集成Maven

    Eclipse提供了一个很好的插件m2eclipse 无缝将Maven和Eclipse集成在一起. m2eclipse一些特点如下 您可以从Eclipse运行Maven目标. 可以使用其自己的控制台查 ...

  2. linux自动启动的示例

    linux作为服务器,经常希望一启动即可提供服务,以下命令为程序启动时,启动lhx用户下的程序: echo "su – lhx -c \"这里写入你的启动命令,Python建议使用 ...

  3. C# 根据第几周和季度 获取开始时间和结束时间

    /// <summary> /// 根据第几周 获取开始时间和结束时间 /// </summary> /// <param name="week"&g ...

  4. 转载:手把手教你做iOS推送

    手把手教你做iOS推送 http://www.cocoachina.com/industry/20130321/5862.html

  5. 【转】IOS 学习之 NSPredicate 模糊、精确、查询

    转自:http://blog.csdn.net/lianbaixue/article/details/10579117   简述:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于S ...

  6. iOS:DKLiveBlur

    https://github.com/kronik/DKLiveBlur Sources of DKLiveBlur and Demo app to show live blur effect sim ...

  7. df命令/du命令/磁盘分区

    4.1 df命令 4.2 du命令 4.3/4.4 磁盘分区 df命令 磁盘管理df 大小单位是KB,挂载点是linux上的目录 df -h 根据磁盘大小适当调整单位;单位有:Byte ,1KB,1M ...

  8. Mac下配置Oracle数据库客户端远程连接数据库服务器

    下载mac数据库客户端: 地址:http://www.oracle.com/technetwork/topics/intel-macsoft-096467.html 下载这俩个:(来源:http:// ...

  9. 【玩转Golang】reflect.DeepEqual

    如果有两个map,内容都一样,只有顺序不同 m1:=map[,,}; m2:=map[,,}; 我们怎么判断二者是否一致呢? 如果你打算这么写: fmt.Println("m1==m2&qu ...

  10. 安卓开发笔记——关于Handler的一些总结(上)

    接上篇文章<安卓开发笔记——关于AsyncTask的使用>,今天来讲下在安卓开发里"重中之重"的另一个异步操作类Handler. 今天打算先讲下关于Handler的一些 ...