Struts2中ActionContext介绍
2011-09-22 10:51
357 查看
本文转自互联网,并整理。
在Web应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话 (Session)的一些信息,,甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应(HttpServletResponse)操作。
我们需要在Action中取得request请求参数"username"的值:
ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放放的是Action在执行时需要用到的对象。
一般情况,我们的ActionContext都是通过:ActionContext context = (ActionContext) actionContext.get();来获取的。
我们再来看看这里的actionContext对象的创建:
ActionContextThreadLocal是实现ThreadLocal的一个内部类。ThreadLocal可以命名为"线程局部变量",它为每一个使用该变量的线程都提供一个变量值的副本,使每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。这样,我们actionContext里的属性只会在对应的当前请求线程中可见,从而保证它是线程安全的。
下面我们看看怎么通过ActionContext取得我们的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对象:
(2)取得HttpSession对象:
ServletActionContext 和ActionContext有着一些重复的功能,在我们的Action中,该如何去抉择呢?我们遵循的原则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问JavaServlet的相关对象。在使用ActionContext时有一点要注意:不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null。
如果我要取得Servlet API中的一些对象,如request,response或session等,应该怎么做?在Struts 2.0你可以有两种方式获得这些对象:非IoC(控制反转Inversion of Control)方式和IoC方式.
(1)非IoC方式
要获得上述对象,关键Struts 2.0中com.opensymphony.xwork2.ActionContext类.我们可以通过它的静态方法getContext()获取当前 Action的上下文对象。 另外,org.apache.struts2.ServletActionContext作为辅助类(Helper
Class),可以帮助您快捷地获得这几个对象。
如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取或添加session范围(Scoped)的对象。这一点比较的重要,例如:
具体实现见例1:
(2)IoC方式
要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点。具体实现见一下例子2:
Servlet.jsp具体实现:
classes/struts.xml中NonIocServlet和IoCServlet Action的配置:
运行Tomcat,在浏览器地址栏中键入http://localhost:8080/Struts2_Action/NonIoCServlet.action?msg=Hello%20World! 或http://localhost:8080/Struts2_Action/IoCServlet.action?msg=Hello%20World!
在Servlet.jsp中,我用了两次property标志,第一次将escape设为false为了在JSP中输出<br>转行,第二次的value中的OGNL为"#session.msg",它的作用与session.getAttribute("msg")等同。
在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(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中,该如何去抉择呢?我们遵循的原则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问JavaServlet的相关对象。在使用ActionContext时有一点要注意:不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,这时通过ActionContext取得的值也许是null。
如果我要取得Servlet API中的一些对象,如request,response或session等,应该怎么做?在Struts 2.0你可以有两种方式获得这些对象:非IoC(控制反转Inversion of Control)方式和IoC方式.
(1)非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();
如果你只是想访问session的属性(Attribute),你也可以通过ActionContext.getContext().getSession()获取或添加session范围(Scoped)的对象。这一点比较的重要,例如:
ActionContext.getContext().getSession().put("user", "value");
具体实现见例1:
package ppp;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
Public class NonIoCServlet extends ActionSupport {
private String message;
public String getMessage() {
return message;
}
HttpServletRequest request = ServletActionContext.getRequest(); HttpServletResponse response = ServletActionContext.getResponse(); HttpSession session = request.getSession();
@Override
public String execute() {
ActionContext.getContext().getSession().put("msg", "Hello World from Session!");
StringBuffer sb =new StringBuffer("Message from request: ");
sb.append(request.getParameter("msg"));
sb.append("<br>Response Buffer Size: ");
sb.append(response.getBufferSize());
sb.append("<br>Session ID: ");
sb.append(session.getId());
message = sb.toString(); //转换为字符串。
return SUCCESS;
}
} //与LoginAction类似的方法。
(2)IoC方式
要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点。具体实现见一下例子2:
package ppp; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import org.apache.struts2.interceptor.ServletRequestAware; import org.apache.struts2.interceptor.ServletResponseAware; import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionContext; import com.opensymphony.xwork2.ActionSupport; publicclass IoCServlet extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware { private String message; private Map att; private HttpServletRequest request; private HttpServletResponse response; public String getMessage() { return message; } public void setSession(Map att) { this.att = att; } publicvoid setServletRequest(HttpServletRequest request) { this.request = request; } publicvoid setServletResponse(HttpServletResponse response) { this.response = response; } @Override public String execute() { att.put("msg", "Hello World from Session!"); HttpSession session = request.getSession(); StringBuffer sb =new StringBuffer("Message from request: "); sb.append(request.getParameter("msg")); sb.append("<br>Response Buffer Size: "); sb.append(response.getBufferSize()); sb.append("<br>Session ID: "); sb.append(session.getId()); message = sb.toString(); return SUCCESS; } }
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>
classes/struts.xml中NonIocServlet和IoCServlet Action的配置:
<action name="NonIoCServlet" class="ppp.NonIoCServlet"> <result>/Servlet.jsp</result> </action>
<action name="IoCServlet" class="ppp.IoCServlet"> <result>/Servlet.jsp</result> </action>
运行Tomcat,在浏览器地址栏中键入http://localhost:8080/Struts2_Action/NonIoCServlet.action?msg=Hello%20World! 或http://localhost:8080/Struts2_Action/IoCServlet.action?msg=Hello%20World!
在Servlet.jsp中,我用了两次property标志,第一次将escape设为false为了在JSP中输出<br>转行,第二次的value中的OGNL为"#session.msg",它的作用与session.getAttribute("msg")等同。
相关文章推荐
- 上下文(context)ActionContext介绍(在Struts2中)
- 传智播客--struts2.x的ActionContext,ValueStack和常用标签介绍
- Struts2中ActionContext介绍
- struts2.x的ActionContext,ValueStack和常用标签介绍
- 在struts2中关于ActionContext介绍
- 上下文(context)ActionContext介绍(在Struts2中)
- Struts2中ActionContext及ServletActionContext介绍(转载)
- 上下文(context)ActionContext介绍(在Struts2中)
- ActionContext的介绍
- Struts2中ActionContext
- struts2中的action与actioncontext的理解
- struts2的ActionContextCleanUp filter
- struts2中 ServletActionContext与ActionContext区别
- Struts2 ActionContext
- Struts2源码阅读(二)_ActionContext及CleanUP Filter
- ActionContext和ServletActionContext小结(struts2)
- 利用struts2的ActionContext但JSP中取不到属性值
- struts2的ActionContext类分析(action执行时所需对象的环境)
- Struts2 ServletActionContext和ActionContext联系相关问题探讨
- Struts2中的ActionContext和ServletActionContext的区别