在Struts2中,Action并没有直接和ServletAPI进行解耦合,不能传递参数,也就是说在Strusts2下是不能直接访问Servlet的API的。但是我们在实际的实现业务逻辑时,要经常访问Servlet对象,如Session,request和application
在Seruts2中,访问Servlet API 有三种方法
通过ActionContext类访问 — 完全解耦合方式
actionContext类访问Servlet API 执行所需要的所有对象,包括parameters,request,session。application
等
方法声明 | 功能描述 |
---|---|
void put(String key,Object value) | 将key-value 键值对放入ActionContext 中,模拟Servlet API 中的HttpServlet Request的setAttribute()方法 |
Object get(String key ) | 通过参数key来查找当前ActionContext中的值 |
Map<String , Object > | 返回一个application 级的Map对象 |
static ActionContext getContext() | 获取当前线程的ActionContext对象 |
Map<String,Object> getParameters() | 返回一个包含所有HttpServletRequest参数信息的Map对象 |
Map<String,Object> getSession() | 返回一个Map类型的HttpSession对象 |
void setApplication(Map<String,Object> application) | 设置Application |
void setSession (Map<String,Object> session ) | 设置一个Map类型的Session值 |
如何使用举例
//接收数据
Action context = ActionContext.getContext();
Map<String ,Object> map = context.getParameters();
//数据插入
ActionContext context = ActionContext.getContext();
context.put("name","java");//request对象的setAttribute()方法
context.getApplication().put("name","java");//Application对象
context.getSession().put("name","java");//
注意通过ActionContext拿到的不是该对象而是对象的Map值 所以对象的方法都是Map的方法
使用Servlet的API的原生方式
为了直接访问Servlet API ,Struts2框架还提供了ServletActionContext类,该类的几个常用的静态方法:
- static HttpServletRequest.getRequest() : 获得Web应用的HttpServletRequest对象
- static HttpServletResponse():获得Web应用的HttpServletResponse对象
- static ServletContext getServletContext():获得web应用的ServletContext对象
- static PageContext getPageContext():获得Web应用的PageContext对象
实例
//获取数据
HttpServletRequest request = ServletActionContext.getRequest();
Map<String,String[]> map = request.getParameterMap();
//保存数据
request.setAttribute("name","value");
request.getSession.setAttribute("name","value");
ServletActionContext.getServletContext().setAttribute("name","value");
通过接口注入的方式
- Servlet 是单例的,多个程序访问同一个Servlet只会创建一个Servlet的实例。Action是多例的,一次请求,创建一个Action的实例(不会出现线程安全的问题)。