ITKeyword,专注技术干货聚合推荐

注册 | 登录

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

u010800530 分享于 2014-08-02

推荐:【SSH三大框架】Struts2基础第一篇:编写第一个Struts2程序

本年八月份的时候已经是把SSH三层框架学完了,然后又转战Android开发,已经很久没用三大框架做东西了,所以想要花三四天的时间复习一下,就写在博客上。 附带SSH

2019阿里云双11返场狂欢继续,
地址https://www.aliyun.com/1111/2019/home

在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()方法

推荐:SSH框架整合之Struts2和Spring整合

      今天在整合SSH框架的过程中,发现Struts2和Spring的整合稍微复杂一些,想想还是记一下笔记为妙,免得以后就忘了。        整合Struts2和Spring框架,可以

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的相关对象。不然的话,会提高耦合度,不容易解耦




推荐:【SSH三大框架】Struts2基础第八篇:Struts2用AJAX实现JSON插件的使用

AJAX的详细描述就不做介绍了,大家基本都懂这个。 下面我们会通过两个具体的案例,来做具体的实现: 案例一: 案例描述:输入用户名,把用户名通过AJAX异步传输

在Struts2中,Action没有与任何的Servlet API耦合,这是Struts2的一个改良之处。但是,对于WEB应用而言,不可能不去访问Servlet API。Struts提供了几种方式来更轻松来访问Servlet API。WEB应用

相关阅读排行


用户评论

游客

相关内容推荐

最新文章

×

×

请激活账号

为了能正常使用评论、编辑功能及以后陆续为用户提供的其他产品,请激活账号。

您的注册邮箱: 修改

重新发送激活邮件 进入我的邮箱

如果您没有收到激活邮件,请注意检查垃圾箱。