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值进行封装:
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; } }
第二种方式,模型驱动;
1.创建实体类(属性名必须和表单的name属性值一模一样)
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方法,方法返回的是实例化对象的变量名。
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; } }
第三种方式:表达式封装;
1.和模型驱动一样,表达式封装也需要创建一个实体类。
2.在LoginAAction类中声明实体类(这里不需要实例化),再生成实体类对象名的set和get的方法。
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属性需要做一个修改,要用对象变量名.属性名。
<form action="newlogin.action" method="post"> 用户名:<input name="elogin.username" ><br> 密码:<input name="elogin.pwd" type="password"><br> <input type="submit" value="登录"> </form>
这三种方式都可以获取到表单提交的值。但是要注意的是:在一个action中不能给对同一个表单使用属性封装和模型封装,如果使用只会执行模型驱动封装。
表达式封装和模型封装的相同点以及不同点:
相同点:
都可以把数据封装到实体类中
不同点:
模型封装只能够把数据封装到一个实体类中,在一个action里面只能实现一次ModelDriven的接口所以模型封装只会封装一个到一个实体类中,
表达式封装可以吧数据封装到多个对象中。