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]
B、IoC方式
要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点.具体实现,请参考例6 IocServlet.java.
例6 classes/tutorial/IoCServlet.java
package tutorial;
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;
public class 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;
}[A5]
publicvoid setServletRequest(HttpServletRequest request) {
this.request = request;
}
51 publicvoid setServletResponse(HttpServletResponse response) {
this.response = response;
}[A5]
@Override
public String execute() {
att [A6] .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;
}
}
例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
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.
(二)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.
(三)getContext
public static ActionContext getContext()
Returns the ActionContext specific to the current thread.
Returns:
the ActionContext for the current thread, is never null.
(四)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.
(五)setSession
public void setSession(Map session)
Sets a map of action session values.
Parameters:
session- the session values.
Struts2的action类继承
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
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", "密码不能为空"); }
}
Struts2中ActionContext和ServletActionContext的更多相关文章
- Struts2中ActionContext及ServletActionContext介绍(转载)
1. ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息, ...
- 关于struts2中ActionContext类的作用
关于struts2中ActionContext类的作用有三个: 1.获取三大作用域对象及页面参数 2.是struts标签的上下文对象 3.ThreadLocal内装的就是ActionContext 怎 ...
- 【struts2】ActionContext与ServletActionContext
1 再探ActionContext 我们知道,ActionContext是Action执行时的上下文,里面存放着Action在执行时需要用到的对象,也称之为广义值栈.Struts2在每次执行Actio ...
- Struts中ActionContext和ServletActionContext的比较
一.ActionContext在Struts2开发中除了将请求参数自动设置到Action的字段中,往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息,甚至需要直 ...
- struts2中 ServletActionContext与ActionContext区别
1. ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息, ...
- ActionContext介绍(在Struts2中)
一种属性的有序序列,它们为驻留在环境内的对象定义环境.在对象的激活过程中创建上下文,对象被配置为要求某些自动服务,如同步.事务.实时激活.安全性等等.多个对象可以存留在一个上下文内.也有根据上下文理解 ...
- Struts2中的ActionContext、OGNL及EL的使用
文章分类:Java编程 本文基于struts2.1.8.1,xwork2.1.6 1.EL EL(Expression Language)源于jsp页面标签jstl,后来被jsp2.0 ...
- 在Struts2中使用ValueStack、ActionContext、ServletContext、request、session等 .
笔者不知道该用哪个词来形容ValueStack.ActionContext等可以在Struts2中用来存放数据的类.这些类使用的范围不同,得到的方法也不同,下面就来一一介绍. 声明:本文参考Strut ...
- ActionContext和ServletActionContext区别
1. ActionContext 在Struts2开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话(Session)的一些信息, ...
随机推荐
- Centos更换yum库镜像
首先备份/etc/yum.repos.d/CentOS-Base.repo mv /etc/yum.repos.d/CentOS-Base.repo /etc/yum.repos.d/CentOS-B ...
- 为自己的git添加alias,命令缩写
在多人协作开发时,一般用git来进行代码管理.git有一些命令如:git pull . git push等等,这些命令可以设置alias,也就是缩写.如:git pull 是 git pl, git ...
- 转<<C#集合Dictionary中按值的降序排列
转载地址:http://blog.sina.com.cn/s/blog_5c5bc9070100pped.html C#集合Dictionary中按值的降序排列 static void Main(st ...
- jquery 调用数据
<body> <div id="aa" style="">hello</div> <div class="b ...
- shell kill掉含同一字符的关键字的进程
如何kill掉进程名包含某个字符串的一批进程:kill -9 $(ps -ef|grep 进程名关键字|gawk '$0 !~/grep/ {print $2}' |tr -s '\n' ' ') 观 ...
- [BZOJ3343]教主的魔法
[BZOJ3343]教主的魔法 试题描述 教主最近学会了一种神奇的魔法,能够使人长高.于是他准备演示给XMYZ信息组每个英雄看.于是N个英雄们又一次聚集在了一起,这次他们排成了一列,被编号为1.2.… ...
- string和stringstream用法总结
参考:http://blog.csdn.net/xw20084898/article/details/21939811
- linux tar文件解压
把常用的tar解压命令总结下,当作备忘: tar -c: 建立压缩档案-x:解压-t:查看内容-r:向压缩归档文件末尾追加文件-u:更新原压缩包中的文件 这五个是独立的命令,压缩解压都要用到其中一个, ...
- linux dd命令实用详解
linux dd命令刻录启动U盘详解 dd命令做usb启动盘十分方便,只须:sudo dd if=xxx.iso of=/dev/sdb bs=1M 用以上命令前必须卸载u盘,sdb是你的u盘,bs= ...
- RabbitMQ消息队列:ACK机制
每个Consumer可能需要一段时间才能处理完收到的数据.如果在这个过程中,Consumer出错了,异常退出了,而数据还没有处理完成,那么 非常不幸,这段数据就丢失了. 因为我们采用no-ack的方式 ...