我正在尝试找到一种在Stripes应用程序上下文中创建实例变量的方法。
我在使用手工编码的servlet时在Servlet的init()
方法中会做的事情。
问题是,由于每次访问应用程序时都会创建ActionBean
的实例,因此会多次创建actionBean中的变量。
我试图通过条纹尝试通过ServletContext
调用ActionBeanContext.getServletContext()
来获得一些合理的位置,但是从那里无法访问init()
方法并在其中编写一些代码。< / p>
你有什么建议吗?
答案 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中的对象
这是我的发现。我发现它有效。但我不知道它是否有任何副作用。如果有的话;请评论..