有类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了,前面讲的测试中就有用到了。
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了,前面讲的测试中就有用到了。
---get here---
了,所以大家就把注意力放在
当程序运行到Value的getValue()时,如何让容器去调用setOneDAO()来初始化oneDAO
上面!!!
第一,
后台也打印出
---get here---
了
第二,
经测试,如果不用oneDAO.findAll();来取值,而代之以手工填值进List(比如通过for循环填入),那么页面可以取得到值的!
当然,不知道各位所说static的问题究竟是不是指这方面的问题。
我想的是和编译及对象实例化的先后有关.不敢枉下结论,等待高手解答.
既然使用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();
}
}
public class Test
{
public static List getValue()
{
Value value = new Value();
IOneDAO oneDAO = new IOneDAOImpl();//这里是IOneDAO的实现类
value.setOneDAO(oneDAO);
return value.getValue();
}
}
不知道页面直接调用static方法,这样通过spring获得实例行不行啊!
我去试试
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();
Value v = new Value();
WebApplicationContext ctx = WebApplicationContextUtils.getWebApplicationContext(application);
IOneDAO dao = (IOneDAO )ctx.getBean("oneDAO");
v.setOneDAO(dao);
List l = v.getValue();
在action中调用oneDAO.findAll()能成功的原因是:
oneDAO被初始化了,为什么呢?因为spring集成了struts2,意思就是说对action
进行了拦截,当检测到oneDAO在配置文件中有配置,就会给他初始化,
但在页面就不行了,或者说在任何其他没有在配置文件中配置的类中声明成员变量
oneDAO是不会被spring容器初始化的。
如果你一定要用,就必须得配置,那么请问,你在页面要怎么调用呢?
受教了!我知道可以自己来初始化,TestCase就是自己来初始化配置文件的bean嘛,
当然我对如何获取WebApplicationContext ctx 的原理及应用还是处于初级阶段
看来还是这样解决比较好!
<option><s:property value="value"/></option>
</s:iterator>就能迭代取出啦!当然struts2.X的版本需要在struts.xml中配
<constant name="struts.ognl.allowStaticMethodAccess" value="true" />
WebApplicationContext ctx= WebApplicationContextUtils.getWebApplicationContext(application);
IOneDAO bdrd= (IOneDAO )ctx.getBean("oneDAO");
这种方法类似于获取jndi
现在问题是页面是直接访问静态方法,没有经过spring容器,所有这个application就无处可拿了。
String[] locations = {"classpath:applicationContext.xml", "classpath:applicationContext-DAO.xml"};
ApplicationContext ctx = new ClassPathXmlApplicationContext(locations);
也无法完成,真是费解