我必须在服务器启动时执行struts2操作,而不是在第一个请求上执行。
答案 0 :(得分:5)
在启动应用程序时加载数据是一项常见任务,您可以在Web上找到几个示例。正如在其他答案中所说,你应该实现一个ServletContextListener(特定于Struts2)......你可以read a great example here。
这里重要的是理解行动概念:
在Struts2 MVC
(模型视图控制器)框架中,Action
是Controller
(并且是Model
的一部分)。
Action
的{{1}}调用 Request
(并且每个请求都创建一个Action,因此它们是线程安全的。)
这意味着您需要一个客户端,通常意味着一个人在电脑前点击浏览器...然后,客户端调用不是执行自动化的正确触发器,对共享对象的服务器端操作。
当然你可以实现某种形式的Client
(例如在自定义拦截器的帮助下),这样第一个用户就可以在Application范围内设置一些内容,而其他用户将检索该对象已经填充了,但这不是最好的方法(你应该在初始化时处理并发性,你会有一个用户,第一个,等待服务器在启动时可能在晚上完成的操作...... )。
答案 1 :(得分:3)
编写一个ServletContextListener,每个Web应用程序只能使用一个,并在部署应用程序时进行实例化。
以下是post
答案 2 :(得分:2)
在servlet和jsp启动时加载,如下所示
您可以在服务器启动时要求加载页面。这是通过web.xml
文件
<servlet>
<servlet-name>login</servlet-name>
<jsp-file>/login.jsp</jsp-file>
<load-on-startup>1</load-on-startup>
</servlet>
通常jsp文件在首次点击时编译。 现在代码说预编译一个jsp文件而不等待第一次命中。
For struts2 you can change programatically in web.xml
<listener>
<listener-class>your listener class</listener-class>
</listener>
参考此链接可能对您有所帮助
答案 3 :(得分:2)
如果您想要在 Web应用程序(又名 Servlet Context )首次启动时运行某些代码,那么您应该利用该技术提供的钩子。 Servlet API提供生命周期钩子,供您在Web应用程序的各个生命周期阶段触发代码。由于所有Struts 2应用程序都是 Servlet API Web应用程序,因此您可以自己利用它。
ServletContextListener接口提供了一个init hook方法。您只需实现此接口并在web.xml中注册您的实现。
注意,如果你需要做的是更具体的Struts 2,那么你可以考虑使用Struts 2 API本身的东西。