第一种 :Action 本身作为model对象,通过成员setter封装 (属性驱动 )
第一种方式:
username:
password:
public class MyAction1 extendsActionSupport{privateString username;privateString password;public voidsetUsername(String username) {this.username =username;
}public voidsetPassword(String password) {this.password =password;
}public String execute() throwsException {
System.out.println(username+" "+password);return null;
}
}
问题: Action封装数据,会不会有线程问题 ?
struts2 Action 是多实例 ,为了在Action封装数据 (struts1 Action 是单例的 )
缺点:需要单独定义javaBean,将action中属性copy到javaBean中。
优点:简单。
第二种 :创建独立model对象,页面通过ognl表达式封装 (属性驱动)
第二种方式:
username:
password:
public class MyAction2 extendsActionSupport{privateUser user;public voidsetUser(User user) {this.user =user;
}public User getUser() {//不写这个密码获取不到?不懂..希望知道的人留言告知,感谢
returnuser;
}public String execute() throwsException {
System.out.println(user.getUsername()+" "+user.getPassword());return null;
}
}
问题: 谁来完成的参数封装
优点:简单,解决了第一种封装的问题
缺点:在页面上使用了ognl表达式,页面不通用了
第三种 :使用ModelDriven接口,对请求数据进行封装 (模型驱动 ) ----- 主流,最常用
第三种方式:
username:
password:
public class MyAction3 extends ActionSupport implements ModelDriven{private User user=newUser();public String execute() throwsException {
System.out.println(user.getUsername()+" "+user.getPassword());return null;
}
@OverridepublicUser getModel() {returnuser;
}
}
优点:解决了属性驱动存在的问题
缺点:一次只能封装一个model对象.
struts2 有很多围绕模型驱动的特性
为模型驱动提供了更多特性
对比第二种、第三种 : 第三种只能在Action中指定一个model对象,第二种可以在Action中定义多个model对象
1 public class StrutsFilter implementsFilter {2
3 public void init(FilterConfig filterConfig) throwsServletException {}4 public voiddoFilter(ServletRequest req, ServletResponse resp,5 FilterChain chain) throwsIOException, ServletException {6 //1.强转
7 HttpServletRequest request =(HttpServletRequest) req;8 HttpServletResponse response =(HttpServletResponse) resp;9 //2.操作10 //2.1 得到请求资源路径
11 String uri =request.getRequestURI();12 String contextPath =request.getContextPath();13 String path = uri.substring(contextPath.length() + 1);14 //2.2 使用path去struts.xml文件中查找某一个这个标签
15 SAXReader reader = newSAXReader();16 try{17 //得到struts.xml文件的document对象。
18 Document document = reader.read(new File(this.getClass().getResource("/struts.xml").getPath()));19 Element actionElement =(Element) document20 .selectSingleNode("//action[@name=‘" + path + "‘]"); //查找这样的标签
22 if (actionElement != null) {23 //得到标签上的class属性以及method属性
24 String className = actionElement.attributeValue("class"); //得到了action类的名称
25 String methodName = actionElement.attributeValue("method");//得到action类中的方法名称。26 //2.3通过反射,得到Class对象,得到Method对象
27 Class actionClass =Class.forName(className);28 Method method =actionClass.getDeclaredMethod(methodName);29
30
31
32 //处理请求参数封装:
33 Object actionObj =actionClass.newInstance();34 //模型驱动
35 if (actionObj instanceofMyModelDriven) {36 MyModelDriven mmd =(MyModelDriven) actionObj;37 BeanUtils.populate(mmd.getModel(),request.getParameterMap());38 } else{39 //属性驱动
40 BeanUtils.populate(actionObj, request.getParameterMap());//41 }42 //2.4 让method执行.
43 String returnValue = (String) method.invoke(actionObj); //是让action类中的方法执行,并获取方法的返回值。44
45
46
47
48 //2.549 //使用returnValue去action下查找其子元素result的name属性值,与returnValue做对比。
50 Element resultElement = actionElement.element("result");51 String nameValue = resultElement.attributeValue("name");52 if(returnValue.equals(nameValue)) {53 //2.6得到了要跳转的路径。
54 String skipPath =resultElement.getText();55 request.getRequestDispatcher(skipPath).forward(request,response);56 return;57 }58 }59 } catch(Exception e) {60 e.printStackTrace();61 }62 //3.放行
63 chain.doFilter(request, response);64 }65 public voiddestroy() {}66 }
模拟Struts2属性驱动和模型驱动
1 public interface MyModelDriven{2 publicT getModel();3 }
MyModelDriven
封装数据到Collection和Map
1) 封装数据到Collection 对象
第四种方式(list):
username:
password:
username:
password:
public class MyAction4 extendsActionSupport{private Listusers;public ListgetUsers() {returnusers;
}public void setUsers(Listusers) {this.users =users;
}public String execute() throwsException {
System.out.println(users);return null;
}
}
2) 封装数据到Map 对象
第五种方式(map):
username:
password:
username:
password:
public class MyAction5 extends ActionSupport{
private Mapusers;
public MapgetUsers() {
return users;
}
public void setUsers(Mapusers) {
this.users = users;
}
public String execute() throws Exception {
System.out.println(users);
return null;
}
}
原文:http://www.cnblogs.com/fengmingyue/p/6139451.html