您的位置:首页 > 编程语言 > Java开发

Struts2在Action中访问WEB资源

2015-11-17 23:29 225 查看

什么是WEB资源?

这里所说的WEB资源是指:HttpServletRequest, HttpSession, ServletContext 等原生的 Servlet API。

为什么需要访问WEB资源?

B/S 的应用的 Controller 中必然需要访问 WEB 资源: 向域对象中读写属性, 读写 Cookie等等操作均需要用到上述原生的ServletAPI

访问方法

和 Servlet API 解耦的方式:

只能访问有限的 Servlet API 对象, 且只能访问其有限的方法(读取请求参数, 读写域对象的属性, 使 session 失效...).

> 使用 ActionContext

使用示例:

public class ActionTest {

@SuppressWarnings("unchecked")
public String execute() {
// 0、获取ActionContext对象
// ActionContext是Action的上下文,可以从中获取到当前Action需要的相关信息
ActionContext context = ActionContext.getContext();

// 1、获取application域对应的Map对象
// 通过调用上下文对象context的getApplication()方法获取
Map<String, Object> applicationMap = context.getApplication();
applicationMap.put("applicationKey", "applicationValue");

// 2、session
Map<String, Object> sessionMap = context.getSession();
sessionMap.put("sessionKey", "sessionValue");

// 3、request
// ActionContext中并没有提供获取getRequest方法来获取requestMap的方法
// 而是需要调用get方法,并且传入‘request’字符串作为参数来获取
Map<String, Object> requestMap = (Map<String, Object>) context.get("request");
requestMap.put("requestKey", "requestValue");

// 4、获取请求参数对应的map
// 键:请求参数名,值:请求参数的值对应的字符串数组
Map<String, Object> parameters = context.getParameters();
System.out.println(((String[]) parameters.get("name"))[0]);
return null;
}

}  

> 实现 XxxAware 接口

使用示例:

public class ActionAwareTest implements ApplicationAware, SessionAware, RequestAware, ParameterAware {

private Map<String, Object> applicationMap;

private Map<String, Object> sessionMap;

private Map<String, Object> requestMap;

private Map<String, String[]> parameters;

@Override
public void setApplication(Map<String, Object> map) {
this.applicationMap = map;
}

@Override
public void setSession(Map<String, Object> map) {
this.sessionMap = map;
}

@Override
public void setRequest(Map<String, Object> map) {
this.requestMap = map;

}

@Override
public void setParameters(Map<String, String[]> map) {
this.parameters = map;

}

public String execute() {
return null;

}

}


> 选用的建议:

若一个 Action 类中有多个 action 方法, 且多个方法都需要使用域对象的 Map 或 parameters, 则建议使用 Aware 接口的方式

session 对应的 Map 实际上是 SessionMap 类型的! 强转后若调用其 invalidate() 方法, 可以使其 session 失效!

和 Servlet API 耦合的方式:

可以访问更多的 Servlet API 对象, 且可以调用其原生的方法.

> 使用 ServletActionContext

获取方法:

/**
* ServletActionContext 可以从中获取到一切Servlet API相关的方法
* @author Administrator
*
*/
public class ServletActionContextTest {

public String execute(){
//获取原生request对象
HttpServletRequest request=ServletActionContext.getRequest();
//获取原生session对象
HttpSession session=request.getSession();
//获取原生application对象
ServletContext  application=ServletActionContext.getServletContext();

return null;
}
}


> 实现 ServletXxxAware 接口.

获取方法:

/**
* 通过实现ServletXxxAware接口的方式由Struts2负责注入相关对象
* ServletRequestAware:用来注入request对象
* ServletContextAware:用来注入application对象
* @author Administrator
*
*/
public class ServletAwareActionTest implements ServletRequestAware, ServletContextAware {

private HttpServletRequest request;

private ServletContext application;

private HttpSession session;

@Override
public void setServletContext(ServletContext servletContext) {
this.application = servletContext;

}

@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
this.session = request.getSession();
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: