代码之家  ›  专栏  ›  技术社区  ›  J. B. Rainsberger

嵌入tomcat并向部署的应用程序发出请求

  •  1
  • J. B. Rainsberger  · 技术社区  · 14 年前

    好吧,我完全卡住了。我想在嵌入式模式下运行tomcat,这样我就可以测试应用程序,而不必在单独的进程中运行服务器。我错过了一些简单、愚蠢和重要的东西,我需要你的帮助才能看到。

    此测试失败,出现http错误400,错误请求。我试过memoryProtocolhandler,context.invoke(),…我不知道该怎么办。也许你看到了一些简单的东西。

    package ca.jbrains.jsfunit.learning.test;
    
    import org.apache.catalina.Container;
    import org.apache.catalina.Context;
    import org.apache.catalina.Engine;
    import org.apache.catalina.connector.Connector;
    import org.apache.catalina.connector.Request;
    import org.apache.catalina.realm.MemoryRealm;
    import org.apache.catalina.startup.Embedded;
    import org.junit.After;
    import org.junit.Test;
    
    import com.gargoylesoftware.htmlunit.WebClient;
    
    public class LearnEmbeddedTomcatTest {
        private Embedded embedded;
        private Container host;
        private Engine engine;
    
        @Test
        public void deploySampleApplicationFromFileSystem() throws Exception {
            String tomcatPath = "/Users/jbrains/ThirdParty/apache-tomcat-5.5.28-embed";
    
            // Create an embedded server
            embedded = new Embedded();
            embedded.setCatalinaHome(tomcatPath);
            embedded.setRealm(new MemoryRealm());
    
            // Create an engine
            engine = embedded.createEngine();
            engine.setDefaultHost("localhost");
    
            // Create a default virtual host
            host = embedded.createHost("localhost", tomcatPath + "/webapps");
            engine.addChild(host);
    
            // Create an application context
            Context context = embedded.createContext("TddJsfWeb", tomcatPath
                    + "/webapps/TddJsfWeb");
            host.addChild(context);
    
            // Install the assembled container hierarchy
            embedded.addEngine(engine);
    
            // Assemble and install a default HTTP connector
            Connector connector = embedded.createConnector("localhost", 8080,
                    "http");
            embedded.addConnector(connector);
    
            // Start the embedded server
            embedded.setAwait(true);
            embedded.start();
    
            WebClient webClient = new WebClient();
            webClient.getPage("http://localhost:8080/TddJsfWeb/static.xhtml");
        }
    }
    

    没有包装的。战争肯定是在 /Users/jbrains/ThirdParty/apache-tomcat-5.5.28-embed/webapps/TddJsfWeb/... static.xhtml 在解压的.war文件夹的根目录中。

    求你了,求你了,告诉我我有多蠢。谢谢。

    3 回复  |  直到 14 年前
        1
  •  0
  •   Community omersem    7 年前

    我想 second 在Tomcat的码头上…我只需要:

    import java.awt.Desktop;
    import java.io.IOException;
    import java.net.URI;
    import java.net.URISyntaxException;
    
    import org.mortbay.jetty.Connector;
    import org.mortbay.jetty.Server;
    import org.mortbay.jetty.bio.SocketConnector;
    import org.mortbay.jetty.webapp.WebAppContext;
    
    public class StartJetty {
           public static void main(String[] args) throws Exception {
                   Server server = new Server();
                   SocketConnector connector = new SocketConnector();
                   // Set some timeout options to make debugging easier.
                   connector.setMaxIdleTime(1000 * 60 * 60);
                   connector.setSoLingerTime(-1);
                   connector.setPort(8081);
                   server.setConnectors(new Connector[] { connector });
    
                   WebAppContext bb = new WebAppContext();
                   bb.setServer(server);
                   bb.setContextPath("/");
                   bb.setWar("src/main/webapp");
                   server.addHandler(bb);
    
                   try {
                           System.out.println(">>> STARTING EMBEDDED JETTY SERVER, PRESS ANY
    KEY TO STOP");
                           server.start();
    
                           //Launch browser
                           if (Desktop.isDesktopSupported())
                                   if (Desktop.getDesktop().isSupported(Desktop.Action.BROWSE))
                                           try {
                                                   Desktop.getDesktop().browse(new URI("http://localhost:8081/"));
                                           }
                                           catch (IOException ioe) {
                                                   ioe.printStackTrace();
                                           }
                                           catch (URISyntaxException use) {
                                                   use.printStackTrace();
                                           }
    
                           System.in.read();
                           System.out.println(">>> STOPPING EMBEDDED JETTY SERVER");
                           server.stop();
                           server.join();
                   }
                   catch (Exception e) {
                           e.printStackTrace();
                           System.exit(100);
                   }
           }
    }
    
        2
  •  1
  •   gpampara    14 年前

    我和Tomcat也有过类似的经历。我最终使用了jetty——从代码的角度来看,管理起来要简单得多。

        3
  •  0
  •   Paul Gregoire    14 年前

    如果jetty对你很好,那就太棒了,但是如果你想深入研究tomcat,你可以在发出请求之前浏览一下你的应用程序,看看它们是否可用。

    for (Container cont : host.findChildren()) {
        if (cont instanceof StandardContext) {
            StandardContext ctx = (StandardContext) cont;
            ServletContext servletContext = ctx.getServletContext();
            log.debug("Context initialized: {}", servletContext.getContextPath());
            String prefix = servletContext.getRealPath("/");
            try {
                if (ctx.resourcesStart()) {
                    log.debug("Resources started");
                }
                log.debug("Context - available: {} privileged: {}, start time: {}, reloadable: {}", new Object[] { ctx.getAvailable(), ctx.getPrivileged(), ctx.getStartTime(), ctx.getReloadable() });
    ...
    
    第三种选择是查看比tomcat或jetty更简单的容器,例如winstone: http://winstone.sourceforge.net/