Struts2的参数封装分为:
静态参数封装和动态参数封装
假如我们有一个这样的动作类
public class Demo1Action extends ActionSupport {
private String username;
private int age;
public String addUser(){
System.out.println(username+","+age);
return null;//不返回任何结果视图 NONE常量
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
struts.xml配置
张三
18
启动服务器,在浏览器访问就能获取到username和age,控制台输出:张三,18
这种赋值方式在配置文件中已经写死,想要更改就必须更改配置文件
那么这个值是怎么赋值给username和age的呢?
其实是struts-default.xml中的拦截器
public class Demo1Action extends ActionSupport {
private String username;
private int age;
public String addUser(){
System.out.println(username+","+age);
return null;//不返回任何结果视图 NONE常量
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
要求:表单中的name属性取值必须和动作类中数据模型set方法后面的名称一致
这种方式其实和上面的静态赋值类似,只不过我们在jsp页面中的表单中添加数据,提交表单后由struts-default.xml中的拦截器
注意:jsp页面写法和方式一不同,如果不加user就取不到值,因为表单中的name值和你动作类中的名称不匹配(动作类中是user)
" />
年龄:user.age"/>
动作类和数据模型写法
//User类
import java.io.Serializable;
public class User implements Serializable {
private String username;
private int age;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
//动作类
public class Demo3Action extends ActionSupport {
//定义数据模型对象
//第一种情况
private User user;
//第二种情况
private User user = new User();
public String addUser(){System.out.println(user.getUsername()+","+user.getAge());
return null;
//不返回任何结果视图 NONE常量
}
public User getUser() {
System.out.println("getUser");return user;
}
public void setUser(User user) {
System.out.println("setUser");
this.user = user;
}
}
第一种情况,我们在动作类中不创建User对象,只创建变量,控制台输出结果:
第二种情况,我们在动作类中创建User对象,控制台输出结果:
分析:第二中情况下,我们已经创建了User对象,Struts2框架先调用getUser方法,一看User对象已经存在,就不再调用setUser方法创建对象,直接再次调用getUser方法取值
,第一次调用get方法只判断对象存不存在,第二次调用get方法才是取值。
3.代码实现
jsp页面
动作类
public class Demo4Action extends ActionSupport implements ModelDriven{
//定义数据模型对象
private User user = new User() ;//使用模型驱动,必须自己实例化模型对象
//该方法返回的是数据模型
public User getModel() {
return user;
}
public String addUser(){
System.out.println(user.getUsername()+","+user.getAge());
return null;//不返回任何结果视图 NONE常量
}
public User getUser() {
return user;
}
public void setUser(User user) {
this.user = user;
}
}