您的位置:首页 > 编程语言 > Java开发

Struts2中ActionContext介绍

2011-09-22 10:51 357 查看
本文转自互联网,并整理。

在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中NonIocServletIoCServlet 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")等同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: