struts2值的传递与接收总结

struts2的传值与接收(Servlet API解耦的访问方式)

为了避免与Servlet API耦合在一起,方便Action类做单元测试,
 Struts2对HttpServletRequest、HttpSession和ServletContext进行了封装,
 构造了三个Map对象来替代这三种对象.

1.ActionContext方式

简述:  ActionContext是Action的上下文,Struts2自动在其中保存了一些在Action执行过程中所需的对象,比如application,session, request,parameters,等。Struts2会根据每个执行HTTP请求的线程来创建对应的ActionContext,即一个线程有一个唯一的ActionContext,使用者可以使用静态方法ActionContext.getContext()来获取当前线程的ActionContext。
统一共用方法:ActionContext actionContext=ActionContext.getContext();//获取对象ActionContext
(1).获取application对应的Map,并向其中加一个添加一个属性:
通过调用ActionContext对象getApplication
Map<String, Object> applicationMap=actionContext.getApplication();
添加属性:
applicationMap.put("applicationKey","applicationValue");//此为Map的键值对
在jsp等请求页面获取值方法:用EL表达式:
${applicationScope.applicationKey} 或者直接写 ${applicationKey}
获取请求页面的属性值:
Objectobject=applicationMap.get("XX");//xx为请求页面的属性
(2).session方式:(与applicationMap方式有异曲同工之妙)
通过调用ActionContext对象getSession
Map<String, Object> sessionMap=actionContext.getSession();   
添加属性:
sessionMap.put("sessionKey", "sessionValue");
(3)request方式:
ActionContext中并没有提供getRequest
需要手工调用get()方法,传入request字符串来获取

Map<String, Object> requestMap=(Map<String, Object>) actionContext.get("request");

requestMap.put("requestKey", "requestValue");

(4)paramters方式:
需要注意的是:
A:paramtersMap的只能读不能写,如果写了不会出错,但也不起作用
B:getParameters的返回值为在map<String,object>,而不是Map<string,String[]>
获取请求参数:
Map<String,Object> parameters=actionContext.getParameters();
Object object=parameters.get("XX");

2.实现AwareAction接口的方式:

简述: struts2提供了这四个Aware接口用于Action类的实现,从而注入对应的application、request、session,parameter,
不过它们都是Map类型的。这和ActionContext一样是解耦的,即没有引入servlet相关的包,是在struts2内部的。
(1)ApplicationAware接口
实现接口方法:
private Map<String,Object> application;
@Override
public void setApplication(Map<String, Object> application) {
this.application=application;
}
操作:
//1.向application中加入一个属性:applicationKey-applicationValue
application.put("applicationKey", "applicationValue");
//2.从
请求页面 application中读取一个属性date,并打印
请求页面
application.setAttribute("date", new Date());
Action接受:appliation.get("date");
对于1的操作的前台接收数据通过EL表达式可以接收:

 ${applicationScope.applicationKey }或者直接的  ${applicationKey}、

(2).SessionAware,RequestAware(与ApplicationAware实现方式雷同)
A: SessionAware
private Map<String,Object> session;
@Override
public void setSession(Map<String, Object> session) {
this.session=session;
}

B:RequestAware
private Map<String, Object> request;
@Override
public void setRequest(Map<String, Object> request) {
this.request=request;

}

RequestAware和SessionAware的传值都是用Map中的put方法(参考ApplicationAware)
传前台接收值的方式同样的EL表达式
(3).ParameterAware
private Map<String,String[]> parameters;
@Override
public void setParameters(Map<String, String[]> parameters) {
this.parameters=parameters;
}
同样的需要注意:
A: ParameterAware方式只能接受,不能put
B:Map类型是 Map<String,String[]>
C:接受请求数据:
parameters.get("name");//这样打印出的是:[Ljava.lang.String;@2c0a8c7a
所以得这样接收请求:(parameters.get("name"))[i] 因为parameters是String[]数组形式。



猜你喜欢

转载自blog.csdn.net/Hello_Java2018/article/details/78109650