引用出处:cnblogs.com/haimishasha/p/6193235.html
一 、Action接收请求参数
struts2内部提供三种请求参数封装机制
1) Action 本身作为model对象,通过成员setter封装(使用与成员少的)
<form action="${pageContext.request.contextPath }/regist1.action" method="post">  
    用户名 <input type="text" name="username" /><br/>  
    密码<input type="password" name="password"/><br/>  
    年龄 <input type="text" name="age" /><br/>  
    <input type="submit" value="注册" />  
</form>  
  
public class RegistAction1 extends ActionSupport {  
    提交的有什么参数就设置什么字段,并写好setter方法  
    private String username;  
    private String password;  
    private int age;  
    public void setUsername(String username) {  
        this.username = username;  
    }  
    public void setPassword(String password) {  
        this.password = password;  
    }  
    public void setAge(int age) {  
        this.age = age;  
    }  
}  
注:通过以上特性就能清楚,struts2的action是多例的,每个用户有每个用户的参数,每个参数封装到一组javabean中,也就是说每次请求都会创建 struts2的Action 对象。
2) 创建独立model对象,页面通过ognl表达式封装
<form action="${pageContext.request.contextPath }/regist2.action" method="post">  
    用户名 <input type="text" name="user.username" /><br/>  
    密码<input type="password" name="user.password"/><br/>  
    年龄 <input type="text" name="user.age" /><br/>  
    <input type="submit" value="注册" />  
</form>     
* 页面中使用ognl写法 name="user.username"  底层就会执行 Action的setUser() --- > setUsername();  
在action中的写法  
public class RegistAction2 extends ActionSupport {  
    private User user;持有对象  
    public void setUser(User user) {  
        this.user = user;  
    }  
// 必须提供get方法 ----- 如果不提供只能封装一个属性,下次再封装第二个属性的时候又是一个新的user  
    public User getUser() {  
        return this.user;  
    }  
}  
单独创建一个user的domain  
public class User {  
    private String username;  
    private String password;  
    private int age;  
    ...  
} 
3)使用ModelDriven接口,对请求数据进行封装
<form action="${pageContext.request.contextPath }/regist3.action" method="post">  
    用户名 <input type="text" name="username" /><br/>  
    密码<input type="password" name="password"/><br/>  
    年龄 <input type="text" name="age" /><br/>  
    <input type="submit" value="注册" />  
</form>  
  
public class RegistAction3 extends ActionSupport  implements ModelDriven<User> {  
    private User user = new User(); // 必须手动new,不然就出现空指针异常  
    @Override  
    public User getModel() {  
        return user;  
    }  
}  
单独创建一个user的domain  
public class User {  
    private String username;  
    private String password;  
    private int age;  
} 
原理:发起请求后, struts2 会调用 getModel().setUsername()、 getModel().setPassword()因此必须手动 对model进行初始化
结论:三种参数封装方式,在开发中主要使用第三种
第一种只适用于请求参数非常少的情况的封装,第二种更加灵活,支持一个表单数据封装到不同model对象,第三种封装方式,只能支持一个model对象。
原文:https://www.cnblogs.com/tttty/p/11417750.html