zoukankan      html  css  js  c++  java
  • Struts2的模型驱动

    Struts2即支持属性驱动,也支持模型驱动
    属性驱动:在Action中提供与表单字段一一对应的属性,然后一一set赋值
    模型驱动:使得表单字段都自动被set到一个JavaBean中,类似于Struts1.XActionForm
    采用属性驱动的方式时,是由每个属性来承载表单的字段值,运转在MVC流程里面
    采用模型驱动的方式时,是由模型对象来承载所有的属性值,运转在MVC流程里面
    若使用模型驱动方式的话,就必须单独提供一个JavaBean
    可能与持久层打交道的JavaBean不太一样,因此很可能要对每个对象提供两个JavaBean
    比如Struts1的ActionForm,一般来说绝对不会把ActionForm作为JavaBean跟持久层交互
    ActionForm仅仅是联系Web和Action的一个桥梁,因此推荐使用属性驱动接收表单字段


    com.opensymphony.xwork2.ModelDriven接口源代码中有一段很重要的说明,现抄录如下
    ModelDriven Actions provide a model object to be pushed onto the ValueStack in addition
    to the Action itself,allowing a FormBean type approach like Struts
    翻译:模型驱动的Action。将模型对象以及Action对象都放到ValueStack里面
             允许像Struts一样的FormBean方式
    也即:一个Action要想成为模型驱动的话,就必须实现ModelDriven接口
             而我们之前所一直继承的ActionSupport类并没有实现ModelDriven接口
    以下是采用模型驱动的Action代码示例

    1. public class ModelDrivenAction extends ActionSupport implements ModelDriven<User> {  
    2.     private User user = new User();  
    3.     public User getModel() {  
    4.         System.out.println(user);  
    5.         return user;  
    6.     }  
    7.     public String execute() throws Exception {  
    8.         System.out.println("Username is :" + user.getUsername());  
    9.         System.out.println("Password is :" + user.getPassword());  
    10.         return SUCCESS;  
    11.     }  
    12. }  
    ModelDrivenAction类的执行流程是:首先调用getModel()方法得到User对象
    接着根据JavaBean的原则将客户端传过来的属性,一个一个的set到User对象的属性中
    将属性全部set完之后,再执行execute()方法。对于模型驱动,只要了解这些就足够了


    模型驱动的底层实现机制
    这里用到了defaultStack拦截器栈中的modelDriven拦截器
    它对应com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor类,其API描述如下
    public class ModelDrivenInterceptor extends AbstractInterceptor
    Watches for ModelDriven actions and adds the action`s model on to the value stack.
    翻译:观察模型驱动的Action,并将这个Action的模型【这里指User对象】放到值栈中
    Note:The ModelDrivenInterceptor must come before the both StaticParametersInterceptor
    and ParametersInterceptor if you want the parameters to be applied to the model.
    翻译:若希望将表单提交过来的参数应用到模型里面
             那么ModelDrivenInterceptor拦截器就必须位于StaticParametersInterceptorParametersInterceptor拦截器前面
    实际上struts-default.xml已完成这个工作了。可以在defaultStack拦截器栈中查看三者位置
    所以对于采用模型驱动的方式的话,在struts.xml中只需要指定模型驱动的类就可以了
    其它的都不需要我们手工修改


    ModelDrivenInterceptor的部分源代码如下所示

    1. public class ModelDrivenInterceptor extends AbstractInterceptor{  
    2.     public String intercept(ActionInvocation invocation) throws Exception{  
    3.         Object action = invocation.getAction();  
    4.         // 这个action就是当前拦截器准备拦截的Action对象  
    5.         // 我们这里的action就是ModelDrivenAction,它实现了ModelDriven<User>接口  
    6.         // 根据多态性,可认为子类对象就是父类的一个实例,故action属于ModelDriven的实例  
    7.         if(action instanceof ModelDriven){  
    8.             // 将action强制转换为ModelDriven类型,获得ModelDriven的实例  
    9.             ModelDriven modelDriven = (ModelDriven)action;  
    10.             ValueStack stack = invocation.getStack();  
    11.             // 调用getModel(),此时ModelDrivenAction中的getModel()才会被执行,获得User对象  
    12.             Object model = modelDriven.getModel();  
    13.                 if(model != null){  
    14.                     // 获得User对象之后,就把它推入【压入】到值栈中,供后面调用  
    15.                     stack.push(model);  
    16.                 }  
    17.                 //以下略..  

  • 相关阅读:
    linux 防火墙管理
    自动化运维监控工具有哪些?常用的开源运维监控工具大全
    编程必备github代码仓库使用
    安全加密算法
    浅笑若风之高效工作流程
    jmeter压力测试工具使用
    ES扩容实战记录
    在5G+AI+CLCP下拉动互联网走向物联网
    设计模式之简单工厂模式
    设计模式之单例模式
  • 原文地址:https://www.cnblogs.com/Code-Engineering/p/5745403.html
Copyright © 2011-2022 走看看