现有Action代码如下。public class CourseAction implements ModelDriven<Course> {

private Course course = new Course();

public Course getCourse() {
return course;
} public void setCourse(Course course) {
this.course = course;
}        public Course getModel() {
return course;
}        public String execute1(){
this.course.setId(999);
return SUCCESS;
}
        
public String execute2(){
Course c = new Course();
c.setId(999L);
this.course = c;
return SUCCESS;
}      
}在SUCCESS页面输出
id == ${id} <br>
course.id = = ${course.id}在execute1 结果中
id和course.id 的值均为 999
我表示理解!在execute2 结果中
id 为null
而course.id = = 999
我表示非常! 不能理解!!有哪位大鸟大虾能解释下吗?先谢了!

解决方案 »

  1.   

    this.course = c;
    这个出了问题!
      

  2.   

    这是一个有点复杂的问题!这个问题涉及到ognl语法的使用!如果我使用${id} 和${course.id}两种方式去获取对象的属性值的。按常理来说!如果使用${id}ognl会在struts2中寻找action 是否有getId()方法,如果有的话就会调用该方法,然后将之取出。如果没有,则会在action的属性course类型的对象去寻找,course是否有没有getId();主意这个过程中可能还要涉及到对属性类型的验证不是所有的类型,都可以转会一个String 类型的输出到一个页面。
    说先说你的第一种方法,course.setId(900) 将一个int toString 是没有问题的,所有都有值。
    第二种course.setId(900L) 就不能保证${id} ognl 一定能够通过数据的验证了。
      

  3.   

        public Course getCourse() {
            return course;
        }    public void setCourse(Course course) {
            this.course = course;
        }public String execute1(){
            this.course.setId(999);
            return SUCCESS;
        }
    以上去掉,在execute2 结果中看看id是否有值。
      

  4.   

    你一步一步的DBG看看Id是否有赋值。
      

  5.   

    同意此说法,你在action类中创建了实例对象。  private Course course = new Course();并创建了getter和setter方法,所以在执行在execute1()方法 结果中,会去寻找${id},而在执行execute2()方法 结果中,因为你创建了实例对象,初始值一定是null;你可以这样试试;
     public String execute2(){
            Course c = new Course();
            c.setId(999L);
            this.course = c;
            //改为:this.setCourse(c);
            return SUCCESS;
        }
      

  6.   


    Course c = new Course();
            c.setId(999L);
            this.course = c;
            //改为:this.setCourse(c);
            return SUCCESS;这个改的 不是和没改一样吗
      

  7.   

    我想了几天,现在觉得应该是modelDriven在Action之前就调用getModel拿到了course的引用,如果把course的引用地址改了,modelDriven的并不知晓,所以一直保持原值,而通过setProperty(),就可同时改变 course和model对象的属性。也就是说,之前model==course,之后model!=course
      

  8.   

    struts2不支持LZ的思路。只能分别用。