引用出处: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对象。