Struts 2提供了Aware接口。Aware为"感知"的意思,实现了相关Aware接口的Action能够感知相应的资源。Struts在实例化一个Action实例时,如果发现它实现了相应的Aware接口,会把相应的资源通过Aware接口方法注射进去。这种方式也可以叫做注射方式(IoC方式)。
Servlet API中常用对象application、request、response、Session对应的Aware接口分别为ServletContextAware、ServletRequestAware、ServletResponseAware、SessionAware。例如,下面的Action实现了这4种接口,能够感知到这些对象。代码如下:
package com.helloweenvsfei.struts2.action;
import org.apache.struts2.interceptor.ServletRequestAware;
import org.apache.struts2.interceptor.ServletResponseAware;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;
public class ServletAwareAction extends ActionSupport implements
ServletRequestAware, ServletResponseAware,
SessionAware, Servlet ContextAware {
private ServletContext application; // Servlet上下文
private HttpServletRequest request; // request对象
private HttpServletResponse response; // response对象
private Map session; // session对象
public void setServletRequest(HttpServletRequest request) {
// request的setter方法
this.request = request;
}
public void setServletResponse(HttpServletResponse response) {
// request的setter方法
this.response = response;
}
public void setSession(Map sessionValues) { //
session的setter方法
this.session = sessionValues;
}
public void setServletContext(ServletContext application) {
//
servletContext的setter方法
this.application = application;
}
public String execute() { // 主方法
String upload = application.getRealPath("upload");
// 使用application
request.getRemoteAddr(); // 使用request
response.getContentType(); // 使用response
session.get("account"); // 使用Session
return Action.SUCCESS;
}
} 实现了ServletRequestAware接口便会有一个setServletRequest()方法获取request对象。实现了ServletResponseAware接口便会有一个setServletResponse()方法获取response对象。不同的是SessionAware接口的setter方法是setSession()方法的参数是Map类型。该Map代表Session内存储的各种数据。
Aware接口其实是一种拦截器,拦截器代码会在执行Action之前执行,将相关的Servlet对象设置进来
Spring aware相关接口