springtest-servlet.xml中<bean id="myFormController" class="packagename.MyFormController">
<property name="userBo" ref="userBo"/>
</bean>package packagename;
public class MyFormController extends SimpleFormController{
  private UserBo userBo;
  public void setUserBo(UserBo userBo){
    this.userBo = userBo;
  }
  public void otherMethod(){
    userBo.method();
  }
}

解决方案 »

  1.   

    我指的不是这种用法,2楼的用法是他们内部的使用,我想通过程序来获得在ApplicationContext.xml中配置的bean。
    比如,类似ClassPathResource resource = new ClassPathResource("beans.xml");
    BeanFactory factory = new XmlBeanFactory(resource);
    这种,先获得BeanFactory,然后再根据bean的id,再获得bean.
    但是我不知道在web中怎么样做上面的。
    在springframwork的使用手册上有下面这一段话,我看不懂.
    3.8.4. ApplicationContext在WEB应用中的实例化
    与BeanFactory通常以编程的方式被创建不同的是,ApplicationContext能以声明的方式创建,如使用ContextLoader。当然你也可以使用ApplicationContext的实现之一来以编程的方式创建ApplicationContext实例。首先,让我们先分析ContextLoader接口及其实现。ContextLoader接口有两个实现:ContextLoaderListener和ContextLoaderServlet。两者都实现同样的功能,但不同的是,ContextLoaderListener不能在与Servlet 2.2兼容的web容器中使用。根据Servlet 2.4规范, servlet context listener要在web应用程序的servlet context建立后立即执行,并要能够响应第一个请求(在servlet context要关闭时也一样):这样一个servlet context listener是初始化Spring ApplicationContext的理想场所。虽然使用哪个完全取决于你,但是在同等条件下应该首选ContextLoaderListener;对于更多兼容性的信息,请查看ContextLoaderServlet的JavaDoc。你可以象下面那样使用ContextLoaderListener来注册一个ApplicationContext:<context-param>
      <param-name>contextConfigLocation</param-name>
      <param-value>/WEB-INF/daoContext.xml /WEB-INF/applicationContext.xml</param-value>
    </context-param><listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener><!-- or use the ContextLoaderServlet instead of the above listener
    <servlet>
      <servlet-name>context</servlet-name>
      <servlet-class>org.springframework.web.context.ContextLoaderServlet</servlet-class>
      <load-on-startup>1</load-on-startup>
    </servlet>
    -->
    监听器首先检查contextConfigLocation参数,如果它不存在,它将使用/WEB-INF/applicationContext.xml作为默认值。如果已存在,它将使用分隔符(逗号、冒号或空格)将字符串分解成应用上下文将位置路径。ContextLoaderServlet同ContextLoaderListener一样使用'contextConfigLocation'参数。
      

  2.   

    在web应用中通过程序来获取spring管理的bean不太现实,
    实现了ApplicationContextAware接口的bean可以获取ApplicationContext实例,不过该bean也必须是由spring ioc容器来管理的,说到底还是在spring内部使用。
    如果用applicationContext ac = new ClassPathXmlApplicationContext("/WEB-INF/applicationContext.xml");就没意义了。
      

  3.   

    受教了。
    按楼上的说法,就是用二楼的方法来使用了?
    还是自己对spring的了解不太清楚啊。
    现在我自己想做一个小例子,融合spring ,struts.不知道各位大侠有没有好的建议。
      

  4.   

    恩,把你想用来调用spring bean的类也交给spring来管理。
      

  5.   

    BeanFactory beanFactory = new ClassPathXmlApplicationContext("applicationContext-*.xml");UserBo pm = (UserBo)beanFactory.getBean("userBo");

    就这样就好了,很简单得
    UserBo是你的com.hmis.kh.bo.UserBoImpl这个实现类对应的接口
      

  6.   

    我试了一下楼上的,还是不行啊,出现错误。
    org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:408)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:360)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    root cause org.springframework.beans.factory.BeanDefinitionStoreException: IOException parsing XML document from class path resource [applicationContext.xml]; nested exception is java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:364)
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:126)
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:142)
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:168)
    org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:113)
    org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:79)
    org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:94)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:292)
    org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:92)
    org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:77)
    org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:68)
    com.hmis.kh.web.controller.LoginController.onSubmit(LoginController.java:28)
    org.springframework.web.servlet.mvc.SimpleFormController.onSubmit(SimpleFormController.java:408)
    org.springframework.web.servlet.mvc.SimpleFormController.onSubmit(SimpleFormController.java:380)
    org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:267)
    org.springframework.web.servlet.mvc.AbstractFormController.handleInvalidSubmit(AbstractFormController.java:656)
    org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:257)
    org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:45)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:820)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:755)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:396)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:360)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    root cause java.io.FileNotFoundException: class path resource [applicationContext.xml] cannot be opened because it does not exist
    org.springframework.core.io.ClassPathResource.getInputStream(ClassPathResource.java:137)
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:351)
    org.springframework.beans.factory.xml.XmlBeanDefinitionReader.loadBeanDefinitions(XmlBeanDefinitionReader.java:334)
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:126)
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:142)
    org.springframework.beans.factory.support.AbstractBeanDefinitionReader.loadBeanDefinitions(AbstractBeanDefinitionReader.java:168)
    org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:113)
    org.springframework.context.support.AbstractXmlApplicationContext.loadBeanDefinitions(AbstractXmlApplicationContext.java:79)
    org.springframework.context.support.AbstractRefreshableApplicationContext.refreshBeanFactory(AbstractRefreshableApplicationContext.java:94)
    org.springframework.context.support.AbstractApplicationContext.refresh(AbstractApplicationContext.java:292)
    org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:92)
    org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:77)
    org.springframework.context.support.ClassPathXmlApplicationContext.<init>(ClassPathXmlApplicationContext.java:68)
    com.hmis.kh.web.controller.LoginController.onSubmit(LoginController.java:28)
    org.springframework.web.servlet.mvc.SimpleFormController.onSubmit(SimpleFormController.java:408)
    org.springframework.web.servlet.mvc.SimpleFormController.onSubmit(SimpleFormController.java:380)
    org.springframework.web.servlet.mvc.SimpleFormController.processFormSubmission(SimpleFormController.java:267)
    org.springframework.web.servlet.mvc.AbstractFormController.handleInvalidSubmit(AbstractFormController.java:656)
    org.springframework.web.servlet.mvc.AbstractFormController.handleRequestInternal(AbstractFormController.java:257)
    org.springframework.web.servlet.mvc.AbstractController.handleRequest(AbstractController.java:153)
    org.springframework.web.servlet.mvc.SimpleControllerHandlerAdapter.handle(SimpleControllerHandlerAdapter.java:45)
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:820)
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:755)
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:396)
    org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:360)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:802)应该是没有找到xml文件,ClassPathXmlApplicationContext类是用的classpath路径吧。
    我在spring的api中找到一个XmlWebApplicationContext类,不知道他怎么用啊,用的时候也出错。
      

  7.   

    使用XmlWebApplicationContext不用在web.xml中进行配置吧,我记得spring的技术手册上写的是,applicationContext.xml是默认的名字,不用再进行配置的,对吗?
    我的web.xml中的配置如下:
    <servlet>
    <servlet-name>springtest</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>2</load-on-startup>
    </servlet>

    <servlet-mapping>
    <servlet-name>springtest</servlet-name>
    <url-pattern>*.do</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
    <servlet-name>springtest</servlet-name>
    <url-pattern>*.htm</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
    <servlet-name>springtest</servlet-name>
    <url-pattern>*.html</url-pattern>
    </servlet-mapping>

    <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
    <welcome-file>index.htm</welcome-file>
    </welcome-file-list>在我的问题中提到的有两个spring配置文件,
    1 springtest-servlet.xml
    2 applicationContext.xml
    我感觉,1为spring的web MVC使用的,主要来配置控制器,拦截器,视图之类。
    而在2中应该是自的项目应用的bean,比如数据库联接池,业务bean之类的。
    不知道理解的对吗。
      

  8.   

    applicationContext.xml是默认名字,但在web.xml里还要添加那个listener
    <listener>
      <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    applicationContext.xml才会被装载springtest会装载springtest-servlet.xml
    在我的问题中提到的有两个spring配置文件,
    1 springtest-servlet.xml
    2 applicationContext.xml
    我感觉,1为spring的web MVC使用的,主要来配置控制器,拦截器,视图之类。
    而在2中应该是自的项目应用的bean,比如数据库联接池,业务bean之类的。
    不知道理解的对吗。
    ==========================
    这个是这样的
      

  9.   

    最好是通过注入获取bean,不能使用注入的地方,如自己编写的标签的地方可以通过下面这种方法WebApplicationContext wac = WebApplicationContextUtils.getRequiredWebApplicationContext(request.getSession().getServletContext());UserBo userBo = (UserBo)wac.getBean("userBo");