引用出处:cnblogs.com/haimishasha/p/6193235.html
Struts2中Action接收参数的方法主要有以下三种:
1.使用Action的属性接收参数(最原始的方式):
a.定义:在Action类中定义属性,创建get和set方法;
b.接收:通过属性接收参数,如:userName;
c.发送:使用属性名传递参数,如:user1!add?userName=jim;
2.使用DomainModel接收参数:
a.定义:定义Model类,在Action中定义Model类的对象(不需要new),创建该对象的get和set方法;
b.接收:通过对象的属性接收参数,如:user.getUserName();
c.发送:使用对象的属性传递参数,如:user2!add?user.userName=mike;
3.使用ModelDriven接收参数(现在用的比较多的方式):
a.定义:Action实现ModelDriven泛型接口,定义Model类的对象(必须new),通过getModel方法返回该对象;
b.接收:通过对象的属性接收参数,如:user.getUserName();
c.发送:直接使用属性名传递参数,如:user2!add?userName=tom
1.使用Action的属性接收参数(最原始的方式):
a.定义:在Action类中定义属性,创建get和set方法;
b.接收:通过属性接收参数,如:userName;
c.发送:使用属性名传递参数,如:user1!add?userName=jim;
2.使用DomainModel接收参数:
a.定义:定义Model类,在Action中定义Model类的对象(不需要new),创建该对象的get和set方法;
b.接收:通过对象的属性接收参数,如:user.getUserName();
c.发送:使用对象的属性传递参数,如:user2!add?user.userName=mike;
3.使用ModelDriven接收参数(现在用的比较多的方式):
a.定义:Action实现ModelDriven泛型接口,定义Model类的对象(必须new),通过getModel方法返回该对象;
b.接收:通过对象的属性接收参数,如:user.getUserName();
c.发送:直接使用属性名传递参数,如:user2!add?userName=tom
一 、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对象。