一、属性驱动
1.action中无实体类的属性驱动
无实体类的属性驱动,即前端页面发送到action中的数据不是action中实体类的某个属性,而是单独的,普通的变量。例如jsp页面要将一个username发送到action中:
jsp页面:
<form action="test.action" method="post">
<input type="text" name="username">
<input type="submit" value="提交">
</form>
jsp页面通过表单用post方式将数据发送到名为test的动作方法中
动作类:
@ParentPackage("struts-default")
public class testAction extends ActionSupport{
//别忘了继承ActionSupport
private String username ; //这里的变量名要与页面表单中input框的name属性值一致
//生成getter、setter方法
public String getUsername(){
return username ;
}
public void setUsername(String username){
this.username = username ;
}
//处理完毕之后跳转到result.jsp
@Action(value="test",results= {@Result(name="success",location="/result.jsp")})
public String execute(){
System.out.println(username);
return SUCCESS ;
}
}
动作类中声明变量的名称要与页面表单中该属性的名称一致,同时生成getter、setter方法
此时,struts2的值栈栈顶对象是当前执行的动作类,该username属性在这个动作类对象中,使用struts2提供的debug标签查看result.jsp中的值栈内容:
此时,在result.jsp中就可以用el表达式获取该username属性的值:
${username}
el表达式获取属性值是直接查找Property Name,从上到下依次查找,找到了第一个与el表达式中名称一样的属性就返回属性值。这里不讨论值栈中Property Name有多个同名属性的问题。
二、模型驱动——有实体类
这种方式是action使用一个实体类对象去接收前端jsp页面传来的值
要求:
1、动作方法实现**ModelDriven<实体类名称>**接口,并覆写getModel()方法。
2、同时要先定义一个用来接收数据的实体类(记得实现可序列化接口)。
3、前端jsp页面表单中的参数名称要与实体类的数据成员名称一致。
User类:
public class User implements Serializable {
private String username ;
private String password ;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
@Override
public String toString() {
return "User [username=" + username + ", password=" + password + "]";
}
}
动作类中:
public class testAction2 extends ActionSupport implements ModelDriven<User> {
//先实例化一个user对象
private User user = new User() ;
//在覆写的getMode()方法中返回这个user对象
@Override
public User getModel() {
return user;
}
}
这么一来,user对象就会被自动压入值栈中,此时的栈顶对象就是这个user对象
动作方法:
@Action(value=“test2”,results= {@Result(name=“success”,location="/result.jsp")})
public String execute() {
System.out.println(user);
return SUCCESS ;
}
前端jsp页面:
<form action="test2.action" method="post">
username:<input type="text" name="username">
password:<input type="text" name="password">
<input type="submit" value="提交">
</form>
<s:debug></s:debug>
提交后action中的user对象的username和password就有值了,同时,result.jsp中的栈顶对象是该user对象:
一样可以通过el表达式取出值:
${username}
${password}
如果前端页面的表单中只有username,而没有password,则到action中这个参数password的值就是默认值null,到值栈中也是默认值null
结语:
请求参数封装事实上是由struts2自动的调用了setter和getter方法给实体类对象或者action中的变量赋值了。
通过这两种方式从前台表单获取数据,很基础很方便很重要。事实上还有一种有实体类的属性驱动,但是个人认为用的不多,因此没有介绍。