在struts2中action的传值方式一般存在以下三种:
方法1:
先看请求:
<span style="white-space:pre"> </span>localhost:8888/struts/person.action?name=tom&age=22
在该请求中,存在name和age两个参数,那么只需要在相应的处理该参数的action类中定义name和age属性即可,还要相应的set和get方法:
<span style="white-space:pre"> </span>private String name ;
private int age ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getInfo(){
System.out.println("name===="+name);
System.out.println("age====="+age);
return SUCCESS;
}
在运行时,指定getInfo方法(默认是exectue方法)对参数进行处理,即可得到我们想要的结果。当然,我们可以更改请求的参数命名,如boyname,girlname,这是也不需要在乎在相应的action中参数的名称,但是必须保证所设的get和set方法是getBoyName和setBoyName,这是来自struts2的内部机制,在传入相应的参数时,struts2会去寻找相应的set和get方法,从而进行数据传输。
方法2:
创建一个Person类:
public class Person {
private String name ;
private int age ;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
那么在对应的action处理类中应该这么写:
public class ActionPerson extends ActionSupport{
private static final long serialVersionUID = 1L;
private Person person ;
public String getInfo(){
System.out.println("name====="+person.getName());
System.out.println("age======="+person.getAge());
return SUCCESS ;
}
public Person getPerson() {
return person;
}
public void setPerson(Person person) {
this.person = person;
}
}
ActionPerson看上去很奇怪,因为虽然有定义了Person的对象,却看不到被初始化的过程,当然,struts2又给我们做了。不过,此时,我们在请求传输的过程中,却需要这么写:
<span style="white-space:pre"> </span>localhost:8888/struts/person1.action?person.name=tom&person.age=22
在请求时,我们相当于调用了person.setName和person.setAge方法,可能是还是接触得很少,我本人还是对这种方法不是很理解,慢慢体味中。此时
,我们会想,是不是我们请求的参数存在几个,我们就得写几个对象的属性呢?答案是否定的,这就涉及了另外一个内容--DTO。
(DTO data transforer object) 数据传输对象。显然,这玩意只是负责数据的传输,我们可以从另外的角度去理解这个问题,DTO就是所属的实体类加上某些动作。DTO相当于一个工具,将所传输进来的数据(有些可能是对象没有作用的)过滤掉。举个例子,我们在注册的时候,如果是实体类的话,User只需要包含name和password两个属性就可以了,但是在我们提交的时候,会存在一个密码确认,但是这个动作对user是没有作用(但是会随着请求传输进来),因此我们可以使用DTO将没用的去掉,将剩下的数据生成一个新的user对象。
3.方法3
继承ActionSupport,继承ModelDriven接口。
public class ActionPerson2 extends ActionSupport implements ModelDriven<Person>{
private static final long serialVersionUID = 5086918296805304332L;
private Person person = new Person();
public Person getModel() {
return person;
}
public String getInfo(){
System.out.println("name====="+person.getName());
System.out.println("age======"+person.getAge());
return SUCCESS;
}
}
加入泛型只是为了避免强制转换。实现ModelDriven接口只是要实现getModel抽象方法,因为该方法会返回泛型中的对象。
在请求端,使用第一次那种请求,
localhost:8888/struts/person.action?name=tom&age=22
请求的参数使用的实体类的属性值,这样,就简单地完成了请求的目的。