0

我有一个突然需要重新打包为 WAR 的 JAR(不要问为什么)。它将部署在 Tomcat 上。我想知道web.xml指示 Tomcat 部署应用程序并运行通常由 JAR 方法调用的main(String[])方法的最低设置是什么(就 conf 文件和任何其他 conf 文件而言):

public class AppDriver {
    public static void main(String[] args) {
        AppDriver app = new AppDriver();
        app.run();
    }

    // This is the method I need ran by Tomcat at deploy-time.
    public void run() {
        // ...
    }
}

由于我没有使用 Spring 或任何其他类型的 MVC 框架,并且由于没有 servlet 或需要 CDI/上下文,我想我web.xml可以很简单;但令人惊讶的是,我找不到任何解释我需要什么的东西。

我还想我需要以run()某种方式注释该方法,或者在web.xml. 但这就是我卡住的地方。提前致谢。

4

3 回答 3

0

您可以实现ServletContextListener,在这种情况下,当 tomcat 部署您的应用程序并启动它时,您的contextInialized方法将被调用,在该方法中您调用您的 run 方法。

然后在 web.xml 中,您将在listener标签下为您的类添加一个条目。

以上方法适用于 2.5 及以下的 servlet 规范

如果您使用的是 Servlet Spec 3.0,您可以简单地@ServletContextListener向您的类添加注释,而无需在 web.xml 中进行配置,当您的应用程序启动时,它将被您的容器调用。

于 2012-06-06T16:04:44.127 回答
0

修改您的AppDriverDaemon thread并从该ServletContextListener.contextInitialized()方法启动线程。

@WebListener
//Use the above annotation if it is Servlet 3.0
AppDriverInitializer implements ServletContextListener
{

   public void contextInitialized(ServletContext ctx)
   { 
      Thread appDriverThread = new Thread() {
         public void run() {
         //Have your AppDriver class run() method implemented here...
         }
      }
      appDriverThread.start();
   }
}

在你的 WAR 中定义 ServletContextListener 监听器有两种方式之一

  • 在 web.xml 中定义监听器

    <listener> <listener-class> AppDriverInitializer </listener-class> </listener>

  • 如果您使用 Servlet 3.0 容器,请使用@WebListener注解

于 2012-06-06T16:15:37.793 回答
0

如果您想与您的 web 应用程序进行外部通信,您将需要一个 WSDL。除此之外,这里是一个示例 web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app
  xmlns="http://java.sun.com/xml/ns/j2ee"
  xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
  http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
  version="2.4">
  <display-name>SemanticAdaptationCoreService</display-name>
  <welcome-file-list>
    <!-- You can skip this part -->
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  <!-- context-params allow you to pass parameters to your app at runtime -->
  <context-param>
    <param-name>param1</param-name>
    <param-value>value1</param-value>
  </context-param>

  <!-- You can provide a listener class to handle WSDL requests -->
  <listener>
    <listener-class>your.listener.AClass</listener-class>
  </listener>

  <!-- the initializer servlet allows you to run custom methods when the webapp is loaded -->
  <servlet>
    <servlet-name>initializer</servlet-name>
    <servlet-class>your.Initializer</servlet-class>
    <!-- a 1 value requests running the class at load time -->
    <load-on-startup>1</load-on-startup>
  </servlet>
</web-app>

确保您的类扩展HttpServlet并覆盖public void init()将在加载时调用的方法。

于 2012-06-06T16:16:30.963 回答