`

通过ActionContext类访问Servlet对象

阅读更多

 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类,代码如下:
代码清单31ServletAction.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提供。
代码清单34idname.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:
代码清单35ServletActionContext.java的定义
public class ServletActionContext extends ActionContext implements StrutsStatics {
}
    ServletActionContext类和ActionContext相比扩展了更多的方法,主要是一些静态方法,该类的源代码如下:
代码清单36ServletActionContext.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所示:
代码清单37ServletAction.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的再次修改版:
代码清单38ServletAction2.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的配置如下:
代码清单40ServletAction2的配置
<action name="servletAction2" class="com.lizanhong.chapter3.ServletAction2">
       <result name="toSession">/session.jsp</result>
</action>

    可以看出,不需要做其他额外的配置。

http://hi.baidu.com/%C6%C6%D4%C6%B5%B6/blog/item/93be0c2240178cf6d6cae26f.html

分享到:
评论

相关推荐

    Struts2通过使用ActionContext类获取request和response对象

    首先,ActionContext类包含了一个Map,该Map映射了Servlet API中的请求和响应对象。你可以通过以下方式获取它们: ```java ActionContext context = ActionContext.getContext(); HttpServletRequest request = ...

    struts2之Action访问Servlet API

    Struts2 框架提供了多种方式来访问 Servlet API,包括使用 ActionContext 类、实现接口和使用 ServletActionContext 类等。在本文中,我们将详细介绍 Struts2 访问 Servlet API 的几种方法。 一、使用 ...

    Struts2访问ServletAPI

    虽然它不是直接针对Servlet API,但可以通过`ActionContext`获取到`ServletActionContext`,进一步访问Servlet API。 4. **通过OGNL表达式**: 在Struts2的视图层,例如JSP中,可以使用OGNL(Object-Graph ...

    ActionContext介绍(在Struts2中)

    ServletActionContext是ActionContext的子类,它扩展了ActionContext的功能,可以直接访问与Servlet相关的对象,包括: 1. `HttpServletRequest`: HTTP servlet请求对象,可以获取请求参数、头信息等。 2. `...

    Struts2中直接和间接访问ServletAPI以及动态方法调用之感叹号

    直接访问Servlet API可能涉及使用`HttpServletRequest`、`HttpServletResponse`和`ServletConfig`等对象,这可能导致代码的耦合度增加,不利于维护。Struts2推荐使用ActionSupport类和ActionContext来获取请求和响应...

    Struts2访问Servlet的三种方式

    因此,Struts2 提供了三种方式来访问 Servlet API,这三种方式分别是实现特定接口、通过 ServletActionContext 类和通过 ActionContext 类。 第一种方式:实现特定接口 这种方式需要 Action 实现特定的接口,如 ...

    ActionContext在struts2.0中的详细应用

    在Struts2框架中,ActionContext扮演着至关...而ServletActionContext则是在ActionContext的基础上,提供了更直接访问Servlet API的途径。在实际开发中,合理选择和使用这两个类,能有效提高代码的可读性和可维护性。

    普通java类中获取pageContext对象

    尽管直接在普通Java类中获取`PageContext`并非易事,下面提供一个示例代码,展示如何在Servlet环境中通过`HttpServletRequest`间接访问`PageContext`: ```java import javax.servlet.http.HttpServletRequest; ...

    JavaEE ActionContext存取数据示例

    ActionContext还提供了其他有用的方法,如`getParameters()`可以获取请求参数,`getServletContext()`可访问到Servlet的上下文对象,`getLocale()`则可以获取用户的本地化信息等。 总的来说,JavaEE ActionContext...

    详解Struts2中Action访问Servlet API的几种方法

    Struts2引入了依赖注入(Inversion of Control, IOC)的概念,通过ActionContext类来间接访问Servlet API。ActionContext提供了一种非侵入式的方式,使得Action可以在不直接依赖Servlet API的情况下,与Servlet环境...

    Struts2中Servlet的配置

    2. **使用ActionContext访问Servlet API**: `ActionContext`是Struts2的核心类之一,它封装了当前请求的所有上下文信息,包括ActionInvocation、ValueStack、Parameters等。你可以通过`ActionContext`来获取`...

    strut2 servletapi

    这个压缩包“strut2 servletapi”显然包含了使用Struts2框架访问Servlet API的示例代码。Servlet API是Java Servlet规范的一部分,提供了一系列接口和类,允许开发者处理HTTP请求、响应以及与Web服务器交互。 在...

    Action访问Servlet的API的简单实例

    在这个"Action访问Servlet的API的简单实例"中,我们将探讨如何在Struts Action中通过不同的方式来访问Servlet API,以便于处理HTTP请求和响应。 首先,我们来看**访问方式一**,这是通过实现Struts提供的接口来获取...

    struts2中action如何获取jsp页面参数1.pdf

    `ServletActionContext`扩展了`ActionContext`,提供直接访问Servlet API的方法。例如,获取HttpServletRequest、HttpServletResponse、ServletContext等对象。如果需要直接操作Servlet相关对象,可以使用`...

    struts2 中action 如何获取jsp 页面参数1.pdf

    `ServletActionContext`扩展了`ActionContext`,并提供了访问Servlet相关对象的便捷方法: ```java HttpServletRequest request = ServletActionContext.getRequest(); HttpSession session = ServletActionContext...

    Struts2 part 3:在Action中使用ServletAPI

    1. **HttpServletRequest对象**:Struts2通过`ActionContext`暴露了`HttpServletRequest`对象,使得Action可以直接访问请求参数、头信息、会话数据等。例如,你可以通过`ActionContext.getRequest().getParameter(...

    Struts2访问servlet分享

    在Struts2框架中,有时我们需要直接访问Servlet相关对象,如HttpServletRequest、HttpSession和ServletContext,以实现特定的功能。本文将探讨如何在Struts2中访问和操作这些对象。 **一、访问或添加request/...

    Struts2在Action中获得Response对象的四种方法

    通过这个接口,Struts2框架会在执行execute方法前自动将HttpServletResponse对象注入到Action类的成员变量中。例如: ```java public class MyAction extends ActionSupport implements ServletResponseAware { ...

Global site tag (gtag.js) - Google Analytics