strus2中获取表单数据 两种方式 属性驱动 和模型驱动
属性驱动
/**
* 当前请求的action在栈顶,ss是栈顶的元素,所以可以利用setValue方法赋值
* 如果一个属性在对象栈,在页面上可以根据name属性进行回显
*/
/**
* 属性驱动实现的条件:
* 1、当前请求的action在栈顶,所以action中的属性就暴漏出来了
* 2、获取页面上表单的元素,整合成一个map
* 3、调用setValue方法赋值
*/
package cn.itcast.struts2.sh; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor;
import com.opensymphony.xwork2.interceptor.ParametersInterceptor;
import com.opensymphony.xwork2.util.ValueStack; public class UserAction { private String ss;
public String getSs() {
return ss;
}
public void setSs(String ss) {
this.ss = ss;
}
public String setValue(){
ValueStack valueStack = ActionContext.getContext().getValueStack();
/**
* 当前请求的action在栈顶,ss是栈顶的元素,所以可以利用setValue方法赋值
* 如果一个属性在对象栈,在页面上可以根据name属性进行回显
*/ /**
* 属性驱动实现的条件:
* 1、当前请求的action在栈顶,所以action中的属性就暴漏出来了
* 2、获取页面上表单的元素,整合成一个map
* 3、调用setValue方法赋值
*/
//或者直接给ss赋值,因为当前action会放到StackValue栈顶所以可以取相关的里面的数据
valueStack.setValue("ss", "ss");
List<User> userList = new ArrayList<User>();
List<List<User>> users = new ArrayList<List<User>>();
User user = new User();
user.setUid(1L);
user.setUname("aaa");
userList.add(user);
users.add(userList);
ActionContext.getContext().put("users", users); Map<String, List<User>> map = new HashMap<String, List<User>>();
map.put("userList", userList);
ActionContext.getContext().put("map", map);
return "index";
}
}
当 action中的与表单交互的基本数据项非常多的时候,在一个action中写很多基本元素显得代码非常臃肿,所以建立了一个Javaben 专门用于放基本数据,然后通过模型驱动的形式和页面进行交互,放在StackValue堆栈中
内部原理是用到一个模型驱动的拦截器ModelDrivenInterceptor类中的intercept方法 然后装载数据到自己写的javaben
然后会把 UserAction和 User都放到栈顶StackValue 中的
代码:自己定义的javaben
package cn.itcast.struts2.sh; public class User {
private Long uid;
private String uname;
public Long getUid() {
return uid;
}
public void setUid(Long uid) {
this.uid = uid;
}
public String getUname() {
return uname;
}
public void setUname(String uname) {
this.uname = uname;
}
}
action中装载这个javabean
package cn.itcast.struts2.sh; import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ModelDriven;
import com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor;
import com.opensymphony.xwork2.interceptor.ParametersInterceptor;
import com.opensymphony.xwork2.util.ValueStack; 15 public class UserAction implements ModelDriven<User>{
16
17 private User model = new User();
18
19 public User getModel() {
20 // TODO Auto-generated method stub
21 return this.model;
22 } private String ss;
public String getSs() {
return ss;
}
public void setSs(String ss) {
this.ss = ss;
}
public String setValue(){
ValueStack valueStack = ActionContext.getContext().getValueStack();
/**
* 当前请求的action在栈顶,ss是栈顶的元素,所以可以利用setValue方法赋值
* 如果一个属性在对象栈,在页面上可以根据name属性进行回显
*/ /**
* 属性驱动实现的条件:
* 1、当前请求的action在栈顶,所以action中的属性就暴漏出来了
* 2、获取页面上表单的元素,整合成一个map
* 3、调用setValue方法赋值
*/
valueStack.setValue("ss", "ss");
List<User> userList = new ArrayList<User>();
List<List<User>> users = new ArrayList<List<User>>();
User user = new User();
user.setUid(1L);
user.setUname("aaa");
userList.add(user);
users.add(userList);
ActionContext.getContext().put("users", users); Map<String, List<User>> map = new HashMap<String, List<User>>();
map.put("userList", userList);
ActionContext.getContext().put("map", map);
return "index";
}
}