struts2中 ValueStack的set方法与setValue方法的区别呢?

示例代码:

ActionContext.getContext().getValueStack().setValue("myname22", "ttt");

区别

(1)setValue 方法必须要求有该属性的setter方法,否则会报错:

Error setting expression'myname22' with value 'ttt' - [unknown location]

set方法设置的属性与该action没有任何关系,所以就算action中没有该属性的setter方法,调用

ActionContext.getContext().getValueStack().set("myname22", "ttt");

也不会报错。


(2)setValue方法设置的是action的属性(action中有属性myname22),在value stack 中对应的是action的属性;

而set方法设置的属性会放在一个hashmap中,与当前的action没有任何瓜葛,但是两者都在value stack中,set方法设置的属性可以通过 <s:property value="myname22"  />来取值。


共同点

(1)setValue和set方法设置的属性可以通过

String myname2=(String)ServletActionContext.getContext().getValueStack().findValue("myname22");

来取值;


(2)在result指向的JSP页面中都可以通过 <s:property value="myname22"  />来取值(setValue方法设置的属性必须要有对应的getter方法)。


action代码:

package example;
import org.apache.struts2.ServletActionContext;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionSupport;
public class GetValueAction extends ActionSupport {
    private static final long serialVersionUID = 4865100826143278474L;
    private String myname=null;
//  private String myname22;
    @Override
    public String execute() throws Exception {
        ActionContext.getContext().getValueStack().set("myname22", "ttt");
        String myname2=(String)ServletActionContext.getContext().getValueStack().findValue("myname22");
        System.out.println("gg:"+myname2);
//      System.out.println("myname2: "+this.myname);
        return super.execute();
    }
    public String getMyname() {
        return myname;
    }
    public void setMyname(String myname) {
        this.myname = myname;
    }
//  public String getMyname22() {
//      return myname22;
//  }
//
//  public void setMyname22(String myname22) {
//      System.out.println("abc:"+myname22);
//      this.myname22 = myname22;
//  }
                                                     
//  public String getMyname22() {
//      return myname22;
//  }
                                                     
}


总结:

set方法和setValue方法设置的属性都可以通过<s:property value="myname22"  />取值。