获取Web资源(HttpServletRequest、HttpSession、ServletContext)
1 与 Servlet API 解耦的访问方式
1)通过 ActionContext 访问 Web 资源
//0. 获取 ActionContext 对象//ActionContext 是 Action 的上下文对象. 可以从中获取到当往 Action 需要的一切信息ActionContext actionContext = ActionContext.getContext();
//1. 获取 application 对应的 Map, 并向其中添加一个属性//通过调用 ActionContext 对象的 getApplication() 方法来获取 application 对象的 Map 对象Map<String, Object> applicationMap = actionContext.getApplication();//设置属性applicationMap.put("applicationKey", "applicationValue");//获取属性Object date = applicationMap.get("date");
//2. sessionMap<String, Object> sessionMap = actionContext.getSession();//设置属性sessionMap.put("sessionKey", "sessionValue");if(sessionMap instanceof SessionMap){
SessionMap sm = (SessionMap) sessionMap;sm.invalidate();System.out.println("session 失效了. ");
}
//3. request*//ActionContext 中并没有提供 getRequest 方法来获取 request 对应的 Map,需要手工调用 get() 方法, 传入 request 字符串来获取.Map<String, Object> requestMap = (Map<String, Object>) actionContext.get("request");requestMap.put("requestKey", "requestValue");
//4. 获取请求参数对应的 Map, 并获取指定的参数值. 值: 请求参数的值对应的字符串数组//注意: parameters 这个 Map 只能读, 不能写入数据, 如果写入, 但不出错, 但也不起作用!Map<String, Object> parameters = actionContext.getParameters();String[] arrName = (String[]) parameterMap.get("name");
2)通过Aware访问web资源
public class TestAwareAction implements ApplicationAware, SessionAware, RequestAware, ParameterAware{
public String execute(){
application.put("applicationKey2", "applicationValue2");application.get("date");return "success";
}private Map<String, Object> application;private Map<String, Object> session;private Map<String, Object> request;private Map<String, String[]> parameters;public void setApplication(Map<String, Object> application) {
this.application = application;
}
public void setSession(Map<String, Object> session) {
this.session = session;
}
public void setRequest(Map<String, Object> request) {
this.request = request;
}
public void setParameters(Map<String, String[]> parameters) {
this.parameters = parameters;
}
}
2 与 Servlet API 耦合的访问方式
1)通过ServletActionContext获取web资源
HttpServletRequest request = ServletActionContext.getRequest();HttpSession session = ServletActionContext.getRequest().getSession();ServletContext application = ServletActionContext.getServletContext();
2)通过ServletAware获取web资源
public class TestServletAwareAction implements ServletContextAware, ServletRequestAware,ServletResponseAware
3 练习
>用户登录时,将userName保存在session中,在线用户数+1
>用户登出时,session失效,在线用户数-1
获取session信息,通过实现SessionAware;
获取application信息,通过实现ApplicationAware;
获取登录信息,通过在Action中增加Setter方法
package iThings.com.first; import java.util.Map; import org.apache.struts2.dispatcher.SessionMap; import org.apache.struts2.interceptor.ApplicationAware; import org.apache.struts2.interceptor.SessionAware; /* * 获取session信息,通过实现SessionAware; * 获取application信息,通过实现ApplicationAware; */ public class UserAction implements SessionAware,ApplicationAware { //登录名 private String userName; public String getUserName() { return userName; } public void setUserName(String userName) { this.userName = userName; } private Map<String, Object> session; private Map<String, Object> application; public void setSession(Map<String, Object> session) { this.session = session; } public void setApplication(Map<String, Object> application) { this.application = application; } public UserAction(){ System.out.println("UserAction constructor ....."); } /* * 用户登录 */ public String execute(){ //将获取到的userName保存到session中 session.put("userName", userName); //获取application中的在线用户数,加一 Integer count = (Integer)application.get("count"); if(count == null){ count = 0; } count++; application.put("count", count); return "success"; } /* * 登出 */ public String userLogout(){ //session失效 ((SessionMap)session).invalidate(); session.put("userName", userName); //在线用户数-1 Integer count = (Integer)application.get("count"); if(count != null && count>0){ count --; } application.put("count", count); return "toLogin"; } }