if(goodsModel!=null){ return goodsModel;}
      else
{
            goodsModel   =   new   ListDataModel(); 
                SqlMapClient   sqlMap   =   MySqlMapClient.getSqlMapClient();             
                goodsModel.setWrappedData(sqlMap.queryForList(getSql(),getGoodsSearch())); 
                
                System.out.println( "run   count   :   "   +   count); 
                return   goodsModel; 
                }catch(SQLException   ex){ 
                        return   null; 
                } 
}

解决方案 »

  1.   

    在一次Request内,只要涉及到取GoodsModel值就执行getGoodsModel()一次,因此,需要按照上面的写法具体在生命周期那个阶段,可以自己调试一下(利用PhaseListener),自己估计是在更新模型值和呈现响应(取得GoodsModel的内容才能画出来啊)两个阶段。1.恢复视图 -- JSF引擎将页面模型转换为树状的对象模型。此时只是一个模型而已,里面没有值。(如果说模具是不是更容易理解?)2.应用请求值: -- 获取了页面传过来的值 ,这时候还没有把数据放到模型中,仅仅是拿到了“手上”。3.转换和验证: ---- 检查一下“手上”这些数据是不是合法的合理的4.更新模型值:---- 合法之后放到了模型中。这时候模型中才有了传过来的值,也就是被传过来的数据所填充。5.调用应用程序:就是执行Action或者Listener方法6.呈现响应: 把执行的结果返回给用户(response)页面对应的java程序就是所谓的Backing Bean 。
      

  2.   

    在一次Request内,只要涉及到取GoodsModel值就执行getGoodsModel()一次,因此,需要按照上面的写法具体在生命周期那个阶段,可以自己调试一下(利用PhaseListener),自己估计是在更新模型值和呈现响应(取得GoodsModel的内容才能画出来啊)两个阶段。1.恢复视图 -- JSF引擎将页面模型转换为树状的对象模型。此时只是一个模型而已,里面没有值。(如果说模具是不是更容易理解?)2.应用请求值: -- 获取了页面传过来的值 ,这时候还没有把数据放到模型中,仅仅是拿到了“手上”。3.转换和验证: ---- 检查一下“手上”这些数据是不是合法的合理的4.更新模型值:---- 合法之后放到了模型中。这时候模型中才有了传过来的值,也就是被传过来的数据所填充。5.调用应用程序:就是执行Action或者Listener方法6.呈现响应: 把执行的结果返回给用户(response)页面对应的java程序就是所谓的Backing Bean 。
      

  3.   

    if(goodsModel!=null){   return   goodsModel;}
                else
    {
                            goodsModel       =       new       ListDataModel();  
                                    SqlMapClient       sqlMap       =       MySqlMapClient.getSqlMapClient();                          
                                    goodsModel.setWrappedData(sqlMap.queryForList(getSql(),getGoodsSearch()));  
                                   
                                    System.out.println(   "run       count       :       "       +       count);  
                                    return       goodsModel;  
                                    }catch(SQLException       ex){  
                                                    return       null;  
                                    }  
    }
    这样不行的,我做得有查询,页面有一个查询按钮,getGoodsSearch()是查询条件,
    每次查询都是,
    count为1时 :恢复视图:此时的查询条件莫名其妙的为:null  比如此时getGoodsSearch().name 输出 null
    count为2时 :然后:getGoodsSearch()里面才是正常的数据 比如此时getGoodsSearch().name 输出 张三
      

  4.   

    在一次Request内,只要涉及到取GoodsModel值就执行getGoodsModel()一次具体在生命周期那个阶段,可以自己调试一下(利用PhaseListener),自己估计是在更新模型值和呈现响应(取得GoodsModel的内容才能画出来啊)两个阶段。1.恢复视图 -- JSF引擎将页面模型转换为树状的对象模型。此时只是一个模型而已,里面没有值。(如果说模具是不是更容易理解?)2.应用请求值: -- 获取了页面传过来的值 ,这时候还没有把数据放到模型中,仅仅是拿到了“手上”。3.转换和验证: ---- 检查一下“手上”这些数据是不是合法的合理的4.更新模型值:---- 合法之后放到了模型中。这时候模型中才有了传过来的值,也就是被传过来的数据所填充。5.调用应用程序:就是执行Action或者Listener方法6.呈现响应: 把执行的结果返回给用户(response)页面对应的java程序就是所谓的Backing Bean 。
      

  5.   

    我做的是分页,数据没有缓存到goodsModel
    更加郁闷的是页面查询的数据是对的,比如我现在查看的是第三页此时我调用goodsModel.getRowData()
    得到的结果确是第一页的数据行
      

  6.   

    public class Test {
        private String name;    public String getName() {
            System.out.println("getName" + name);
            return name;
        }    public void setName(String name) {
            this.name = name;
        }
        
        public String comm(){
           // System.out.println(getName());
            return "go";
        }}
    这最简单的代码,如在页面name中录入:小李 在点击了button按钮执行comm()后
    也会执行两次
    打印
    getNamenull
    getname小李
    这个到不影响结果,只是郁闷为什么恢复视图时不是  小李?多点击两次也是这样!
      

  7.   

    对了这个后台参数我用的是 request
    如果用session 虽然执行两次 但goodsModel.getRowData() 
    取出来的数据还是对的
      

  8.   

    没有问题的我检查好多次了
    可能第一次就是所谓的恢复视图吧!不过这种每次都需要执行我两次sql
    而且我必须用 session 
    不然提取数据的时候还会出错!
    还没有理解:
    用request恢复视图时是null,然后是新查询的数据
    用session恢复视图时是上次的数据,然后是新查询的数据
    那么我getRowData()在request状态下得到的是 恢复视图时的数据(为什么不是新查询的数据?)
    在session下得到的确是新查询的数据得到的结果怎么会不一致?
     public DataModel getGoodsModel(){
            try{
            if(goodsModel==null){
                goodsModel = new ListDataModel();
            }
            SqlMapClient sqlMap = MySqlMapClient.getSqlMapClient();      
            goodsModel.setWrappedData(sqlMap.queryForList(getSql(),getGoodsSearch()));
            System.out.println(GoodsBase.class + " getGoodsModel");
            System.out.println(getGoodsSearch().getName()+  " " + getGoodsSearch().getStart());
    //        System.out.println(getGoodsSearch().getStart());
    //        for(int i=0;i<goodsModel.getRowCount();i++){
    //            goodsModel.setRowIndex(i);
    //            System.out.println(goodsModel.getRowData());
    //        }
            
            return goodsModel;
            }catch(SQLException ex){
                return null;
            }
        }
    注释的地方会打印两次数据,不喜欢这种莫名奇妙的恢复!