struts 2中如何通过action手动获取参数

struts2中action手动获取Session,jsp页面参数

1. ActionContext

在Struts2开发中,除了将请求参数自动设置到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");

在执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个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();

2. ServletActionContext

ServletActionContext(com.opensymphony.webwork. ServletActionContext),这个类直接继承了我们上面介绍的ActionContext,

它提供了直接与Servlet相关对象访问的功能,它可以取得的对象有:

(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里取得Servlet的相关对象:

<1>取得HttpServletRequest对象: HttpServletRequest request = ServletActionContext. getRequest();

<2>取得HttpSession对象: HttpSession session = ServletActionContext. getRequest().getSession();

3. ServletActionContext和ActionContext联系

ServletActionContext和ActionContext有着一些重复的功能,在我们的Action中,该如何去抉择呢?

我们遵循的原则是:如果ActionContext能够实现我们的功能,那最好就不要使用ServletActionContext,让我们的Action尽量不要直接去访问Servlet的相关对象.

更多精彩内容:http://www.bianceng.cn/Programming/Java/

注意:在使用ActionContext时有一点要注意: 不要在Action的构造函数里使用ActionContext.getContext(),因为这个时候ActionContext里的一些值也许没有设置,

这时通过ActionContext取得的值也许是null;

同样,HttpServletRequest req = ServletActionContext.getRequest()也不要放在构造函数中,也不要直接将req作为类变量给其赋值。

至于原因,我想是因为前面讲到的static ThreadLocal actionContext = new ActionContextThreadLocal(),从这里我们可以看出ActionContext是线程安全的,

而ServletActionContext继承自ActionContext,所以ServletActionContext也线程安全,线程安全要求每个线程都独立进行,所以req的创建也要求独立进行,

所以ServletActionContext.getRequest()这句话不要放在构造函数中,也不要直接放在类中,

而应该放在每个具体的方法体中(eg:login()、queryAll()、insert()等),这样才能保证每次产生对象时独立的建立了一个req。

4. struts2中获得request、response和session

(1)非IoC方式

方法一:使用org.apache.struts2.ActionContext类,通过它的静态方法getContext()获取当前Action的上下文对象。

ActionContext ctx = ActionContext.getContext();

ctx.put("liuwei", "andy"); //request.setAttribute("liuwei", "andy");

Map session = ctx.getSession(); //session

HttpServletRequest request = ctx.get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);

HttpServletResponse response = ctx.get(org.apache.struts2.StrutsStatics.HTTP_RESPONSE);

细心的朋友可以发现这里的session是个Map对象, 在Struts2中底层的session都被封装成了Map类型.

我们可以直接操作这个Map对象进行对session的写入和读取操作, 而不用去直接操作HttpSession对象.

方法二:使用org.apache.struts2.ServletActionContext类

public class UserAction extends ActionSupport {  

    //其他代码片段  

    private HttpServletRequest req;
    // private HttpServletRequest req = ServletActionContext.getRequest(); 这条语句放在这个位置是错误的,同样把这条语句放在构造方法中也是错误的。  

    public String login() {
        req = ServletActionContext.getRequest(); //req的获得必须在具体的方法中实现
        user = new User();
        user.setUid(uid);
        user.setPassword(password);
        if (userDAO.isLogin(user)) {
            req.getSession().setAttribute("user", user);
            return SUCCESS;
        }
        return LOGIN;
    }
   public String queryAll() {
        req = ServletActionContext.getRequest(); //req的获得必须在具体的方法中实现
        uList = userDAO.queryAll();
        req.getSession().setAttribute("uList", uList);
        return SUCCESS;
    }  

    //其他代码片段
}

(2)IoC方式(即使用Struts2 Aware拦截器)

要使用IoC方式,我们首先要告诉IoC容器(Container)想取得某个对象的意愿,通过实现相应的接口做到这点。

public class UserAction extends ActionSupport implements SessionAware, ServletRequestAware, ServletResponseAware {  

    private HttpServletRequest request;
    private HttpServletResponse response;  

    public void setServletRequest(HttpServletRequest request) {
        this.request = request;
    }  

    public void setServletResponse(HttpServletResponse response) {
        this.response = response;
    }  

    public String execute() {
        HttpSession session = request.getSession();
        return SUCCESS;
    }

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索对象
, 线程
, threadlocal
, request
, servletrequestaware
, HttpServletRequest
, request.getSession
, getRequest
, ActionContext
直接
struts2 action 参数、struts action 参数、struts2 action带参数、struts action 带参数、struts2获取页面参数,以便于您获取更多的相关知识。

时间: 2024-09-19 09:14:13

struts 2中如何通过action手动获取参数的相关文章

Struts中不同的Action和ActionForm组合

在TSS.com上看到一篇好文,有关Struts使用中各种不同的Action和ActionForm组合的利弊.我先消化一下,整理好,供大家参考.原文标题:Struts action mappings: Divide Et Impera,作者:Michael Juravlev.在TSS上的URL:http://www.theserverside.com/articles/article.tss?l=StrutsActionMapping 说明:阅读本文需要一定的Struts基础.注:文中小写的ac

Struts构架中action的跳转详解

1.完整的action <action path="/aFullAction" type="somePackage.someActionClass"> name="someForm" input="someJSP.jsp" <forward name="successful" path="someJSP.jsp"/> <forward name="

C/C++中手动获取调用堆栈

C/C++中手动获取调用堆栈 当我们的程序core掉之后,如果能获取到core时的函数调用堆栈将非常有利于定位问题.在Windows下可以使用SEH机制:在Linux下通过gdb使用coredump文件即可. 但有时候由于某些错误导致堆栈被破坏,发生拿不到调用堆栈的情况. 一些基础预备知识本文不再详述,可以参考以下文章: 函数调用栈的获取原理分析 寄存器.函数调用与栈帧 需要知道的信息: 函数调用对应的call指令本质上是先压入下一条指令的地址到堆栈,然后跳转到目标函数地址 函数返回指令ret则

eclipse rcp-eclipse RCP开发中如何在Activator中获取plugin.xml中配置的action

问题描述 eclipse RCP开发中如何在Activator中获取plugin.xml中配置的action action是在extensions里重写eclipse提供的标准扩展点:org.eclipse.ui.actionSets.想在Activator中获取此action对象并调用setEnable()方法,达到控制按钮的可用和禁用状态.望各位大神帮忙! 解决方案 目前我也不会,但是需要积分

C/C++中手动获取调用堆栈【转】

转自:http://blog.csdn.net/kevinlynx/article/details/39269507 版权声明:本文为博主原创文章,未经博主允许不得转载. 当我们的程序core掉之后,如果能获取到core时的函数调用堆栈将非常有利于定位问题.在Windows下可以使用SEH机制:在Linux下通过gdb使用coredump文件即可. 但有时候由于某些错误导致堆栈被破坏,发生拿不到调用堆栈的情况. 一些基础预备知识本文不再详述,可以参考以下文章: 函数调用栈的获取原理分析 寄存器.

看看如何在Struts应用中施展AJAX魔法

ajax AJAX是最近在web开发流程中一次革命,它允许在一个普通的web浏览器中配置大量的动态效果.多年前Struts 都已经是Java-Web开发中的一个事实上的标准,在大量的应用中都已经使用了它.本文将告诉你,如何在你已经存在Struts应用中结合丰富的AJAX没Ы涌凇? 本文将介绍在JSP页面中包含一些JavaScript这样一个简单而有效的方法来结合AJAX和Struts.在此我们介绍如何重新使用已经存在的Struts actions,但此技术同样可用于你选择的其他Java-Web

Struts 2中的struts.xml配置文件

是使用Struts2主要的配置文件,在这个文件中可以配置action,拦截器,result和reslut类型,视图以及视图类型等. 它是我们使用Sturts2开发工作的重点要关注的配置文件.struts.xml文件要放到在src源文件夹,源文件夹的东西将被编译 到classes文件夹下面.struts.xml文件的内容如程序清单所示. <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configurati

在Struts 2中使用JSON Ajax支持

JSON插件提供了一种名为json的ResultType,一旦为某个Action指定了一个类型为json的Result,则 该Result无需映射到任何视图资源.因为JSON插件会负责将Action里的状态信息序列化成JSON格式的数据 ,并将该数据返回给客户端页面的JavaScript. 简单地说,JSON插件允许我们在JavaScript中异步调用Action,而且Action不再需要使用视图资源来 显示该Action里的状态信息,而是由JSON插件负责将Action里的状态信息返回给调用页

jsp-怎么在action里获取到JSP里的数据

问题描述 怎么在action里获取到JSP里的数据 如题 这些数据包括select radio text的,中间经过struts,求大神指导 解决方案 Struts2 action里获取ip地址 解决方案二: struts1~还是2. 2有OHNL表达式,可直接封装到对象.属性就好.1的话,可以传参,在action类里写private String xx生成get.set方法就可以使用该属性. 解决方案三: 在将表单提交给action之后通过action对应的form(struts1.x)或ac