`
mj4d
  • 浏览: 299993 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

struts2中ActionContext和各种Context转化

阅读更多

这里主要来了解struts2的上下文容器:ActionContext。作为struts2执行Action时的上下文,存储了action在执行时需要用到的对象。如我们需要关注的ServletContext,Session, HttpServletRequest ,parameters等。下面是获取这些值的代码

        ActionContext ctx = ActionContext.getContext();
        //Returns a Map of the ServletContext when in a servlet environment or a generic application level Map otherwise.
        Map<String, Object> smap = ctx.getApplication();
        //struts2的context
        Map<String, Object> s2map = ctx.getContextMap();
        //获取原生的HttpServletRequest
        HttpServletRequest request = (HttpServletRequest) ctx.get(StrutsStatics.HTTP_REQUEST);
        //获取请求参数
        Map<String, Object> pmap = ctx.getParameters();
        //Session
        Map<String, Object> session = ctx.getSession();

 

这里我们来关注下ServletContext,在一个spring作为IOC容器的web工程中返回ServletContext信息如下:

org.springframework.web.context.WebApplicationContext.ROOT:  org.springframework.web.context.support.XmlWebApplicationContext@1a3ae73: display name [Root WebApplicationContext]; startup date [Tue Jul 10 13:56:33 CST 2012]; root of context hierarchy
org.apache.catalina.jsp_classpath:/H:/worksa/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/s2web/WEB-
org.apache.jasper.compiler.TldLocationsCache:  org.apache.jasper.compiler.TldLocationsCache@13a46b6
org.apache.tomcat.InstanceManager:  org.apache.catalina.core.DefaultInstanceManager@65dbe8
contextConfigLocation:  classpath:spring.xml
javax.servlet.context.tempdir:  H:\worksa\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\work\Catalina\localhost\_
org.apache.tomcat.JarScanner:  org.apache.tomcat.util.scan.StandardJarScanner@1563e06
org.apache.catalina.resources:  org.apache.naming.resources.ProxyDirContext@1487217

如上,我们可以获取WebApplicationContext:

        WebApplicationContext context = (WebApplicationContext) smap.get(WebApplicationContext.ROOT_WEB_APPLICATION_CONTEXT_ATTRIBUTE);

这样我们就获得了spring的上下文环境,比如我们可以取得bean(虽然大多数时候我们不需要这样做)

DataSource dateSource = (DataSource) context.getBean("dataSource");
 

 

如果有需要的话,我们可能更关注servlet参数

//获取请求参数
Map<String, Object> pmap = ctx.getParameters();

这里会获取页面form表单中input的值:包括hidden\text\submit(file除外)等,即便是页面的表单中enctype="multipart/form-data" ,当然这个时候也只能获得非file表单的值。如一个页面表单的值:

age:  [Ljava.lang.String;@1715c20
username:  [Ljava.lang.String;@14d3b51
query:  [Ljava.lang.String;@1575c7e

其实我们知道对于enctype="multipart/form-data" 能够获取到form表单的值,完全得益于

<interceptor name="fileUpload" class="org.apache.struts2.interceptor.FileUploadInterceptor"/>

及其底层采用的common-fileupload实现

    <bean type="org.apache.struts2.dispatcher.multipart.MultiPartRequest" name="jakarta" class="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest" scope="default" />
    <constant name="struts.multipart.handler" value="jakarta" />

 

但是对于原生的HttpServletRequest来说,如果表单的编码为enctype="multipart/form-data" 就没那么简单了,通常是通过读取Stream的方法并通过解析结果返回,如:

        BufferedReader bufferReader = new BufferedReader(request.getReader());
        String line = null;
        StringBuilder buffer = new StringBuilder();

        try {
            while ((line = bufferReader.readLine()) != null) {
                System.out.println(line);
                buffer.append(line);
            }
        } catch (IOException e) {
        }

 

这里顺便介绍下对form表单编码为enctype="multipart/form-data" 时,获取到contentType为

multipart/form-data; boundary=---------------------------265001916915724

后面的boundary是一个不会和文件内容重复的串并通过他把多个文件或者输入域分割开来。如上面的表单会打印

-----------------------------265001916915724
Content-Disposition: form-data; name="age"

aaa
-----------------------------265001916915724
Content-Disposition: form-data; name="username"

123
-----------------------------265001916915724
Content-Disposition: form-data; name="query"

查询
-----------------------------265001916915724--

注意这里request.getReader()如果getInputStream已经被调用会抛出异常IllegalStateException 

 

 

 

 

分享到:
评论

相关推荐

    struts2中的ActionContext与ognl

    NULL 博文链接:https://lijiejava.iteye.com/blog/628636

    ActionContext介绍(在Struts2中)

    在Web应用程序开发中,除了将请求参数自动设置到Action的字段中,我们往往也需要在Action里直接获取请求(Request)或会话 (Session)的一些信息, 甚至需要直接对JavaServlet Http的请求(HttpServletRequest),响应...

    基于struts2注册登录ActionContext.zip

    struts2大量使用拦截器来处理请求,从而允许与业务逻辑控制器 与 servlet-api分离,避免了侵入性(所谓侵入性就是指的这个架构设计出来的部件对系统的影响范围,标签库几乎可以完全替代JSTL的标签库,并且 struts2.x...

    struts2OGNL表达式ActionContext及valuesStack.pdf

    struts2OGNL表达式ActionContext及valuesStack.pdf

    Struts2中Servlet的配置

    Struts2和Servlet 1、在struts2的action中可以通过实现ServletResponseAware/ServletResquestAware接口 (org.apache.struts2.inteceptor.ServletResponseAware/ServletResquestAware)直接访问 HttpServletResponse/...

    struts2_OGNL表达式ActionContext及valuesStack

    struts2 OGNL,struts2 表达式语言,Struts2 中OGNL表达式的用法,Struts2 #,表达式语言的好处,Struts2 $,struts2 井号,星号,百分号

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

    NULL 博文链接:https://zhouhaitao.iteye.com/blog/1126042

    Struts2 in action中文版

    6.7.2 Struts 2中常用的表达式语言特性 131 6.7.3 表达式语言的高级特性 135 6.8 小结 137 第7章 UI组件标签 139 7.1 为什么需要UI组件标签 139 7.2 标签、模板和主题 144 7.2.1 标签 146 7.2.2 模板 146 7.2.3 ...

    Struts2 ActionContext 中的数据详解

    主要介绍了Struts2 ActionContext 中的数据详解,需要的朋友可以参考下

    struts2流程与流程图

    一个请求在Struts 2框架中的处理大概分为以下几个步骤。...Struts 2的核心控制器是FilterDispatcher,有3个重要的方法:destroy()、doFilter()和Init(),可以在Struts 2的下载文件夹中找到源代码,如代码1所示。

    ActionContext在struts2.0中的详细应用

    ActionContext(com.opensymphony.xwork.ActionContext)是Action执行时的上下文,上下文可以看作是一个容器(其实我们这里的容器就是一个Map而已),它存放放的是Action在执行时需要用到的对象

    西安领航核心项目Struts2重点、难点总结

    对Struts2框架中的相关知识还有困惑的同学有福了,此次上传的是西安领航何足道老师的核心项目Struts2部分的重点难点的归纳总结,他对Struts2理解非常深刻,讲的非常的详细易懂,堪称经典。主要包括的知识有Action的...

    Struts2整合SiteMesh技巧

    注意ActionContextCleanUp过滤器必须在FilterDispatcher之前配置,ActionContextCleanUp的主要功能是通知FilterDispatcher执行完毕不要清除ActionContext,以便sitemesh装饰器可以访问Struts值堆栈。 配置装饰器 ...

    struts2-junit-plugin-2.1.8.jar

    可解决java.lang.NoSuchMethodError: com.opensymphony.xwork2.ActionContext.get(Ljava/lang/Object;)Ljava/lang/Object; java.lang.ClassNotFoundException: com.opensymphony.xwork2.util.TextUtils struts2.1.8...

    Struts2_TypeConvertion

    在Struts2中底层的session都被封装成了Map类型,我们称之为SessionMap,而平常我们所说的session则是指HttpSession对象,具体的获得方法如下所示。 A.Map session=ActionContext.getSession(); B.Map session=(Map...

    struts2验证码完整实例

    (参照别人的代码) 部署: 1、将整个源码引入到MyEclipse当中. 2、部署到Tomcat下面,启动服务器,直接 敲...2、当你登录时候,提交的输入框中的验证码和session中存放的验证码比较,如果一样,则通过,不一样,则失败

    Struts2 学习笔记

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 八、 Action通配符(wildcard)的配置 9 ...

    Struts2帮助```````

    01 Struts2-Action 5 一、 Struts作用: 5 二、 搭建Struts2的运行环境: 5 三、 Namespace 6 四、 标签 6 五、 Action 6 六、 路径问题的说明 8 七、 Action的动态调用方法 8 八、 Action通配符(wildcard)的配置 9 ...

    struts学习笔记(3)

    向页面传值可以使用struts2中特有的两个类的对象 com.opensymphony.xwork2.ActionContext和com.opensymphony.xwork2.util.ValueStack 1)ValueStack和ActionContext的作用: 当客户端向action发送请求并且最后跳转...

    struts2 标签库 帮助文档

    可以输出值栈、StackContext 、ActionContext中的值。 push:将某个值放入值栈。 set:设置一个新的变量。 text:输出国际化信息。 url:生成一个URL地址。 表单标签: checkbox标签:复选框。 checkboxlist标签...

Global site tag (gtag.js) - Google Analytics