action类如下:public class AddAction extends ActionSupport{
private double a;
private double b;
private double sum;
public double getA(){return a;}
public void setA(double a){this.a=a;}
public double getB(){return b;}
public void setB(double b){this.b=b;}
public double getSum(){return sum;}
public void setSum(double b){this.sum=sum;}
public String execute() throws Exception{
sum=a+b;
return "success";
}
}
jsp如下:
<form action="add.action" method="post">
     第一个数字:<input type="text" name="a"/><br/>
     第二个数字:<input type="text" name="b"/><br/>
     <input type="submit" value="加"/>
    </form>
问题1:值栈中的值,所谓的对象是指action类对象,还是什么?对于这个有很多种说法,有的人叫里面的值为属性,有的叫对象如果通过OGNL的[N]语法,如何定位到某一对象或者所谓属性?问题2:值栈中的值是存了action所有接受的参数,但是是否存储了action类里面自定义的属性?如果以上代码的sum我不写get和set方法,那么我将无法在另外一个jsp中从值栈中获得sum的值。为什么会这样?问题3:我通过如下方法都可以获得参数的值:(前提是sum有get和set方法)
    使用变量名称a:<s:property value="a"></s:property>
    使用变量get方法B<s:property value="getB()"></s:property>
    使用变量名称sum:<s:property value="sum"/>
    使用$getsum:${sum}
    使用$geta:${a}
    在学习struts ognl的时候,$符号并没有涉及get值栈里面值的作用,这个$符号应该不是OGNL的语法吧?
    例外,如果写成${getA()},这样无法获得值,将会报错。问题比较多,但真心想求得真相!

解决方案 »

  1.   


    你在页面里加标签 <s:debug></s:debug>看里面堆栈的内容。这里里面的东西如果有那是可以直接使用的。
      

  2.   

    看下这篇
    http://apps.hi.baidu.com/share/detail/31941919
      

  3.   

    ${}是jsp2.0的el语法,是不支持直接调用方法的。
    在struts2里面,只有%{}语法,表示解析里面的数据,里面可以调用方法
    <s:property 里面的数据可以是属性, 也可以调用方法,默认是调用当前最top的对象的数据。
      

  4.   

    支持2楼
    在结果页面加上<s:debug></s:debug>
    可以看得到值栈
    上半部份可以直接用OGNL表达式取得
    下半部份加上#
      

  5.   

    struts tag 是通过get来获取值,set输入值的,所以sum没有set的话一样可以通过get取到值,只要在action中定义的“属性”有get&set都可以会出现在stack中,不管是接收到的还是在action中定义的。取值的时候直接用变量名,不用写get,struts会帮你重新编译的。
      

  6.   

    1,值栈是一个集合对象,里面包括的是action对象,而${}是el表达式(sun公司推荐使用的).
    2,和第一个问题是关联的,存的是你的action对象,对象当然所定义的属性,而你不写setXXX和getXXX方法,你提交的
    属性怎么被set(设置)进去,而得到时也是掉用的getXXX方法,没有set值,get的只有空或报错了.
    3,${}el(Express Language)表达式,1中提到的
    我的学习建议
    1,先学el表达式-->自定义标签
    2,查看ongl.jar的源码