- 浏览: 887621 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (687)
- java (127)
- servlet (38)
- struts (16)
- spring (22)
- hibernate (40)
- javascript (58)
- jquery (18)
- tomcat (51)
- 设计模式 (6)
- EJB (13)
- jsp (3)
- oracle (29)
- RUP (2)
- ajax (3)
- java内存管理 (4)
- java线程 (12)
- socket (13)
- path (5)
- XML (10)
- swing (2)
- UML (1)
- JBPM (2)
- 开发笔记 (45)
- Note参考 (15)
- JAXB (4)
- Quartz (2)
- 乱码 (2)
- CSS (2)
- Exception (4)
- Tools (7)
- sqlserver (3)
- DWR (7)
- Struts2 (47)
- WebService (2)
- 问题解决收藏 (7)
- JBOSS (7)
- cache (10)
- easyUI (19)
- jQuery Plugin (11)
- FreeMarker (6)
- Eclipse (2)
- Compass (2)
- JPA (1)
- WebLogic (1)
- powerdesigner (1)
- mybatis (1)
最新评论
-
bugyun:
受教了,谢谢
java 正则表达式 过滤html标签 -
xiongxingxing_123:
学习了,感谢了
java 正则表达式 过滤html标签 -
wanmeinange:
那如果无状态的。对同一个任务并发控制怎么做?比如继承Quart ...
quartz中参数misfireThreshold的详解 -
fanjieshanghai:
...
XPath 元素及属性查找 -
tianhandigeng:
还是没明白
quartz中参数misfireThreshold的详解
ActionContext类位于com.opensymphony.xwork2中,提供一系列相关方法用于访问保存在ServletContext、HttpSession、HttpServletRequest中的信息,并且存储在Map中。需要注意的是,该类并没有提供获取ServletContext、HttpSession、HttpServletRequest等对象的方法。ActionContext类的常用方法见下表:
方法
|
解释
|
public Map getParameters()
|
从请求对象(HttpServletRequest)中获取请求参数
|
public Map getApplication()
|
获取ServletContext中保存的Attribute
|
public Map getSession()
|
获取HttpSession中保存的Attribute
|
那么,这些信息是在什么时候保存进去的呢?从源代码中分析,所有秘密都隐藏在org.apache.struts2.dispatcher. Dispatcher类中,该类中定义了一个createContextMap()方法,代码如下:
代码清单29:Dispatcher.createContextMap()方法
public Map<String,Object> createContextMap(HttpServletRequest request, HttpServletResponse response,
ActionMapping mapping, ServletContext context) {
// request map wrapping the http request objects
Map requestMap = new RequestMap(request);//存放request中所有的Attribute
// parameters map wrapping the http paraneters.
Map params = null;
if (mapping != null) {
params = mapping.getParams();
}
Map requestParams = new HashMap(request.getParameterMap());//存放request中所有的Parameter
if (params != null) {
params.putAll(requestParams);
} else {
params = requestParams;
}
// session map wrapping the http session
Map session = new SessionMap(request);//存放Session中所有的Attribute
// application map wrapping the ServletContext
Map application = new ApplicationMap(context);//存放ServletContext所有的Attribute
Map<String,Object> extraContext = createContextMap(requestMap, params, session, application, request, response, context);
extraContext.put(ServletActionContext.ACTION_MAPPING, mapping);
return extraContext;
}
接下来又调用了另一个重载的createContextMap()方法,该方法不仅保存Attribute,而且保存request,response和servletContext对象,请看源代码:
代码清单30:重载的Dispatcher.createContextMap()方法
public HashMap<String,Object> createContextMap(Map requestMap,
Map parameterMap,
Map sessionMap,
Map applicationMap,
HttpServletRequest request,
HttpServletResponse response,
ServletContext servletContext) {
HashMap<String,Object> extraContext = new HashMap<String,Object>();
extraContext.put(ActionContext.PARAMETERS, new HashMap(parameterMap));
extraContext.put(ActionContext.SESSION, sessionMap);
extraContext.put(ActionContext.APPLICATION, applicationMap);
Locale locale;
if (defaultLocale != null) {
locale = LocalizedTextUtil.localeFromString(defaultLocale, request.getLocale());
} else {
locale = request.getLocale();
}
extraContext.put(ActionContext.LOCALE, locale);
//extraContext.put(ActionContext.DEV_MODE, Boolean.valueOf(devMode));
extraContext.put(StrutsStatics.HTTP_REQUEST, request);
extraContext.put(StrutsStatics.HTTP_RESPONSE, response);
extraContext.put(StrutsStatics.SERVLET_CONTEXT, servletContext);
// helpers to get access to request/session/application scope
extraContext.put("request", requestMap);
extraContext.put("session", sessionMap);
extraContext.put("application", applicationMap);
extraContext.put("parameters", parameterMap);
AttributeMap attrMap = new AttributeMap(extraContext);
extraContext.put("attr", attrMap);
return extraContext;
}
可以看出,在第一个createContextMap()方法得到的所有Map类型的数据最终又被保存在了另一个Map中,ActionContext就是从这个Map中获取数据的。
在ActionContext类中定义了一个静态方法public static ActionContext getContext()用于获取自己的一个实例,不能new此类的对象。
下面的示例演示了ActionContext类的基本用法,即从请求参数中读取id和name的值,并且将值保存到Session中,然后跳转到session.jsp页面将id和name的值显示出来。
先定义ServletAction类,代码如下:
代码清单31:ServletAction.java
package com.lizanhong.chapter3;
import java.util.Map;
import java.util.Set;
import com.opensymphony.xwork2.ActionContext;
public class ServletAction {
public String execute(){
ActionContext ac = ActionContext.getContext();
Map paramMap = ac.getParameters();
String[] ids = (String[]) paramMap.get("id");
String[] names = (String[]) paramMap.get("name");
Map sessionMap = ac.getSession();
sessionMap.put("id", ids[0]);
sessionMap.put("name", names[0]);
return "toSession";
}
}
注:通过getParameters()方法获取到的请求参数类型都是String[],必须根据实际情况取值。如果只有一个值的话,取出数组中第0个元素即可。
以下是ServletAction在struts.xml中的配置。
代码清单33:在struts.xml中的配置
<action name="servletAction" class="com.lizanhong.chapter3.ServletAction">
<result name="toSession">/session.jsp</result>
</action>
在session.jsp页面中,使用表达式语言(EL)显示保存在Session中的id和name值。
代码清单33:session.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'session.jsp' starting page</title>
</head>
<body>
${id }<br>
${name }
</body>
</html>
请求参数通过表单页面idname.jsp提供。
代码清单34:idname.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<title>My JSP 'idname.jsp' starting page</title>
</head>
<body>
<form action="servletAction.action" method="post">
ID:<input name="id"><br>
Name:<input name="name"><br>
<input type="submit" value="提交">
</form>
</body>
</html>
通过http://localhost:8081/Struts2Demo/idname.jsp地址访问即可,图24是表单输入效果,图25是表单提交后将请求发送给Action,最后显示在session.jsp中的效果:
(图24)
(图25)
ActionContext类是xwork提供的,struts2定义了一个新类org.apache.struts2. ServletActionContext,该类继承自ActionContext:
代码清单35:ServletActionContext.java的定义
public class ServletActionContext extends ActionContext implements StrutsStatics {
}
ServletActionContext类和ActionContext相比扩展了更多的方法,主要是一些静态方法,该类的源代码如下:
代码清单36:ServletActionContext.java的完整定义
public class ServletActionContext extends ActionContext implements StrutsStatics {
private static final long serialVersionUID = -666854718275106687L;
public static final String STRUTS_VALUESTACK_KEY = "struts.valueStack";
public static final String ACTION_MAPPING = "struts.actionMapping";
@SuppressWarnings("unused")
private ServletActionContext(Map context) {
super(context);
}
public static ActionContext getActionContext(HttpServletRequest req) {
ValueStack vs = getValueStack(req);
if (vs != null) {
return new ActionContext(vs.getContext());
} else {
return null;
}
}
public static ValueStack getValueStack(HttpServletRequest req) {
return (ValueStack) req.getAttribute(STRUTS_VALUESTACK_KEY);
}
public static ActionMapping getActionMapping() {
return (ActionMapping) ActionContext.getContext().get(ACTION_MAPPING);
}
public static PageContext getPageContext() {
return (PageContext) ActionContext.getContext().get(PAGE_CONTEXT);
}
public static void setRequest(HttpServletRequest request) {
ActionContext.getContext().put(HTTP_REQUEST, request);
}
public static HttpServletRequest getRequest() {
return (HttpServletRequest) ActionContext.getContext().get(HTTP_REQUEST);
}
public static void setResponse(HttpServletResponse response) {
ActionContext.getContext().put(HTTP_RESPONSE, response);
}
public static HttpServletResponse getResponse() {
return (HttpServletResponse) ActionContext.getContext().get(HTTP_RESPONSE);
}
public static ServletContext getServletContext() {
return (ServletContext) ActionContext.getContext().get(SERVLET_CONTEXT);
}
public static void setServletContext(ServletContext servletContext) {
ActionContext.getContext().put(SERVLET_CONTEXT, servletContext);
}
}
注意粗体部分,getPageContext()方法返回PageContext的引用,getRequest()方法返回HttpServletRequest的引用,getResponse()方法返回HttpServletResponse的引用,getServletContext()方法返回ServletContext的引用。我们将代码清单31修改成代码清单37所示:
代码清单37:ServletAction.java的修改版
public class ServletAction {
public String execute(){
String id = ServletActionContext.getRequest().getParameter("id");
String name = ServletActionContext.getRequest().getParameter("name");
Map sessionMap = ServletActionContext.getContext().getSession();
sessionMap.put("id", id);
sessionMap.put("name", name);
System.out.println("id=" + sessionMap.get("id"));
System.out.println("name=" + sessionMap.get("name"));
return "toSession";
}
}
3.3.2 通过IOC访问Servlet对象
在Struts2中,可以通过IOC(依赖注入)将Servlet对象注入到Action中,这一切都是由一组接口决定的,这一组接口有一个共同点,名称都由Aware结尾。以下是这些接口的解释说明:
接口定义
|
作用
|
public interface ApplicationAware {
public void setApplication(Map application);
}
|
以Map类型向Action注入保存在ServletContext中的Attribute集合。
|
public interface SessionAware {
public void setSession(Map session);
}
|
以Map类型向Action注入保存在HttpSession中的Attribute集合。
|
public interface ServletResponseAware {
public void setServletResponse(HttpServletResponse response);
}
|
向Action中注入HttpServletResponse对象
|
public interface ServletRequestAware {
public void setServletRequest(HttpServletRequest request);
}
|
向Action中注入HttpServletRequest对象
|
public interface RequestAware {
public void setRequest(Map request);
}
|
以Map类型向Action注入保存在HttpServletRequest中的Attribute集合。
|
public interface CookiesAware {
void setCookiesMap(Map cookies);
}
|
以Map类型向Action注入Cookie中的数据集合。
|
public interface ParameterAware {
public void setParameters(Map parameters);
}
|
向Action中注入请求参数集合。
|
为了将相关Servlet对象注入到Action中,只要让Action实现这些接口就可以了,Struts2会自动将数据及对象注入Action。代码清单38是对代码清单37的再次修改版:
代码清单38:ServletAction2.java
public class ServletAction2 implements CookiesAware,ParameterAware, RequestAware, SessionAware, ServletRequestAware, ServletResponseAware, ApplicationAware {
private Map sessionMap;
private HttpServletRequest request;
private HttpServletResponse response;
private Map applicationMap; //只是定义,代码中没有使用,起演示说明作用
private Map cookieMap; //只是定义,代码中没有使用,起演示说明作用
private Map requestMap; //只是定义,代码中没有使用,起演示说明作用
private Map parameterMap; //只是定义,代码中没有使用,起演示说明作用
public void setSession(Map session) {
this.sessionMap = session;
}
public void setServletRequest(HttpServletRequest request) {
this.request = request;
}
public void setServletResponse(HttpServletResponse response) {
this.response = response;
}
public void setApplication(Map application) {
this.applicationMap = application;
}
public void setCookiesMap(Map cookies) {
this.cookieMap = cookies;
}
public void setParameters(Map parameters) {
this.parameterMap = parameters;
}
public void setRequest(Map request) {
this.requestMap = request;
}
public String execute(){
String id = this.request.getParameter("id");
String name = this.request.getParameter("name");
sessionMap.put("id", id);
sessionMap.put("name", name);
return "toSession";
}
}
该Action的配置如下:
代码清单40:ServletAction2的配置
<action name="servletAction2" class="com.lizanhong.chapter3.ServletAction2">
<result name="toSession">/session.jsp</result>
</action>
发表评论
-
ognl表达式
2011-07-07 00:36 1295OGNL是Object Graphic Navigation ... -
在Struts 2_0中实现表单数据校验
2011-07-07 00:02 1140转换与校验(Conversion & Validati ... -
简单的struts2输入校验框架
2011-05-13 23:43 10841.输入页面login.jsp: <%@ page ... -
struts2在学习(十二)--表单验证的两种方式
2011-05-13 23:13 958第四个示例:注解方式校验器---用户注册页面user2_reg ... -
struts2在学习(十一)--表单验证的两种方式
2011-05-13 23:09 904第二个示例:XML配置式校验器---登录和注册页面user_l ... -
struts2在学习(十)--表单验证的两种方式
2011-05-13 22:56 11581. Struts2中的输入校验2. 编码方式校验 1) A ... -
struts2采用convention-plugin实现零配置
2011-05-13 21:58 1115最近开始关注struts2的新特性,从这个版本开始,Strut ... -
基于SSH2框架Struts2拦截器的登录验证实现
2011-04-01 22:00 2289通过之前的Struts2.1.6+Spring2.5.6+H ... -
webwork 之销毁session
2011-04-01 17:35 1763销毁的意思?不是清空 ... -
Struts2 Convention Plugin(三)
2011-03-18 01:26 1198Annotation 参考Convention使用某些注解语句 ... -
Struts2 Convention Plugin(二)
2011-03-18 01:25 1147Results and result codesStruts ... -
Struts2 Convention Plugin(一)
2011-03-18 01:25 1096Introduction从struts2.1版本开始,Conv ... -
struts2页面中的标签调用类的方法
2011-03-15 16:33 1614<s:set name="str" ... -
Apache Struts 2.2.1 GA版发布
2011-03-14 17:14 1334昨日,Apache软件基金会发布了Struts 2.2.1 G ... -
spring2 +hibernate 3 + struts 配置
2011-03-14 15:15 12081. web.xml 1. <?xml versi ... -
Struts2 中action之间的跳转
2011-03-14 12:32 1251转载于http://zhou568xiao.iteye.com ... -
Struts2 的Result Type
2011-03-13 16:35 1042http://www.blogjava.net/duanzhi ... -
struts2 跳转类型 result type=chain、dispatcher、redirect(redirect-action)
2011-03-13 16:32 1619dispatcher 为默认跳转类型,用于返回一个视图资源(如 ... -
struts2防止重复提交
2011-03-10 23:07 1290struts2的防止重复提交 也使用到了 token (令牌机 ... -
Struts2 数据输入校验(1) —— 函数验证
2011-02-20 20:47 909用struts2标签库来实现上述目的的基本原理: 错误消息分为 ...
相关推荐
首先,ActionContext类包含了一个Map,该Map映射了Servlet API中的请求和响应对象。你可以通过以下方式获取它们: ```java ActionContext context = ActionContext.getContext(); HttpServletRequest request = ...
Struts2 框架提供了多种方式来访问 Servlet API,包括使用 ActionContext 类、实现接口和使用 ServletActionContext 类等。在本文中,我们将详细介绍 Struts2 访问 Servlet API 的几种方法。 一、使用 ...
虽然它不是直接针对Servlet API,但可以通过`ActionContext`获取到`ServletActionContext`,进一步访问Servlet API。 4. **通过OGNL表达式**: 在Struts2的视图层,例如JSP中,可以使用OGNL(Object-Graph ...
ServletActionContext是ActionContext的子类,它扩展了ActionContext的功能,可以直接访问与Servlet相关的对象,包括: 1. `HttpServletRequest`: HTTP servlet请求对象,可以获取请求参数、头信息等。 2. `...
直接访问Servlet API可能涉及使用`HttpServletRequest`、`HttpServletResponse`和`ServletConfig`等对象,这可能导致代码的耦合度增加,不利于维护。Struts2推荐使用ActionSupport类和ActionContext来获取请求和响应...
因此,Struts2 提供了三种方式来访问 Servlet API,这三种方式分别是实现特定接口、通过 ServletActionContext 类和通过 ActionContext 类。 第一种方式:实现特定接口 这种方式需要 Action 实现特定的接口,如 ...
在Struts2框架中,ActionContext扮演着至关...而ServletActionContext则是在ActionContext的基础上,提供了更直接访问Servlet API的途径。在实际开发中,合理选择和使用这两个类,能有效提高代码的可读性和可维护性。
尽管直接在普通Java类中获取`PageContext`并非易事,下面提供一个示例代码,展示如何在Servlet环境中通过`HttpServletRequest`间接访问`PageContext`: ```java import javax.servlet.http.HttpServletRequest; ...
ActionContext还提供了其他有用的方法,如`getParameters()`可以获取请求参数,`getServletContext()`可访问到Servlet的上下文对象,`getLocale()`则可以获取用户的本地化信息等。 总的来说,JavaEE ActionContext...
Struts2引入了依赖注入(Inversion of Control, IOC)的概念,通过ActionContext类来间接访问Servlet API。ActionContext提供了一种非侵入式的方式,使得Action可以在不直接依赖Servlet API的情况下,与Servlet环境...
2. **使用ActionContext访问Servlet API**: `ActionContext`是Struts2的核心类之一,它封装了当前请求的所有上下文信息,包括ActionInvocation、ValueStack、Parameters等。你可以通过`ActionContext`来获取`...
这个压缩包“strut2 servletapi”显然包含了使用Struts2框架访问Servlet API的示例代码。Servlet API是Java Servlet规范的一部分,提供了一系列接口和类,允许开发者处理HTTP请求、响应以及与Web服务器交互。 在...
在这个"Action访问Servlet的API的简单实例"中,我们将探讨如何在Struts Action中通过不同的方式来访问Servlet API,以便于处理HTTP请求和响应。 首先,我们来看**访问方式一**,这是通过实现Struts提供的接口来获取...
`ServletActionContext`扩展了`ActionContext`,提供直接访问Servlet API的方法。例如,获取HttpServletRequest、HttpServletResponse、ServletContext等对象。如果需要直接操作Servlet相关对象,可以使用`...
`ServletActionContext`扩展了`ActionContext`,并提供了访问Servlet相关对象的便捷方法: ```java HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = ServletActionContext...
1. **HttpServletRequest对象**:Struts2通过`ActionContext`暴露了`HttpServletRequest`对象,使得Action可以直接访问请求参数、头信息、会话数据等。例如,你可以通过`ActionContext.getRequest().getParameter(...
在Struts2框架中,有时我们需要直接访问Servlet相关对象,如HttpServletRequest、HttpSession和ServletContext,以实现特定的功能。本文将探讨如何在Struts2中访问和操作这些对象。 **一、访问或添加request/...
通过这个接口,Struts2框架会在执行execute方法前自动将HttpServletResponse对象注入到Action类的成员变量中。例如: ```java public class MyAction extends ActionSupport implements ServletResponseAware { ...