Переменная экземпляра в полосах - PullRequest
1 голос
/ 09 апреля 2011

Я пытаюсь найти способ создания переменной экземпляра в контексте приложения Stripes.Что-то, что я бы сделал в методе сервлета init() при использовании сервлетов с ручной кодировкой.Проблема заключается в том, что, поскольку экземпляр ActionBean создается при каждом обращении к приложению, переменная в actionBean создается несколько раз.Я пытался найти какое-то разумное место в полосе, пытаясь вызвать ServletContext через ActionBeanContext.getServletContext(), но оттуда нет способа получить доступ к методу init() и написать в нем некоторый код.у вас есть предложения?

Ответы [ 3 ]

1 голос
/ 10 апреля 2011

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, вам нужно добавить init-param в фильтр Stripes в файле web.xml.:

    <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..
  }
}

Альтернативное решениеНа мой взгляд, старшим решением является использование каркаса для зависимостей для внедрения ( singleton ) объектов в ваши actionbeans.См. Пример конфигурации Stripes здесь: Injecting Stripes ActionBeans с Guice DI

0 голосов
/ 05 июня 2011

@ JBoy, Вы должны указать свою реализацию ServletContextListner в web.xml, как показано ниже

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

Спасибо KDeveloper за его совет. Я также искал решение. Я нашел информацию из его блога

Есть еще один метод, который я обнаружил. Для этого вы должны создать подкласс класса "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>

Вы также должны создать подкласс ActionBeanContext, как сказал KDeveloper; получить объект в ActionBeans

Это мой вывод. Я узнал, что это работает. Но я не знаю, есть ли у него побочные эффекты. Если оно есть; пожалуйста, прокомментируйте ..

0 голосов
/ 09 апреля 2011

Не для использования с полосами, а с использованием стандартного API сервлета, который вы реализуете ServletContextListener и выполняете работу методом contextInitialized().Если вы зарегистрируете его как <listener> в web.xml (или, если вы уже используете Java EE 6, аннотируйте с помощью @WebListener), он будет работать во время запуска веб-приложения.как это доступно в EL ${somename} и во всех бинах действия ServletContext#getAttribute().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...