【SSH三大框架】Struts2基础第二篇:Struts2的Action访问ServletAPI

在Struts2中,Action没有与任何的Servlet API耦合,这是Struts2的一个改良之处。但是,对于WEB应用而言,不可能不去访问Servlet API。Struts提供了几种方式来更轻松来访问Servlet API。WEB应用通常需要访问的Servlet API就是HttpServletRequest、HttpSerssion和ServletContext,这三个接口分别代表JSP内置对象中的request、session和application。

参考文章1:http://www.cnblogs.com/tanglin_boy/archive/2010/01/18/1650871.html

参考文章2:http://blog.csdn.net/woshixuye/article/details/8172777


下面写下我的总结以及写的代码。

一、通过ActionContext访问Servlet API:

ActionContext定义:xwork框架的ActionContext是Action执行时的上下文,存放Action执行时需要用到的对象。
可以把ActionContext看成是一个容器(Map),在这个容器中存放的对象就是我们在执行Action的时候需要用到的对象(Application,session,request等,在下边我会介绍如何获得)。
方法:

Object get(Object key):类似于调用HttpServletRequest的getAttribute(String name)方法

Map getApplication():返回一个Map对象,对象模拟了ServletContext实例

static ActionContext getContext():静态方法,获取系统的ActionContext实例

Map getParameters():获取所有的请求参数。类似于调用HttpServletRequest对象的getParameterMap()方法

Map getSession():返回一个Map对象,该Map对象模拟了HttpSession实例。




一般情况我们的ActionContext都是通过:ActionContext context = (ActionContext) actionContext.get()来获取的。
actionContext对象的创建过程是:static ThreadLocal actionContext = new ActionContextThreadLocal()。
ActionContextThreadLocal是实现ThreadLocal的一个内部类。ThreadLocal可以命名为"线程局部变量",它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。这样ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的。
下边的java代码是通过ActionContext对象来添加属性
public class Hello extends ActionSupport {
	public String execute(){
		ActionContext ctx = ActionContext.getContext(); //创建ActionContext对象
		ctx.getApplication().put("app", "Application范围");//向servletContext里放入app属性,内容是"Application范围"
		ctx.getSession().put("ses", "session范围"); //向session里面放入ses属性,内容是"Session范围"
		ctx.put("req", "request范围");//往request里放入req属性,内容是"request范围"
		
		return SUCCESS;
	}
}
在我们取得Application、Session、Request对象之后,用put()方法添加属性,是因为得到的对象被框架封装成了Map对象
下边的java代码是通过ActionContext对象访问前台传进来的属性
//在Action中取得request请求参数"username"的值:
public class test extends ActionSupport{
	public String execute(){
		ActionContext ctx = ActionContext.getContext(); //得到ActionContext对象
		Map param = ctx.getParameters(); //通过getParameters()方法返回一个Map对象
			
		//通过param.get("username")可以取值。值得注意的是param.get("username")是一个String数组
		//既然是String数组就需要这样取值
		String value[] = (String[])param.get("username");
		String username = "";
		for(int i=0;i<value.length;i++)
		{
			username +=value[i];
		}
		System.out.println(username);
		
		return SUCCESS;
	}
}
下边的代码是Action操作request、session、application范围内属性:
import com.opensymphony.xwork2.Action;
import com.opensymphony.xwork2.ActionContext;

import java.util.Map;

public class LoginAction implements Action
{
	private String username;
	private String password;
	
	public void setUsername(String username)
	{
		this.username = username;
	}
	public String getUsername()
	{
		return this.username;
	}
	public void setPassword(String password)
	{
		this.password = password;
	}
	public String getPassword()
	{
		return this.password;
	}
	
	public String execute() throws Exception
	{
		ActionContext ctx = ActionContext.getContext();
		//通过ActionContext访问application范围的属性值
		Integer counter = (Integer)ctx.getApplication()  //代码1
			.get("counter");
		if (counter == null)
		{
			counter = 1;
		}
		else
		{
			counter = counter + 1;
		}
		//通过ActionContext设置application范围的属性
		ctx.getApplication().put("counter" , counter);  //代码2
		//通过ActionContext设置session范围的属性
		ctx.getSession().put("user" , getUsername());  //代码3
		if (getUsername().equals("crazyit.org")
			&& getPassword().equals("leegang") )
		{
			//通过ActionContext设置request范围的属性
			ctx.put("tip" , "服务器提示:您已经成功的登录");  //代码4
			return SUCCESS;
		}
		else
		{
			//通过ActionContext设置request范围的属性
			ctx.put("tip" , "服务器提示:登录失败");
			return ERROR;
		}
	}
}


二、ServletActionContext

ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了我们上面介绍的ActionContext,它提供了直接与Servlet相关对象访问的功能,它可以取得的对象有:

(1)javax.servlet.http.HttpServletRequest :HTTPservletRequest对象

(2)javax.servlet.http.HttpServletResponse :HTTPservletResponse对象

(3)javax.servlet.ServletContext : Servlet上下文信息

(4)javax.servlet.ServletConfig : Servlet配置对象

(5)javax.servlet.jsp.PageContext : Http页面上下文

如何从ServletActionContext里取得Servlet的相关对象:

<1>取得HttpServletRequest对象: HttpServletRequest request = ServletActionContext. getRequest();

<2>取得HttpSession对象: HttpSession session = ServletActionContext. getRequest().getSession();



注意一点:
ActionContext能够实现我们的功能,最好就不要使用ServletActionContext,让Action尽量不要直接去访问Servlet的相关对象。不然的话,会提高耦合度,不容易解耦




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值