Struts2中ActionContext和ServletActionContext

转自:http://blog.sina.com.cn/s/blog_6c9bac050100y9iw.html

 

Web应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话 (Session)的一些信息, 甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应(HttpServletResponse)操作。

 

我们需要在Action中取得request请求参数"username"的值:

ActionContext context = ActionContext.getContext(); Map params = context.getParameters(); String username = (String) params.get("username");

 

ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放放的是Action在执行时需要用到的对象

一般情况,我们的ActionContext都是通过:ActionContext context = (ActionContext) actionContext.get();来获取的.

 

我们再来看看这里的actionContext对象的创建:

static ThreadLocal actionContext = new ActionContextThreadLocal();

 

ActionContextThreadLocal是实现ThreadLocal的一个内部类.ThreadLocal可以命名为"线程局部变量",它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本, 而不会和其它线程的副本冲突.这样,我们ActionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的.

 

下面我们看看怎么通过ActionContext取得我们的HttpSession:

Map session = ActionContext.getContext().getSession();

 

再看看怎么通过ServletActionContext取得我们的HttpSession:

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

1, javax.servlet.http.HttpServletRequest:HTTPservlet请求对象

2, javax.servlet.http.HttpServletResponse;:HTTPservlet相应对象

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

4, javax.servlet.ServletConfig:Servlet配置对象

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

下面我们看看几个简单的例子,让我们了解如何从ServletActionContext里取得JavaServlet的相关对象:

1, 取得HttpServletRequest对象:

HttpServletRequest request = ServletActionContext. getRequest();

 

2, 取得HttpSession对象:

HttpSession session = ServletActionContext. getRequest().getSession();

 

 

ServletActionContext 和ActionContext有着一些重复的功能,在我们的Action中,该如何去抉择呢?

我们遵循的原则是:

(1)如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问JavaServlet的相关对象.

(2)在使用ActionContext时有一点要注意:不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null.

 

如果我要取得Servlet API中的一些对象,如request,response或session等,应该怎么做?

Strutx 2.0你可以有两种方式获得这些对象:IoC方式IoC(控制反转Inversion of Control)方式.

A、非IoC方式

 要获得上述对象,关键Struts 2.0中com.opensymphony.xwork2.ActionContext类.我们可以通过它的静态方法getContext()获取当前 Action的上下文对象. 另外,org.apache.struts2.ServletActionContext作为辅助类(Helper Class),可以帮助您快捷地获得这几个对象.

HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); HttpSession session = request.getSession();

 

 

6 classes/tutorial/NonIoCServlet.java

 1 package tutorial;

 2 

 3 import javax.servlet.http.HttpServletRequest; 4 5 import javax.servlet.http.HttpServletResponse; 6 7 import javax.servlet.http.HttpSession; 8 9 import org.apache.struts2.ServletActionContext; 10 11 import com.opensymphony.xwork2.ActionContext; 12 13 import com.opensymphony.xwork2.ActionSupport; 14 15 Public class NonIoCServletextends ActionSupport { 16 17   private String message; 18 19 20 21   public String getMessage() { 22 23     return message; 24 25   } 26 27   HttpServletRequest request = ServletActionContext.getRequest(); 28 29   HttpServletResponse response = ServletActionContext.getResponse(); 30 31   HttpSession session = request.getSession(); 32 33 34 35   @Override 36 37   public String execute() { 38 39     ActionContext.getContext().getSession().put("msg", "Hello World from Session!");[A2] 40 41 42 43     StringBuffer sb =new StringBuffer("Message from request: "); 44 45     sb.append(request.getParameter("msg")); 46 47 48 49     sb.append("<br>Response Buffer Size: "); 50 51     sb.append(response.getBufferSize()); 52 53 54 55     sb.append("<br>Session ID: "); 56 57     sb.append(session.getId());[A3] 58 59 60 61     message = sb.toString(); //转换为字符串。 62 63     return SUCCESS; 64 65   } 66 67 } //与LoginAction类似的方法。

 

如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取或添加session范围(Scoped)的对象.[A1]  

 

BIoC方式

要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点.具体实现,请参考例6 IocServlet.java.

 

6 classes/tutorial/IoCServlet.java

 1 package tutorial;

 2 

 3 import java.util.Map;

 4 

 5 import javax.servlet.http.HttpServletRequest;

 6 

 7 import javax.servlet.http.HttpServletResponse;

 8 

 9 import javax.servlet.http.HttpSession;

10 

11 import org.apache.struts2.interceptor.ServletRequestAware;

12 

13 import org.apache.struts2.interceptor.ServletResponseAware;

14 

15 import org.apache.struts2.interceptor.SessionAware;

16 

17 import com.opensymphony.xwork2.ActionContext;

18 

19 import com.opensymphony.xwork2.ActionSupport;

20 

21 public class IoCServlet extends ActionSupport implements SessionAware,  ServletRequestAware, ServletResponseAware {

22 

23   private String message;

24 

25   private Map att;

26 

27   private HttpServletRequest request;

28 

29   private HttpServletResponse response;

30 

31  

32 

33   public String getMessage() {

34 

35     return message;

36 

37   }

38 

39   public void setSession(Map att) {

40 

41     this.att = att;

42 

43   }[A5]  

44 

45   publicvoid setServletRequest(HttpServletRequest request) {

46 

47     this.request = request;

48 

49   }

50 

51   publicvoid setServletResponse(HttpServletResponse response) {

52 

53     this.response = response;

54 

55   }[A5]  

56 

57  

58 

59   @Override

60 

61   public String execute() {

62 

63     att [A6]  .put("msg", "Hello World from Session!");

64 

65  

66 

67     HttpSession session = request.getSession();

68 

69  

70 

71     StringBuffer sb =new StringBuffer("Message from request: ");

72 

73     sb.append(request.getParameter("msg"));

74 

75     sb.append("<br>Response Buffer Size: ");

76 

77     sb.append(response.getBufferSize());

78 

79     sb.append("<br>Session ID: ");

80 

81     sb.append(session.getId());

82 

83  

84 

85     message = sb.toString();

86   

87     return SUCCESS;

88 

89   }

90 

91 }

 

6 Servlet.jsp

<%@ page contentType="text/html; charset=UTF-8" %>



<%@ taglib prefix="s" uri="/struts-tags"%>



<html>



  <head>



    <title>Hello World!</title>



  </head>



  <body>



    <h2>



      <s:property value="message" escape="false"/>



      <br>Message from session: <s:property value="#session.msg"/>



    </h2>



  </body>



</html>

 

6 classes/struts.xml中NonIocServlet和IoCServlet Action的配置

<action name="NonIoCServlet" class="tutorial.NonIoCServlet">



  <result>/Servlet.jsp</result>



</action>



<action name="IoCServlet" class="tutorial.IoCServlet">



  <result>/Servlet.jsp</result>



</action>

 

 运行Tomcat,在浏览器地址栏中键入http://localhost:8080/Struts2_Action /NonIoCServlet.action?msg=Hello World! 或http://localhost:8080/Struts2_Action/IoCServlet.action?msg=Hello World!

 在Servlet.jsp中,我用了两次property标志,第一次将escape设为false为了在JSP中输出<br>转行,第二次的value中的OGNL为"#session.msg",它的作用与session.getAttribute("msg")等同.

 

 

附:ActionContext的常用方法(来自Struts2.0  API)

(一)get

public Object get(Object key)

Returns a value that is stored in the current ActionContext by doing a lookup using the value's key.

Parameters:

key- the key used to find the value.

Returns:

the value that was found using the key or null if the key was not found.

Struts2中ActionContext介绍

 (二)put

public void put(Object key, Object value)

Stores a value in the current ActionContext. The value can be looked up using the key.

Parameters:

key- the key of the value.

value- the value to be stored.

 

Struts2中ActionContext介绍

(三)getContext

public static ActionContext getContext()

Returns the ActionContext specific to the current thread.

Returns:

the ActionContext for the current thread, is never null.

Struts2中ActionContext介绍

(四)getSession

public Map getSession()

Gets the Map of HttpSession values when in a servlet environment or a generic session map otherwise.

Returns:

the Map of HttpSession values when in a servlet environment or a generic session map otherwise.

Struts2中ActionContext介绍

 ()setSession

public void setSession(Map session)

Sets a map of action session values.

Parameters:

session- the session values.

 

 

Struts2action类继承

com.opensymphony.xwork2.ActionSupport类的常用方法

 

addFieldError  //该方法主要用于验证的方法之中

public void addFieldError(String fieldName,  String errorMessage)

Description copied from interface: ValidationAware

Add an error message for a given field.

Specified by:

addFieldErrorin interface ValidationAware

Parameters:

fieldName- name of field

errorMessage- the error message

Struts2中ActionContext介绍

validate[A7]  

public void validate()

A default implementation that validates nothing. Subclasses should override this method to provide validations.

Specified by:

validatein interface Validateable


这一点比较的重要,例如:ActionContext.getContext().getSession().put("user""value");

与右上角的是一个模式。

Java语法基础,使用stringBuffer。

对属性(实例)设置setter方法。

方法的来源,见后面补充的常用方法:

public void setSession(Map session)

Sets a map of action session values. 设置session值,

Parameters:

session- the session values.

 

为当前的session,所以可以调用put方法。详细信息见补充的知识。

常用于校验登陆程序的账号和密码是否为空,可以加入addFieldError方法。例如public void validate() {

       if (null == login.getUserID() || "".equals(login.getUserID())) {         this.addFieldError("login.userID""学号不能为空");       }

       if (null == login.getUserPassword()              ||"".equals(login.getUserPassword())) {         this.addFieldError("login.userPassword""密码不能为空");    }

    }

你可能感兴趣的:(ActionContext)