[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( )创建新用户。

[Struts2 in action 笔记2]表单数据的转移(对象支持与模型驱动)(这些图是我自己画的。。。不对请尽快联系我。)

第二种则是使用“对象支持(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对象下的属性。

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

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

 

第三种则是“模型驱动(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装满了数据带了回来。。。

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

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

 

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

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

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

后记-

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

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

希望这文章能帮到你