访问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类完成的。
1.完全解耦合(ActionContext类,建议使用)
Struts2框架提供了ActionContext类来访问Servlet API,ActionContext是Action执行的上下文对象,在ActionContext中保存了Action执行所需要的所有对象,包括parameters、request、session、application等。
Struts2中不推荐使用原生request域,ActionContext和request生命创建周期一样,可以直接将数据存储到ActionContext的map中,ActionContext类中访问Servlet API常用方法如下
注意:这种方式只能获得代表request、session、application的数据的Map集合,不能操作这些对象的本身的方法。
方法声明 | 功能描述 |
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{
public String Demo() throws Exception {
ActionContext context = ActionContext.getContext();
/* 原生request域,不推荐*/
//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";
}
}
2.使用Servlet的API的原生方式(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{
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";
}
}
3.接口注入方式(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 HttpServletRequest request;
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
}