Stripes中的实例变量

时间:2011-04-09 12:16:31

标签: instance-variables init stripes

我正在尝试找到一种在Stripes应用程序上下文中创建实例变量的方法。 我在使用手工编码的servlet时在Servlet的init()方法中会做的事情。 问题是,由于每次访问应用程序时都会创建ActionBean的实例,因此会多次创建actionBean中的变量。 我试图通过条纹尝试通过ServletContext调用ActionBeanContext.getServletContext()来获得一些合理的位置,但是从那里无法访问init()方法并在其中编写一些代码。< / p>

你有什么建议吗?

3 个答案:

答案 0 :(得分: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 context factory知道您想要使用自定义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..
  }
}

在我看来,另一种解决方案是使用dependency injection框架将(singleton)对象注入到您的动作束中。请参阅此处的条带配置示例:Injecting Stripes ActionBeans with Guice DI

答案 1 :(得分:0)

不是Stripes特定的方式,而是使用您实现ServletContextListener的标准Servlet API并在contextInitialized()方法中完成工作。如果您在<listener>中将其注册为web.xml(或者当您已在Java EE 6上注册时使用@WebListener进行注释),那么它将在webapp启动期间运行。

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

这种方式可以在EL ${somename}ServletContext#getAttribute()的所有动作bean中使用。

答案 2 :(得分:0)

@JBoy,您必须在web.xml中指定ServletContextListner的实现,如下所示

<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中的对象

这是我的发现。我发现它有效。但我不知道它是否有任何副作用。如果有的话;请评论..