2

在我的 SpringMVC 项目中,我需要某种策略来调用一个类,该类解析一个确实拥有我的 RMI 服务器 ip 和端口的 xml 文件,并且 url 必须与 servletContext url 相关:

HttpServletRequest request;    
request.getServletContext().getRealPath("/WEB-INF/LABLAB/RMI-Config.xml")

我想在 tomcat 中启动我的应用程序时加载这些类,而不是在我调用控制器类时加载这些类,因为我的应用程序依赖于我的 RMI,所以在其他任何事情之前,我必须解析我的文件并使用 IP 和 PORT 字段开始连接到我的 RMI & 然后调用 rmi 方法稍后做一些事情......

现在

我要怎么做?请告诉我如何初始化 HttpServletRequest 的实例并在我不在 Controller 类时给出初始值。

谢谢

4

2 回答 2

3

您正在使用 Spring,那么您可以创建一个类并实现IntializingBean。如果你想掌握ServletContext你可以在初始化 bean 中简单地使用@Autowired注释。例如:

@Component
public class SomeBean implements InitializingBean {

    @Autowired
    private ServletContext context;   

    public void afterPropertiesSet() throws Exception {
       String path = context.getRealPath("/WEB-INF/LABLAB/RMI-Config.xml");
       //do something.
    }
}

根据文档:

IntializingBean - 由 BeanFactory 设置所有属性后需要做出反应的接口实现。

或者看看这里如何使用ServletContextListener.

于 2013-02-28T13:15:59.860 回答
2

您需要实现该ServletContextListener接口并从您的web.xml

<listener>
    <listener-class>InitializingListener</listener-class>
</listener>

该接口有一个contextInitialized(ServletContextEvent sce)方法,您可以在其中调用sce.getServletContext(),因此您不需要HttpServletRequest.

如果这不起作用,因为您还需要从初始化类访问一些 Spring bean,然后忘记实现ServletContextListener接口,而是执行以下操作:

  1. 通过 Spring 实例化您的初始化类(制作该类型的 bean)。
  2. 使类实现ServletContextAware。这将导致 Spring 将 注入ServletContext到您的类中。
  3. 在该 bean 上定义一个 init 方法(使用init-methodbean 属性,或定义一个带@PostConstruct注释的方法)
  4. 使用depends-onbean 属性使所有控制器 bean 依赖于初始化 bean。因此,初始化 bean 将在任何 Controller bean 之前创建。

如果没有最后一步,就无法保证您的控制器不会在初始化 bean 完成其工作之前开始处理请求。但是,depends-on在每个控制器 bean 上指定属性也是有问题的,尤其是它们通常是通过应用@Controller注释而不是 xml 配置来创建的。这篇文章中描述了一个很好的解决方法。

于 2013-02-28T13:12:50.970 回答