第一种:与servlet耦合,我们知道struts2是无侵入式的设计的,体现在POJO,本质是Java简单对象,类本身是由一些private属性和关于属性的get/set方法组成,本身没有业务逻辑代码,而且看不到struts2的影子,所以struts又叫做无侵入式的设计。
与servlet耦合的方式,推荐使用
HttpServletRequest request = ServletActionContext.getRequest();
String userName = request.getAttribute("userName").toString();
String passWord = request.getAttribute("passWord").toString();
System.out.println(userName+":"+passWord);
return "SUCCESS";
//这里面的getAttribute是动作类中的属性,而属性中的值存的是页面中的值!
第二种:也是与servlet耦合,但是使用的是map方式,此方式与httpServlet不通用,也就是说与request.getAttribute不通用
a动作类chain转发到b动作类
a中设置request中数据与map 中:
ActionContext request = ActionContext.getContext();
request.put("userName_c", userName);
request.put("passWord_c", passWord);
Map<String,Object> session = request.getSession();
Map<String,Object> appMap = request.getApplication();
return "SUCCESS";
b中拿数据:
ActionContext request = ActionContext.getContext();
String userName = request.get("userName_c").toString();
String passWord = request.get("passWord_c").toString();
Map<String,Object> session = request.getSession();
System.out.println(userName+":"+passWord);
return "SUCCESS";
核心是使用Struts2核心类库提供的ActionContext拿到web容器request对象
第三种:继承ActionSupport类,实现RequestAware接口
a动作类中配置
成员数据变量:private Map<String,Object> request;
return 静态常量 大写对应小写 比如SUCCESS==>success
实现接口方法:@Override
public void setRequest(Map<String, Object> arg0) {
this.request =arg0;
}
存值:
request.put("userName_d", userName);
request.put("passWord_d", passWord);
return SUCCESS;
b动作类取值,实现接口,老三样
private Map<String,Object> request;
@Override
public void setRequest(Map<String, Object> arg0) {
this.request=arg0;
}
String u = request.get("userName_d").toString();
String p = request.get("passWord_d").toString();
request.put("a", "123");
System.out.println(u+p);
return "SUCCESS";
核心是使用struts2提供的接口,在访问动作类(或者结果视图)之前,采取注入的方式,设置web容器对象;比如说在动作类映射,去配置文件生成动作类代理类之后
进入struts拦截器,这个拦截器也实现了RequestAware接口,他会判断该动作类是否是该接口衍生类的实例,是的话,拦截请取到http请求对象,并将动作类向上转型成 接口类型,调用setRequest方法而动作类也实现了这个方法,Java对于向上转型的实例调用接口方法的方式是动态绑定的,所以实际调用的是我们动作了哦实现的方 法,这样把拦截器取得的request容器对象,传过来,再写一个this.request=argo赋值给动作类容器。体现了struts注入的思想!!
第四种:实现ServletRequestAware, ServletContextAware, ServletResponseAware并不一定要全部实现,这里是4个内置对象的所有接口
a动作类:
private HttpServletRequest request;
private ServletContext application;
private HttpServletResponse response;
@Override
public void setServletContext(ServletContext arg0) {
this.application = arg0;
}
@Override
public void setServletRequest(HttpServletRequest arg0) {
this.request = arg0;
}
request.setAttribute("userName_e", userName);
request.setAttribute("passWord_e", passWord);
return SUCCESS;
b动作类
private HttpServletRequest request;
@Override
public void setServletRequest(HttpServletRequest arg0) {
this.request = arg0;
}
String u = request.getAttribute("userName_e").toString();
String p = request.getAttribute("passWord_e").toString();
System.out.println(u+p);
return "SUCCESS";
需要哪一个实现哪一个,其核心思想也是依赖注入,通过struts2内部的类来实现web容器的传递,存取