什么是web资源?
web资源指的是HttpServletRequest、HttpSession、ServletContext等原生的Servlet API。
如何访问web资源
- 和Servlet API解耦的方式:只能访问到有限的Servlet API对象,且只能访问其有限的方法。
- 通过ActionContext方法
- 实现XxxAware接口
- 和Servlet API耦合的方式:可以访问更多的Servlet API对象,且能访问其原声的方法。
- 通过ServletActionContext方法
- 实现ServletXxxAware 接口
通过ActionContext访问web资源
下面举的例子是以ActionContextest为Action类,input.jsp为显示页面,访问URL为:
".../input?otherParam=otherParamValue"
ActionContextest代码示例
package com.actiontest;
import java.util.Map;
import com.opensymphony.xwork2.ActionContext;
public class ActionContextest {
public ActionContextest() { }
public String execute(){
ActionContext actionContext = ActionContext.getContext();
/*
* 通过getApplication方法获取Application对象的Map对象。
*/
Map<String, Object> applicationMap = actionContext.getApplication();
/*
* 通过put方法可以向application域中传入参数
*/
applicationMap.put("name", "icebear");
/*
* 通过get方法可以获取参数
*/
String name = (String)applicationMap.get("name");
System.out.println("name:" + name);
/*
* 通过getSession方法获取Session对象的Map对象。
*/
Map<String, Object> sessionMap = actionContext.getSession();
/*
* 通过put方法可以向session域中传入参数
*/
sessionMap.put("age", 11);
/*
* 通过get方法可以获取参数
*/
int age = (Integer)sessionMap.get("age");
System.out.println("age:" + age);
/*
* request的Map对象直接通过get方法传递request参数获取。
*/
@SuppressWarnings("unchecked")
Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");
/*
* 通过put方法传递参数
*/
requestMap.put("sex", "male");
/*
* 通过get方法获取参数
*/
String sex = (String)requestMap.get("sex");
System.out.println("sex:" + sex);
/*
* parameter的Map对象通过getParameters方法获取 。
*/
Map<String, Object> paramsMap = actionContext.getParameters();
/*
* 可以通过put方法传入参数,但是该参数无法在转发的时候转发到另一个页面,即在jsp页面中无法通过
* EL表达式获取该参数,所以实际上该方法没什么用。
*/
paramsMap.put("param", "paramValue");
/*
* 可以通过get方法获取参数,其中param是上面的参数,而otherParam是URL传递过来的参数。
* 通过URL传递的参数可以在转发的jsp页面中通过EL表达式获取到。
*/
Object param = paramsMap.get("param");
Object otherParam = paramsMap.get("otherParam");
System.out.println("param:" + param);
/*
* 要注意的是,通过URL传递的参数可以是多个,所以实际上是一个数组对象。
*/
System.out.println("OtherParam:" + ((String[])otherParam)[0]);
return "success";
}
}
效果如下:
通过实现XxxAware接口访问web资源
下面例子的action类为ActionTestAware,显示页面为MyJsp.jsp,URL为:
.../MyJsp.jsp?param=thisisparam
代码示例:
package com.actiontest;
import java.util.Map;
import org.apache.struts2.interceptor.ApplicationAware;
import org.apache.struts2.interceptor.ParameterAware;
import org.apache.struts2.interceptor.RequestAware;
import org.apache.struts2.interceptor.SessionAware;
public class ActionTestAware implements ApplicationAware, SessionAware, RequestAware, ParameterAware{
public String execute(){
/*
* 通过实现XxxAware接口的方式比较简单,步骤如下:
*
* 1. 让action类实现ApplicationAware、SessionAware、RequestAware、ParameterAware接口
*
* 2. 定义相应的成员变量,application、session、request、parameter,类型都为Map。
*
* 3. 重写setApplication、setSession、setRequest、setParameter方法。
*
* 4.之后在方法里面就可以直接调用这些对象了。
*
*/
application.put("name", "ice_bear");
System.out.println("name:" + application.get("name"));
session.put("age", 12);
System.out.println("age:" + session.get("age"));
request.put("sex", "female");
System.out.println("sex:" + request.get("sex"));
System.out.println("parameter:" + parameter.get("param")[0]);
return "success";
}
private Map<String, Object> application;
private Map<String, Object> session;
private Map<String, Object> request;
private Map<String, String[]> parameter;
@Override
public void setParameters(Map<String, String[]> parameter) {
this.parameter = parameter;
}
@Override
public void setRequest(Map<String, Object> request) {
this.request = request;
}
@Override
public void setSession(Map<String, Object> session) {
this.session = session;
}
@Override
public void setApplication(Map<String, Object> application) {
this.application = application;
}
}
效果如下:
PS:需要提一下的是,在声明对象的时候不能给对象任何值,空值也不行,不然struct2实例化的对象会被覆盖掉。
PS:这里实际上是structs2帮我们调用setXxx方法。
ActionContext VS XxxAware
两个方式相比,我更倾向于用实现XxxAware接口的方式来访问web资源,因为使用ActionContext对象访问意味着你每创建一个方法就要实例化一个ActionContext类对象,然后再用这个类对象去实例化响应的域对象。然而用实现XxxAware的方法当你一次创建对象之后都可以使用,更能体现java对象复用的思想。
通过ServletActionContext访问
具体使用方法和上面一样所以这里只贴出相关的创建对象的方法:
代码示例
public class TestActionContext {
public String execute(){
//创建HttpServletRequest对象
HttpServletRequest request = ServletActionContext.getRequest();
//创建HttpSession对象
HttpSession session = request.getSession();
//创建ServletContext对象
ServletContext servletContext = ServletActionContext.getServletContext();
return "succes";
}
}
通过ServletXxxAware方法访问
代码示例
public class TestServletActionAware implements ServletResponseAware, ServletContextAware, ServletRequestAware{
public String execute(){
System.out.println(request.getClass());
System.out.println(response.toString());
System.out.println(servletContext.getClass());
return "success";
}
private ServletRequest request;
private ServletContext servletContext;
private ServletResponse response;
@Override
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
@Override
public void setServletContext(ServletContext servletContext) {
this.servletContext = servletContext;
}
@Override
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
}