java action 同名参数 处理_Action处理请求参数

第一种 :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对象

cdec0645add3fc3c328197dda5c76203.png

81178cc93a2a3bb5048d90d76e7ec935.png

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属性驱动和模型驱动

cdec0645add3fc3c328197dda5c76203.png

81178cc93a2a3bb5048d90d76e7ec935.png

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值