在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:
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实例。
ActionContextThreadLocal是实现ThreadLocal的一个内部类。ThreadLocal可以命名为"线程局部变量",它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。这样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;
}
}
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(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();