在Action中访问Servlet API的四种方法

Struts2 框架中的Action 类没有与任何Servlet API 耦合,因此Action 类可以脱离Servlet 容器环境进行单元测试。当Action 类需要通过请求、会话或上下文存取属性时,可以通过以下四种方法实现:

一、ActionContext

修改Action类,通过ActionContext 获取请求、会话和上下文对象相关联的Map 对象来实现存取属性的功能,代码片段如下:

public class UserAction extends ActionSupport {
	//……
    private Map request,session,application;
    public String login() {
    	//获取ActionContext 对象
    	ActionContext ctx= ActionContext.getContext();
    	//通过ActionContext 对象获取请求、会话和上下文对象相关联的Map 对象
    	request=(Map) ctx.get("request");
    	session=(Map) ctx.getSession();
    	application=(Map) ctx.getApplication();
    	//访问application 范围的属性值
    	Integer counter = (Integer)application.get("counter");
    	if(counter==null)
    		counter=1;
    	else
    		counter=counter+1;
    	//设置application 范围的属性
    	application.put("counter", counter);
    	UserService userServ = new UserService();
    	if (userServ.login(loginUser)) {
    		//设置session 范围的属性
    		session.put("user", loginUser.getAccount());
    	    //设置request 范围的属性
    		request.put("tip", "您已登录成功");
    		return "success";
    	} 
    	else 
    	{
    		return "fail";
    	}
    }
}

二、接口:RequestAware、SessionAware和ApplicationAware

修改Action类,通过实现Struts 提供的接口:RequestAware、SessionAware和ApplicationAware,获取请求、会话和上下文对象相关联的Map 对象来实现存取属性的功能,代码片段如下:

public class UserAction extends ActionSupport implements RequestAware,SessionAware,ApplicationAware{
	//……
	private Map request,session,application;
	public void setRequest(Map<String, Object> request) {
		this.request=request;
	}
	public void setSession(Map<String, Object> session) {
		this.session=session;
	}
	public void setApplication(Map<String, Object> application) {
		this.application=application;
	}
	public String login() {
		Integer counter = (Integer)application.get("counter");
		if(counter==null)
			counter=1;
		else
			counter=counter+1;
		application.put("counter", counter);
		UserService userServ = new UserService();
		if (userServ.login(loginUser)) {
			session.put("user", loginUser.getAccount());
			request.put("tip", "您已登录成功");
			return "success";
		} 
		else {
			return "fail";
		}
	}
}

三、接口:ServletContextAware、ServletRequestAware和ServletResponseAware

修改Action类,通过接口:ServletContextAware、ServletRequestAware、
ServletResponseAware 直接访问Servlet API,代码片段如下:

public class UserAction extends ActionSupport implements ServletContextAware,ServletRequestAware,ServletResponseAware{
	//……
	private ServletContext application;         // Servlet上下文  
	private HttpServletRequest request;         // request对象  
	private HttpServletResponse response;       // response对象  
	public void setServletRequest(HttpServletRequest request) {

		this.request=request;
	}
	public void setServletResponse(HttpServletResponse response) {

		this.response=response;
	}
	public void setServletContext(ServletContext application) {
		this.application=application;
	}
	public String login() {
		HttpSession session=request.getSession();
		Integer counter = (Integer)application.get("counter");
		if(counter==null)
			counter=1;
		else
			counter=counter+1;
		application.put("counter", counter);
		UserService userServ = new UserService();
		if (userServ.login(loginUser)) {
			session.put("user", loginUser.getAccount());
			request.put("tip", "您已登录成功");
			return "success";
		} 
		else {
			return "fail";
		}
	}
}

四、ServletActionContext 工具类

通过ServletActionContext 工具类直接访问Servlet API,代码片段如下:

public class UserAction extends ActionSupport{
	//……
	public String login() {
		HttpServletRequest request = ServletActionContext.getRequest();
		HttpServletResponse response = ServletActionContext.getResponse();
		ServletContext application = ServletActionContext.getServletContext();
		HttpSession session=request.getSession();
		Integer counter = (Integer)application.get("counter");
		if(counter==null)
			counter=1;
		else
			counter=counter+1;
		application.put("counter", counter);
		UserService userServ = new UserService();
		if (userServ.login(loginUser)) {
			session.put("user", loginUser.getAccount());
			request.put("tip", "您已登录成功");
			return "success";
		} 
		else {
			return "fail";
		}
	}
}

测试代码:

<body>
	本站访问次数为:
	<s:property value="#application.counter" />
	<br>
    <s:property value="#session.user" />,
    <s:property value="#request.tip" />
</body>

运行结果:
在这里插入图片描述

以上四种方法中,前两种可以保持Action 与Servlet API 的解耦,后两种Action 将与Servlet API 直接耦合。

  • 5
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值