`

struts2值栈

阅读更多
众所周知,Strut 2的Action类通过属性可以获得所有相关的值,如请求参数、Action配置参数、向其他Action传递属性值(通过chain结果)等等。要获得这些参数值,我们要做的唯一一件事就是在Action类中声明与参数同名的属性,在Struts 2调用Action类的Action方法(默认是execute方法)之前,就会为相应的Action属性赋值。

  要完成这个功能,有很大程度上,Struts 2要依赖于ValueStack对象。这个对象贯穿整个Action的生命周期(每个Action类的对象实例会拥有一个ValueStack对象)。当Struts 2接收到一个.action的请求后,会先建立Action类的对象实例,但并不会调用Action方法,而是先将Action类的相应属性放到ValueStack对象的顶层节点(ValueStack对象相当于一个栈)。只是所有的属性值都是默认的值,如String类型的属性值为null,int类型的属性值为0等。

  在处理完上述工作后,Struts 2就会调用拦截器链中的拦截器,当调用完所有的拦截器后,最后会调用Action类的Action方法,在调用Action方法之前,会将ValueStack对象顶层节点中的属性值赋给Action类中相应的属性。大家要注意,在这里就给我们带来了很大的灵活性。也就是说,在Struts 2调用拦截器的过程中,可以改变ValueStack对象中属性的值,当改变某个属性值后,Action类的相应属性值就会变成在拦截器中最后改变该属性的这个值。

  从上面的描述很容易知道,在Struts 2的的Action类可以获得与属性同名的参数值就是通过不同的拦截器来处理的,如获得请求参数的拦截器是params,获得Action的配置参数的拦截器是staticParams等。在这些拦截器内部读取相应的值,并更新ValueStack对象顶层节点的相应属性的值。而ValueStack对象就象一个传送带,将属性值从一个拦截器传到了另一个拦截器(当然,在这其间,属性值可能改变),最后会传到Action对象,并将ValueStack对象中的属性的值终值赋给Action类的相应属性


拦截器的源代码:
packageinterceptors;
importjava.util.Enumeration;
importjava.util.Map;
importjava.util.Properties;
importjava.io.InputStream;
importjava.io.FileInputStream;
importcom.opensymphony.xwork2.ActionContext;
importcom.opensymphony.xwork2.ActionInvocation;
importcom.opensymphony.xwork2.config.entities.ActionConfig;
importcom.opensymphony.xwork2.interceptor.AbstractInterceptor;
importcom.opensymphony.xwork2.util.ValueStack;
publicclassPropertyInterceptorextendsAbstractInterceptor
{
  privatestaticfinalStringDEFAULT_PATH_KEY="path";
  privatestaticfinalStringDEFAULT_ENCODING_KEY="encoding";
  privatestaticfinalStringDEFAULT_SEPARATOR_KEY="separator";
  protectedStringpathKey=DEFAULT_PATH_KEY;
  protectedStringencodingKey=DEFAULT_ENCODING_KEY;
  protectedStringseparatorKey=DEFAULT_SEPARATOR_KEY;
  publicvoidsetPathKey(StringpathKey)
  {
    this.pathKey=pathKey;
  }
  publicvoidsetEncodingKey(StringencodingKey)
  {
    this.encodingKey=encodingKey;
  }
  publicvoidsetSeparatorKey(StringseparatorKey)
  {
    this.separatorKey=separatorKey;
  }
  @Override
  publicStringintercept(ActionInvocationinvocation)throwsException
  {
    ActionConfigconfig=invocation.getProxy().getConfig();
    Map<String,String>parameters=config.getParams();
    if(parameters.containsKey(pathKey))
    {
      Stringpath=parameters.get(pathKey);
      Stringencoding=parameters.get(encodingKey);
      Stringseparator=parameters.get(separatorKey);
      if(encoding==null)
        encoding="UTF-8";
      if(separator==null)
        separator="";
      path=invocation.getAction().getClass().getResource(path)
          .getPath();
      Propertiesproperties=newProperties();
      InputStreamis=newFileInputStream(path);
      java.io.Readerreader=newjava.io.InputStreamReader(is,encoding);
      
      properties.load(reader);
      ActionContextac=invocation.getInvocationContext();
      ValueStackstack=ac.getValueStack();
      System.out.println(stack.hashCode());
      Enumerationnames=properties.propertyNames();
      while(names.hasMoreElements())
      {
        // 下面会使用setValue方法修改ValueStack对象中的相应属性值
        Stringname=names.nextElement().toString();
        if(!name.contains("."))
          stack.setValue(name,properties.get(name));
        StringnewName=null;
        newName=parameters.get(name.replaceAll(".",""));
        if(newName!=null)
          stack.setValue(newName,properties.get(name));
        if(!separator.equals(""))
        {
          newName=name.replaceAll(".","");
          stack.setValue(newName,properties.get(name));
        }        
        newName=name.replaceAll(".",separator);
        stack.setValue(newName,properties.get(name));
      }
    }
    returninvocation.invoke();
  }
}

用于测试的Action类的源代码:
packageactions;
publicclassMyAction
{
  privateStringname;
  privateIntegerprice;
  privateStringlog4jappenderstdout;
  privateStringlog4j_rootLogger;
  privateStringconversionPattern;
  publicStringgetName()
  {
    returnname;
  }
  publicvoidsetName(Stringname)
  {
    this.name=name;
  }
  publicIntegergetPrice()
  {
    returnprice;
  }
  publicvoidsetPrice(Integerprice)
  {
    this.price=price;
  }
  publicStringgetLog4jappenderstdout()
  {
    returnlog4jappenderstdout;
  }
  publicvoidsetLog4jappenderstdout(Stringlog4jappenderstdout)
  {
    this.log4jappenderstdout=log4jappenderstdout;
  }
  publicStringgetLog4j_rootLogger()
  {
    returnlog4j_rootLogger;
  }
  publicvoidsetLog4j_rootLogger(Stringlog4j_rootLogger)
  {
    this.log4j_rootLogger=log4j_rootLogger;
  }
  publicStringgetConversionPattern()
  {
    returnconversionPattern;
  }
  publicvoidsetConversionPattern(StringconversionPattern)
  {
    this.conversionPattern=conversionPattern;
  }
  publicStringexecute()
  {
    System.out.println("name:"+name);
    System.out.println("price:"+price);
    System.out.println("log4jappenderstdout:"+log4jappenderstdout);
    System.out.println("log4j_rootLogger:"+log4j_rootLogger);
    System.out.println("conversionPattern:"+conversionPattern);
    returnnull;
  }
}
[/size][/size][/size][/size][/size][/size][/size]
分享到:
评论

相关推荐

    Struts2值栈的理解

    Struts2值栈的理解Struts2值栈的理解Struts2值栈的理解

    struts2的值栈

    用一个小小的flash来形象的演示struts2中值栈的操作过程,非常直观!

    struts2--3.Ognl与值栈

    struts2--3.Ognl与值栈

    j2ee 培训之Struts2教程

    01 Struts2入门 02 Struts2拦截器 03 Struts2值栈与类型转换 04 Struts2标签 05 Struts2验证和国际化 06 Struts2 CRUD 07 Struts2 研讨

    struts2模拟

    struts2模拟模拟工具,可以实现action访问,我表单属性的自动封装。提供了页面显示和跌带器,利用struts2值栈(valueStack)和对象栈map栈的思想。可以用来了解struts2的执行过程,纯属个人学习

    马士兵Struts2笔记2013

    建立一个Struts2 工程,用Action的属性接收参数,使用Domain Model (实体模型) 接收参数,Struts2_2.1.6版本的中文问题,Struts模块包含,Struts简单数据验证 ,Struts ValueStack(值栈) Debug,Value Stack ...

    linjin101#javaStudy#Struts2中的OGNL和值栈ValueStack1

    1、什么是值栈 2、值栈的内部结构 3、ActionContext和ValueStatck的关系 4、如何获取值栈对象 5、向值栈存数据 6、从值栈中获取数据

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

    对Struts2框架中的相关知识还有困惑的同学有福了,此次上传的是西安领航何足道老师的核心项目Struts2部分的重点难点的归纳总结,...主要包括的知识有Action的动态调用方法、值栈、拦截器、ActionContext、Ognl表达式等

    尚硅谷Java视频_Struts2视频教程

    每个技术点都配备案例和代码,对于拦截器、Struts2 运行流程分析、值栈等技术点的讲授更是深入解析源代码,授之以渔。  学习完本Java视频教程,你会真正理解 Struts2 的优雅和简洁,并使你具备开发 Struts2 企业...

    Struts2入门教程(全新完整版)

    1.值栈入门 22 2.OGNL入门 24 3.普通方法访问 24 4.静态方法访问 24 5.默认类Math的访问 24 6.调用普通类的构造方法 25 7.集合对象初步 25 8.集合对象进阶 25 9.N语法top语法 26 10.获取Stack Context中的信息 26 11...

    struts2 标签库使用文档

    Struts2标签库的组成 ...数据访问标签:主要包含用于输出值栈(ValueStack)中的值,完成国际化等功能的标签。 流程控制标签:主要包含用于实现分支,循环等流程控制的标签。 AJAX标签:用于支持Ajax效果

    struts2 OGNL之&lt;s:property&gt;标签访问值栈(value stack)用法

    struts2 OGNL之标签访问值栈(value stack)用法,希望能对大家有帮助

    Struts2环境配置与基本操作演示

    Struts2入门介绍、环境配置与基本操作演示,包含OGNL,值栈与域概念

    Struts2登录实例--亲测可用

    Struts2登录实例--亲测可用,拦截器,Action,值栈......都用到了

    详解Java的Struts框架中栈值和OGNL的使用

    主要介绍了Java的Struts框架中栈值和OGNL的使用,Struts框架是Java的SSH三大web开发框架之一,需要的朋友可以参考下

    struts2标签库的综合应用

    struts2 标签库使用说明.Struts2中通用标签可以分为二类:控制标签和数据标签。控制标签用于呈现页面时控制执行流程,数据标签用于访问值栈中的数据。

    struts2类型转换和验证流程图

    可以详细了解struts2的流程,便于学习和研究struts2,大家可以交流学习。

    栈的简单代码

    值栈(ValueStack)是Struts2的一个核心概念,类似于正常的栈,符合后进先出的 栈的特点,可以在值栈中放入、删除和查询对象。Strtus2对OGNL进行了扩充,将值栈作为OGNL的根对象。 什么是值栈?符合先进后出的特点,能给...

    struts2 标签库 帮助文档

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

    Struts2由浅入深学习教程(46集)

    本视频对 Struts2 庞杂的技术点进行抽丝剥茧,提炼出企业开发必备的核心技术和重要技能。每个技术点都配备案例和代码,对于拦截器、Struts2 运行流程分析、值栈等技术点的讲授更是深入解析源代码,授之以渔。

Global site tag (gtag.js) - Google Analytics