Struts之三 获取web资源

获取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. session
Map<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";
	}
	
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值