• [Struts2 in action 笔记2]表单数据的转移(对象支持与模型驱动)


    前言-

    本文对应《Struts2 in action》第三章

    Struts2框架很强大,强大到有些地方使用的时候不明不白地,无论是约定还是OGNL的使用,他们真的很像是没有头绪的代码。。。

    仅为本人的读书笔记,如有错误请联系我。

    正文-

    书上一共介绍了三种数据转移

    第一种是Action先作为Javabean接下数据,然后再设置到User中

    提交的表单:
    
    <s:form action="Register">
        <s:textfield name="username" label="Username"/>
        <s:password name="password" label="Password"/>
        <s:textfield name="portfolioName" label="Enter a name for your portfolio"/>
        <s:submit/>
    </s:form>
    
    Action类
    
    public class Register extends ActionSupport {
        
    
        public String execute(){
            
            /*
             * Create and move the data onto our application domain object, user.
             */
            User user = new User();
            user.setPassword( getPassword() );
            user.setPortfolioName( getPortfolioName() );
            user.setUsername( getUsername() );
            
            getPortfolioService().createAccount( user ); 
            return SUCCESS;
        }
        
        
        /* JavaBeans Properties to Receive Request Parameters */
        
        private String username;
        private String password;
        private String portfolioName;
    
        public String getPortfolioName() {
            return portfolioName;
        }
            。。。get与set。。。
    
        public PortfolioService getPortfolioService( )     {
            
            return new PortfolioService();
            
        }
    }
    
    User类
    public class User {
    
        private String username;
        private String password;
        private String portfolioName;
        private Double age;
        private Date birthday;
        private String firstName;
        private String lastName;
        private String email;
        private boolean receiveJunkMail;
        private Map portfolios = new HashMap();
    
        。。。。get与set。。。
    }

    表单向Action提交了两个数据,分别是username与password,这里username和password是OGNL表达式,对应Action类中相应的属性。感觉上Action再这里充当了Javabean。在execute()方法中,将username和password设置到了User对象上。然后调用PortfolioService的createAccount( )创建新用户。

    (这些图是我自己画的。。。不对请尽快联系我。)

    第二种则是使用“对象支持(ObjectBacked)”

    Action中出现的属性不是username和password,而是一个复杂的User 对象,因为User本身就存在同名属性username和password。所以Action将User对象作为属性去接表单传过来的数值。

    Jsp表单
    <s:form action="RegisterOB">
        <s:textfield name="user.username" label="Username"/>
        <s:password name="user.password" label="Password"/>
        <s:textfield name="user.portfolioName" label="Enter a name for your portfolio"/>      
        <s:submit/>
    </s:form>
    
    Action类
    public class ObjectBackedRegister extends ActionSupport {
    
        public String execute(){
            getPortfolioService().createAccount( user ); 
            return SUCCESS;
        }
        
        /* JavaBeans Properties to Receive Request Parameters */
        
        private User user; 
        
        public User getUser() {
            return user;
        }
    
        public void setUser(User user) {
            this.user = user;
        }
    
        public PortfolioService getPortfolioService( )     {
            
            return new PortfolioService();
            
        }
    }

    此时表单OGNL表达式就需要深度引用,将目的地指向user对象下的属性。

    (这些图是我自己画的。。。不对请尽快联系我。)

     

    第三种则是“模型驱动(ModelDriven)”

    ,她需要我们的Action类实现ModelDriven接口,此接口下只有一个方法——getModel(),它会返回一个Object类型。

    Jsp表单
    <s:form action="RegisterMD">
        <s:textfield name="username" label="Username"/>
        <s:password name="password" label="Password"/>
        <s:textfield name="portfolioName" label="Enter a name for your portfolio"/>      
        <s:submit/>
    </s:form>
    
    Action类
    public class ModelDrivenRegister extends ActionSupport implements ModelDriven {
        public String execute(){
            
            getPortfolioService().createAccount( user ); 
            
            return SUCCESS;
        }
        
        /* Instance field and getModel() to support the ModelDriven interface */
        
        private User user = new User();
        
        public Object getModel() {
            
            return user;
        }
        
        public PortfolioService getPortfolioService( )     {
            
            return new PortfolioService();
            
        }
    }

    这里,代码里先实例化了一个User对象user,再让getModel()返回一个user,然后。。。表单的数值就传过来了。

    感觉就好像Action将user扔到了框架里,然后getModel()返回的时候就把user装满了数据带了回来。。。

    (这些图是我自己画的。。。不对请尽快联系我。)

     

    其实不然,下一章关于数据进出框架和OGNL都有说明

    Struts2我们都叫他拦截器不是没有道理的,Struts建立再Servlet API上,当数据提交时,会到一个叫ValueStack的地方,如上图所示,我们的Action已经在那里等候多时了。此时“Params”拦截器会把请求参数的name值解析成为一个OGNL表达式,用来在ValueStack上定位正确的目的地,这个过程在第二种传值方法中尤为明显,OGNL就像我们平时编写Java程序一样将数据深度引用到了正确的位置。

    后记-

    其实我刚开始这一点的时候也是一头雾水,什么是OGNL?为什么统一写法之后就能将值传到正确的地方?接着往后看现在我有点弄明白了,但是还有点问题。

    不过我觉得如果仅仅是关于Struts表单提交数据,不管是对象支持(OB)还有模型驱动(MD),我应该已经将我的理解记录下来了,已经达到笔记的目的了。

    希望这文章能帮到你

  • 相关阅读:
    设为首页 和 收藏本页
    软件开发:需求分析的20条法则
    常用的50条网站推广方法
    IT人士在离职时可以做的14件事情
    需求文档的编写
    无法清除DNS缓存
    输入法没有了 输入法不见了
    CMS
    用户输入的防注入总结 简介和第一步
    winmail无法给新浪发送邮件
  • 原文地址:https://www.cnblogs.com/YFEYI/p/12646368.html
Copyright © 2020-2023  润新知