Struts2在Action中访问WEB资源

时间:2022-08-03 13:40:15

什么是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();
	}

}