有类public class Test{
   public static List getValue(){
      return new Value().getValue();
   }
}
public class Value{
    IOneDAO oneDAO;
    public List getValue(){
      System.out.println("---get here---");
      List list = oneDAO.findAll();
      return list;
   }
   oneDAO getter and setter...
}
说明:对oneDAO.findAll()已经进行测试(而且是通过页面请求action,Action再调用oneDAO.findAll()),会得到数据。
就是说,配置文件(S2SH)没有问题,数据库也有数据,但是页面调用getValue()方法,却不能得到数据,或者说是为空的数据。
这里原因其实很简单,就是没能让容器初始化oneDAO,所以oneDAO.findAll();不能工作。请教各位,我该怎么解决这个问题——不像一般流程那样Action中有个Biz引用,Biz又有个DAO引用,这样在application中一级一级配下来,当action被请求时,就能一级一级初始化了
补充:
已经在application中配置oneDAO了,前面讲的测试中就有用到了。

解决方案 »

  1.   

    而且后台也打印出
    ---get here---
    了,所以大家就把注意力放在 
    当程序运行到Value的getValue()时,如何让容器去调用setOneDAO()来初始化oneDAO
    上面!!!
      

  2.   

    小菜飘过...感觉是Static的问题
      

  3.   

    findAll已经工作了,说明配置应该正确吧
      

  4.   


    第一,
    后台也打印出 
    ---get here--- 

    第二,
    经测试,如果不用oneDAO.findAll();来取值,而代之以手工填值进List(比如通过for循环填入),那么页面可以取得到值的!
    当然,不知道各位所说static的问题究竟是不是指这方面的问题。
      

  5.   

    加了static之后,打印出get here只能说明调用方法没问题,oneDao是否能正常工作就不知道了.
    我想的是和编译及对象实例化的先后有关.不敢枉下结论,等待高手解答.
      

  6.   

    说实话,没看懂你要干啥
    既然使用spring配置了动态注入,为啥还要new Value()呢?  使用new Value()的话Value类中的oneDao又没有初始化,List list = oneDAO.findAll();应该报一个空指针异常才对,不知道你是没有写异常还是你的程序没有错,如果非要new的话你可以这样写
    public class Test
    {
       public static List getValue()
       {
         Value value = new Value();
         IOneDAO oneDAO = new IOneDAOImpl();//这里是IOneDAO的实现类
         value.setOneDAO(oneDAO); 
         return new Value().getValue();
       }
    }
      

  7.   

    最后一句代码有问题,应该是这样:
    public class Test 

      public static List getValue() 
      { 
        Value value = new Value(); 
        IOneDAO oneDAO = new IOneDAOImpl();//这里是IOneDAO的实现类 
        value.setOneDAO(oneDAO); 
        return value.getValue(); 
      } 
    }
      

  8.   

    new Value()时 oneDAO没有初始化....Value通过spring获得实例,不要new
      

  9.   


    不知道页面直接调用static方法,这样通过spring获得实例行不行啊!
    我去试试
      

  10.   

    public class Test{
       public static List getValue(){
          return new Value().getValue();
       }
    }
    public class Value{
        IOneDAO oneDAO;
        public List getValue(){
          System.out.println("---get here---");
          List list = oneDAO.findAll();
          return list;
       }
       oneDAO getter and setter...
    }你new Value()之后,没有给这个对象注入任何内容,到了List list = oneDAO.findAll();必然会报空指针。
    如果是在jsp里,代码可以类似处理,估计你知道了如何获取WebApplicationContext ctx 应该就明白了。Value v = new Value();
    WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(application);
    IOneDAO bdrd = (IOneDAO )ctx.getBean("oneDAO");
    v.setOneDAO();
      

  11.   


    Value v = new Value();
    WebApplicationContext ctx =    WebApplicationContextUtils.getWebApplicationContext(application);
    IOneDAO dao = (IOneDAO )ctx.getBean("oneDAO");
    v.setOneDAO(dao);
    List l = v.getValue();
      

  12.   

    首先要说明的一点是:spring的依赖注入机制必须要在配置文件中配置
    在action中调用oneDAO.findAll()能成功的原因是:
    oneDAO被初始化了,为什么呢?因为spring集成了struts2,意思就是说对action
    进行了拦截,当检测到oneDAO在配置文件中有配置,就会给他初始化,
    但在页面就不行了,或者说在任何其他没有在配置文件中配置的类中声明成员变量
    oneDAO是不会被spring容器初始化的。
    如果你一定要用,就必须得配置,那么请问,你在页面要怎么调用呢?
      

  13.   


    受教了!我知道可以自己来初始化,TestCase就是自己来初始化配置文件的bean嘛,
    当然我对如何获取WebApplicationContext ctx 的原理及应用还是处于初级阶段
    看来还是这样解决比较好!
      

  14.   

    页面可以直接调用静态方法的呀:<s:iterator value="@com.util.Test@getValue()" status="stu" id="value">
    <option><s:property value="value"/></option>
    </s:iterator>就能迭代取出啦!当然struts2.X的版本需要在struts.xml中配
    <constant name="struts.ognl.allowStaticMethodAccess" value="true" />
      

  15.   

    如果不在actoin中调用确实比较麻烦,需要手动从容器中取
    WebApplicationContext ctx=    WebApplicationContextUtils.getWebApplicationContext(application); 
    IOneDAO bdrd= (IOneDAO )ctx.getBean("oneDAO"); 
    这种方法类似于获取jndi
      

  16.   


    现在问题是页面是直接访问静态方法,没有经过spring容器,所有这个application就无处可拿了。
    String[] locations = {"classpath:applicationContext.xml", "classpath:applicationContext-DAO.xml"};
    ApplicationContext ctx = new ClassPathXmlApplicationContext(locations);
    也无法完成,真是费解