Struts2 03---数据封装+获取表单提交数据

    Struts的数据封装分为三种:属性封装,模型驱动,表达式封装。下面以获取表单提交数据来简单介绍一下Struts的数据封装。

<form action="loginlogin.action" method="post">
用户名:<input name="username" ><br>
密码:<input name="pwd" type="password"><br>
<input type="submit" value="登陆">
</form>

  使用第一种方法,属性封装来获取数据的时候须要将form表单内的两个name值进行封装:ide

package com.action;

import com.opensymphony.xwork2.ActionSupport;
import com.sun.net.httpserver.Authenticator.Success;
public class LoginbAction extends ActionSupport {
    private String username;
    private String pwd;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

    @Override
    public String execute() throws Exception {
    System.out.println("获取到的表单数据:"+username+"---"+pwd);
        return SUCCESS;
    }
}

 

第二种方式,模型驱动;post

 1.建立实体类(属性名必须和表单的name属性值如出一辙)this

package com.entity;

/**
 * 
 * @ClassName: ELogin
 * @Description: 模型驱动的实体层
 * @author Administrator
 * @date 2017年10月10日 下午6:46:00
 *
 */
public class ELogin {
    private String username;
    private String pwd;

    public String getUsername() {
        return username;
    }

    public void setUsername(String username) {
        this.username = username;
    }

    public String getPwd() {
        return pwd;
    }

    public void setPwd(String pwd) {
        this.pwd = pwd;
    }

}

2.action实现ModelDriven接口, 实例化一个对象,实现ModelDriven接口的getModel方法,方法返回的是实例化对象的变量名。spa

package com.action;

import com.entity.ELogin;
import com.opensymphony.xwork2.ActionSupport;
import com.opensymphony.xwork2.ModelDriven;
/**
 * 
* @ClassName: LoginAction
* @Description: 模型驱动  经过反射获取提交过来的属性值
* @author Administrator
* @date 2017年10月10日 下午6:44:46
*
 */
public class LoginAction extends ActionSupport implements ModelDriven<ELogin>{
    
    public String login(){
        System.out.println("获取到表单数据:"+elogin.getUsername()+"---"+elogin.getPwd());
        return NONE;
    }
    
@Override
public String execute() throws Exception {
    
    return super.execute();
}

private ELogin elogin=new ELogin();
@Override
public ELogin getModel() {
    
    return elogin;
}

}

 

第三种方式:表达式封装;.net

1.和模型驱动同样,表达式封装也须要建立一个实体类。code

2.在LoginAAction类中声明实体类(这里不须要实例化),再生成实体类对象名的set和get的方法。orm

package com.action;

import com.entity.ELogin;
import com.opensymphony.xwork2.ActionSupport;

/**
 * 
* @ClassName: LoginaAction
* @Description: 表达式封装
* @author py
* @date 2017年10月10日 下午6:48:11
*
 */
public class LoginaAction extends ActionSupport{
    
    private ELogin elogin;
    
    public ELogin getElogin() {
        return elogin;
    }
    public void setElogin(ELogin elogin) {
        this.elogin = elogin;
    }
@Override
public String execute() throws Exception {
 System.out.println("获取到表单数据:"+elogin.getUsername()+"---"+elogin.getPwd());
return SUCCESS; 
}
}

3.和模型驱动不一样的是,这里的表单name属性须要作一个修改,要用对象变量名.属性名。server

<form action="newlogin.action" method="post">
用户名:<input name="elogin.username" ><br>
密码:<input name="elogin.pwd" type="password"><br>
<input type="submit" value="登陆">
</form>

 

这三种方式均可以获取到表单提交的值。可是要注意的是:在一个action中不能给对同一个表单使用属性封装和模型封装,若是使用只会执行模型驱动封装。对象

表达式封装和模型封装的相同点以及不一样点:blog

相同点:
均可以把数据封装到实体类中

不一样点:
模型封装只可以把数据封装到一个实体类中,在一个action里面只能实现一次ModelDriven的接口因此模型封装只会封装一个到一个实体类中,

表达式封装能够吧数据封装到多个对象中。