2

私のSpringMVCプロジェクトでは、RMIサーバーのIPとポートを所有するxmlファイルを解析するクラスを呼び出すための特定の戦術が必要です。URLはservletContext urlに関連している必要があります。

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

アプリケーションがRMIに依存しているため、コントローラクラスを呼び出すときではなく、Tomcatでアプリケーションを起動するときにこれらのクラスをロードしたいので、何よりも先にファイルを解析し、IPおよびPORTフィールドを使用してRMIへの接続を開始する必要があります& 次に rmi メソッドを呼び出して、後でいくつかの作業を行います ...

どうやってやるの?HttpServletRequest のインスタンスを初期化する方法を教えてください & コントローラークラスにいないときに初期値を与える方法も教えてください。

ありがとうございました

4

2 に答える 2

3

Spring を使用している場合は、クラスを作成してIntializingBeanを実装できます。把握したい場合は、初期化 Bean でアノテーションをServletContext簡単に使用できます。@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 によって設定された後に反応する必要がある Bean によって実装されるインターフェース。

または、こちらを使用してこれを行う方法をご覧ください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 属性を使用して、すべての Controller Bean を初期化 Bean に依存させます。その結果、初期化 Bean はコントローラー Bean の前に作成されます。

最後のステップがないと、初期化 Bean が作業を完了する前にコントローラーが要求の処理を開始しないという保証はありません。ただし、depends-onすべてのコントローラー Bean で属性を指定することも問題があります。特に、それらは通常@Controller、xml 構成の代わりに注釈を適用することによって作成されるためです。適切な回避策については、この投稿で説明しています。

于 2013-02-28T13:12:50.970 に答える