目录
ActionContext类(建议使用,与Servlet API解耦)
static HttpServletRequest getRequest
static HttpServletResponse getResponse
static ServletContext getServletContext
static PageContext getPageContext
访问Servlet的API
如果表单中有参数如何进行接收,又或者我们需要向页面保存一些数据,又要如何完成?
在Struts2中,Action并没有直接和Servlet API进行耦合,也就是说在Struts2中的Action不能直接访问Servlet API。虽然,Struts2中的Action访问Servlet API麻烦一些,但是这却是Struts2中Action的重要改良之一,方便Action进行单元测试。
尽管Action和Servlet API解耦会带来很多好处,然而在Action中完全不访问Servlet API几乎是不可能的,在实现业务逻辑时,经常要访问Servlet中对象,如session、request、和application等,在Struts2中访问Servlet API有三种方法,ActionContext类、ServletActionContext类、实现XxxAware接口。
其实三者本质上都是通过,ActionContext类完成的。
-
ActionContext类(建议使用,与Servlet API解耦)
Struts2框架提供了ActionContext类来访问Servlet API,ActionContext是Action执行的上下文对象,在ActionContext中保存了Action执行所需要的所有对象,包括parameters、request、session、application等
Struts2中不推荐使用原生request域,ActionContext和request生命创建周期一样,可以直接将数据存储到ActionContext的map中
访问Servlet API常用方法
方法声明 | 功能描述 |
static ActionContext getContext() | 返回当前线程的ActionContext对象 |
Object get(String key) | 通过参数key来查找当前ActionContext中的值 |
Map<String,Object> getApplication() | 返回一个Application级的Map对象 |
Map<String,Object> getParameters() | 返回一个包含所有HttpServletRequest参数信息的Map对象 |
Map<String,Object> getSession() | 返回一个Map类型的HttpSession对象 |
void put(String key,Object value) | 将key-value键值对放入ActionContext中,模拟Servlet API中的HTTPServletRequest的setAttribute()方法 |
void setApplicationMap<String,Object>application) | 设置Application上下文 |
void setSession(Map<String,Object>application) | 设置一个Map类型的Session值 |
public class HelloAction extends ActionSupport{
private static final long serialVersionUID = 1L;
public String Demo() throws Exception {
/*
* request域
* 不推荐使用原生request域存储数据
* 推荐将需要存储到request域中的数据,直接放到ActionContext中
*/
ActionContext context = ActionContext.getContext();
// Map<String, Object> requestScope = (Map<String, Object>) context.get("request");
context.put("name", "mark");
/*
* session域
*/
Map<String, Object> sessionScope = context.getSession();
sessionScope.put("age", 15);
/*
* application域
*/
Map<String, Object> applicationScope = context.getApplication();
applicationScope.put("tele", 15264);
return "success";
}
}
-
ServletActionContext类
为了直接访问Servlet API,Struts2框架还提供了ServletActionContext类,该类中几个常用静态方法如下
static HttpServletRequest getRequest
获得Web应用程序的HttpServletRequest对象
static HttpServletResponse getResponse
获得Web应用程序的HttpServletResponse对象
static ServletContext getServletContext
获得Web应用程序的ServletContext 对象
static PageContext getPageContext
获得Web应用程序的PageContext对象
public class HelloAction extends ActionSupport{
private static final long serialVersionUID = 1L;
public String Demo() throws Exception {
//原生Request
HttpServletRequest request = ServletActionContext.getRequest();
//原生Session
HttpSession session = request.getSession();
//原生Response
HttpServletResponse response = ServletActionContext.getResponse();
//原生ServletContext
ServletContext servletContext = ServletActionContext.getServletContext();
return "success";
}
}
-
XxxAware接口
Struts2框架提供了ActionContext类来访问Servlet API,虽然这种方法可以访问Servlet API,但是无法直接获得Servlet API实例,为了在Action中直接访问Servlet API,Struts2还提供了一系列接口
ServletContextAware
实现该接口的Action可以直接访问Web应用的ServletContext实例
ServletRequestAware
实现该接口的Action可以直接访问Web应用的HttpServletRequest实例
ServletResponseAware
实现该接口的Action可以直接访问Web应用的HttpServletResponset实例
SessionAware
实现该接口的Action可以直接访问Web应用的HttpSession实例
public class HelloAction extends ActionSupport implements ServletRequestAware{
private static final long serialVersionUID = 1L;
private HttpServletRequest request;
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}