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

Java 嵌入Tomcat并向部署的应用程序发出请求,java,tomcat,tdd,htmlunit,Java,Tomcat,Tdd,Htmlunit,好吧,我完全卡住了。我想在嵌入式模式下运行Tomcat,这样我就可以测试应用程序,而无需在单独的进程中运行服务器。我错过了一些简单、愚蠢、重要的事情,我需要你的帮助才能看到 此测试失败,出现HTTP错误400,请求错误。我已经尝试过MemoryProtocolHandler、context.invoke()、。。。我不知道该怎么办。也许你看到了一些简单的东西 package ca.jbrains.jsfunit.learning.test; import org.apache.catalina

好吧,我完全卡住了。我想在嵌入式模式下运行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"); } } 包ca.jbrains.jsfunit.learning.test; 导入org.apache.catalina.Container; 导入org.apache.catalina.Context; 导入org.apache.catalina.Engine; 导入org.apache.catalina.connector.connector; 导入org.apache.catalina.connector.Request; 导入org.apache.catalina.realm.MemoryRealm; 导入org.apache.catalina.startup.Embedded; 导入org.junit.After; 导入org.junit.Test; 导入com.gargoylesoftware.htmlunit.WebClient; 公共类学习已被删除为Tomcattest{ 私有嵌入式; 专用容器主机; 私人发动机; @试验 public void deploySampleApplicationFromFileSystem()引发异常{ 字符串tomcatPath=“/Users/jbrains/ThirdParty/apache-tomcat-5.5.28-embed”; //创建嵌入式服务器 嵌入式=新的嵌入式(); 嵌入式.setCatalinaHome(tomcatPath); setRealm(newmemoryrealm()); //创建引擎 engine=embedded.createEngine(); setDefaultHost(“localhost”); //创建默认虚拟主机 host=embedded.createHost(“localhost”,tomcatPath+“/webapps”); engine.addChild(主机); //创建应用程序上下文 Context Context=embedded.createContext(“TddJsfWeb”),tomcatPath +“/webapps/TddJsfWeb”); host.addChild(上下文); //安装已组装的容器层次结构 嵌入式.加法器(发动机); //组装并安装默认HTTP连接器 Connector Connector=embedded.createConnector(“localhost”,8080, “http”); 嵌入式连接器(连接器); //启动嵌入式服务器 嵌入式.setAwait(true); embedded.start(); WebClient WebClient=新的WebClient(); webClient.getPage(“http://localhost:8080/TddJsfWeb/static.xhtml"); } } 解包的.war肯定位于
/Users/jbrains/ThirdParty/apache-tomcat-5.5.28-embed/webapps/TddJsfWeb/…
静态.xhtml
位于解包的.war文件夹的根目录中


求你了,求你了,让我看看我有多蠢。谢谢。

我和Tomcat有过类似的经历。我最终改用了Jetty,从代码的角度来看,它更易于管理。

我对Tomcat也有过类似的体验。我最终改用了Jetty——从代码的角度来看,管理起来要简单得多。

为此,我想使用Jetty而不是Tomcat。。要运行Jetty,我只需要:

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);
               }
       }
}
我想在Tomcat上开个码头。。要运行Jetty,我只需要:

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);
               }
       }
}

如果Jetty对你来说工作得很好,那就太棒了,但是如果你想更深入地了解Tomcat,你可以在发出请求之前浏览一下你的应用程序,看看它们是否可用。

对于(容器cont:host.findChildren()){
if(cont instanceof StandardContext){
StandardContext ctx=(StandardContext)cont;
ServletContext=ctx.getServletContext();
debug(“上下文初始化:{}”,servletContext.getContextPath());
字符串前缀=servletContext.getRealPath(“/”);
试一试{
if(ctx.resourcesStart()){
调试(“资源已启动”);
}
log.debug(“上下文可用:{}特权:{},开始时间:{},可重新加载:{}”,新对象[]{ctx.getAvailable(),ctx.getPrivileged(),ctx.getStartTime(),ctx.getReloadable();
...

第三种选择是查看一个比Tomcat或Jetty更简单的容器,例如Winstone:

如果Jetty对您来说运行良好,那就太棒了,但是如果您想深入了解Tomcat,您可以在发出请求之前浏览您的应用程序,看看它们是否可用。

对于(容器cont:host.findChildren()){
if(cont instanceof StandardContext){
StandardContext ctx=(StandardContext)cont;
ServletContext=ctx.getServletContext();
debug(“上下文初始化:{}”,servletContext.getContextPath());
字符串前缀=servletContext.getRealPath(“/”);
试一试{
if(ctx.resourcesStart()){
调试(“资源已启动”);
}
log.debug(“上下文可用:{}特权:{},开始时间:{},可重新加载:{}”,新对象[]{ctx.getAvailable(),ctx.getPrivileged(),ctx.getStartTime(),ctx.getReloadable();
...

第三种选择是查看一个比Tomcat或Jetty更简单的容器,例如Winstone:

我很担心。我本来想使用Jetty,但是因为我和一个想使用Tomcat的人一起工作,所以我选择了它。我很担心。我本来想使用Jetty,但是因为我和一个想使用Tomcat的人一起工作想要使用Tomcat,我就这么做了。我沿着这条路走了,走得更远。现在我正在尝试将JSFUnit与Jetty一起使用,但它并没有完全按照预期工作。我必须弄清楚更多。你在使用Jasper吗?(我对JSF的了解到此为止……))我沿着这条路走了很长一段路。现在我正在尝试将JSFUnit与Jetty一起使用,但它并没有完全按照预期工作。我必须弄清楚更多。你在使用Jasper吗?(我对JSF的了解到此为止……)