1

Stripesアプリケーションコンテキスト内でインスタンス変数を作成する方法を見つけようとしています。init()手作業でコーディングされたサーブレットを使用しているときに、サーブレットのメソッドで行うこと。問題はActionBean、アプリケーションにアクセスするたびにのインスタンスが作成されるため、actionBeanの変数が複数回作成されることです。ServletContextStripesがviaを呼び出そうとして妥当な場所を取得しようとしましたActionBeanContext.getServletContext()が、そこからinit()メソッドにアクセスしてコードを記述する方法がありません。

何か提案はありますか?

4

3 に答える 3

1

ActionBeanContextは、Stripesアプリケーションコンテキストでもあります。このコンテキストはカスタマイズ可能であり、必要なものを含めることができます。いくつかのサンプルコード:

package my.app;

public class CustomActionBeanContext extends ActionBeanContext {
  public CustomActionBeanContext() {
    super();
  }

  public MyObject getMyObject() {
      return (MyObject) getServletContext().getAttribute(“myObject”);
  }

  // Alternative solution without ServletContextListner
  private static MyObject2 myObject2;
  static {
     myObject2 = new MyObject2();
  }

  public MyObject2 getMyObject2() {
      return myObject2;
  }
}

StripesコンテキストファクトリにカスタムActionBeanContextを使用することを通知するには、web.xmlのStripesフィルターにinit-paramを追加する必要があります。

    <init-param>
        <param-name>ActionBeanContext.Class</param-name>
        <param-value>my.app.CustomActionBeanContext</param-value>
    </init-param>

SerlvetContextListenerを追加することにより、サーバーの起動時にオブジェクトを初期化できます。

Public class MyServletContextListener implements ServletContextListener {
@Override
  public void contextInitialized(ServletContextEvent event) {
    event.getServletContext().setAttribute("myObject", new MyObject());
}

ActionBeanの例:

public class MyAction implements ActionBean {
  private CustomActionBeanContext context;

  @Override
  public CustomActionBeanContext getContext() {
    return context;
  }

  @Override
  public void setContext(ActionBeanContext context) {
    this.context = (CustomActionBeanContext) context;
  }

  @DefaultHandler
  public Resolution view() {
    MyObject  myObject = getContext().getMyObject();
    // doing something usefull with it..
  }
}

私の意見では、別の解決策は、依存性注入フレームワークを使用して(シングルトン)オブジェクトをアクションBeanに注入することです。こちらのStripes構成例を参照してください:GuiceDIを使用したStripesActionBeansの注入

于 2011-04-09T20:37:14.110 に答える
0

ストライプ固有の方法ではありませんが、標準のサーブレットAPIを使用して実装し、メソッドServletContextListenerでジョブを実行しますcontextInitialized()。として登録した場合<listener>web.xmlまたはすでにJava EE 6を使用している場合は、を使用して注釈を付け@WebListenerます)、Webアプリケーションの起動時に実行されます。

@Override
public void contextInitialized(ServletContextEvent event) {
    event.getServletContext().setAttribute("somename", new SomeObject());
}

このようにして、ELby${somename}およびすべてのアクションBeanbyで使用できますServletContext#getAttribute()

于 2011-04-09T15:54:38.857 に答える
0

@ JBoy、以下のようにweb.xmlでServletContextListnerの実装を指定する必要があります

<listner>
   <listner-class>
        www.test.com.MyListner
   </listner-class>
</listner>

KDeveloperのアドバイスに感謝します。私も解決策を探していました。彼のブログから情報を見つけました

私が見つけたもう1つの方法があります。そのためには、「RuntimeConfiguration」クラスをサブクラス化する必要があります

public class MyConfiguration extends RuntimeConfiguration {
     @Override
     public void init() {
         getServletContext.setAttribute("myObject",new MyObject);
         super.init();
     }
}

その後、web.xmlで上記の構成を指定します。

<init-param>
   <param-name>Configuration.Class</param-name>
   <param-value>www.test.com.MyConfiguration</param-value>
</init-param>

KDeveloperが言ったように、ActionBeanContextもサブクラス化する必要があります。ActionBeansでオブジェクトを取得するには

これが私の発見です。私はそれが機能していることを知りました。しかし、副作用があるかどうかはわかりません。ある場合; コメントしてください..

于 2011-06-05T17:16:16.727 に答える