国外用python做的网站,可以做c 试题的网站,个人博客网页设计,微信小程序哪里找这篇文章是上一篇文章的逻辑延续。 唯一的区别是我们将使用的容器#xff1a;它将是我们的老兄Apache Tomcat而不是Jetty 。 令人惊讶的是#xff0c;嵌入最新的Apache Tomcat 7非常容易#xff0c;因此现在让我展示一下。 我不会重复完整的上一篇文章 #xff0c;因为除了… 这篇文章是上一篇文章的逻辑延续。 唯一的区别是我们将使用的容器它将是我们的老兄Apache Tomcat而不是Jetty 。 令人惊讶的是嵌入最新的Apache Tomcat 7非常容易因此现在让我展示一下。 我不会重复完整的上一篇文章 因为除了POM文件和Starter类之外没有任何更改。 除了这两个之外我们正在重用以前所做的一切。 对于POM文件我们需要删除Jetty依赖性并将其替换为Apache Tomcat 。 第一个更改将在properties部分中我们将用org.apache.tomcat替换org.eclipse.jetty.version 。 所以这行 org.eclipse.jetty.version8.1.8.v20121106/org.eclipse.jetty.version 变成 org.apache.tomcat7.0.34/org.apache.tomcat 第二个更改是依赖关系本身我们将替换以下行 dependencygroupidorg.eclipse.jetty/groupidartifactidjetty-server/artifactidversion${org.eclipse.jetty.version}/version
/dependencydependencygroupidorg.eclipse.jetty/groupidartifactidjetty-webapp/artifactidversion${org.eclipse.jetty.version/version
/dependency 这些 dependencygroupidorg.apache.tomcat.embed/groupidartifactidtomcat-embed-core/artifactidversion${org.apache.tomcat}/version
/dependencydependencygroupidorg.apache.tomcat.embed/groupidartifactidtomcat-embed-logging-juli/artifactidversion${org.apache.tomcat}/version
/dependency 太好了这部分完成了。 最后一部分专门讨论主类实现中的更改我们将用Apache Tomcat替换Jetty 。 package com.example;import java.io.File;
import java.io.IOException;import org.apache.catalina.Context;
import org.apache.catalina.loader.WebappLoader;
import org.apache.catalina.startup.Tomcat;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.cxf.transport.servlet.CXFServlet;
import org.springframework.web.context.ContextLoaderListener;
import org.springframework.web.context.support.AnnotationConfigWebApplicationContext;import com.example.config.AppConfig;public class Starter { private final static Log log LogFactory.getLog( Starter.class );public static void main(final String[] args) throws Exception {final File base createBaseDirectory();log.info( Using base folder: base.getAbsolutePath() );final Tomcat tomcat new Tomcat();tomcat.setPort( 8080 );tomcat.setBaseDir( base.getAbsolutePath() ); Context context tomcat.addContext( /, base.getAbsolutePath() );Tomcat.addServlet( context, CXFServlet, new CXFServlet() );context.addServletMapping( /rest/*, CXFServlet );context.addApplicationListener( ContextLoaderListener.class.getName() );context.setLoader( new WebappLoader( Thread.currentThread().getContextClassLoader() ) );context.addParameter( contextClass, AnnotationConfigWebApplicationContext.class.getName() );context.addParameter( contextConfigLocation, AppConfig.class.getName() );tomcat.start();tomcat.getServer().await();}private static File createBaseDirectory() throws IOException {final File base File.createTempFile( tmp-, );if( !base.delete() ) {throw new IOException( Cannot (re)create base folder: base.getAbsolutePath() );}if( !base.mkdir() ) {throw new IOException( Cannot create base folder: base.getAbsolutePath() ); }return base;}
} 该代码看起来非常简单但冗长因为在没有指定某些工作目录的情况下似乎不可能以嵌入式模式运行Apache Tomcat 。 小小的createBaseDirectory函数创建一个临时文件夹我们将其作为baseDir馈入Apache Tomcat 。 实现表明我们正在端口8080上运行Apache Tomcat服务器实例我们正在配置Apache CXF servlet来处理/ rest / *路径上的所有请求我们将添加Spring上下文侦听器最后将服务器启动。 将项目构建为一个胖子或一个罐子之后 我们将拥有一个功能完善的服务器来托管我们的JAR-RS应用程序 mvn clean package
java -jar target/spring-one-jar-0.0.1-SNAPSHOT.one-jar.jar 我们应该看到这样的输出 Jan 28, 2013 5:54:56 PM org.apache.coyote.AbstractProtocol init
INFO: Initializing ProtocolHandler [http-bio-8080]
Jan 28, 2013 5:54:56 PM org.apache.catalina.core.StandardService startInternal
INFO: Starting service Tomcat
Jan 28, 2013 5:54:56 PM org.apache.catalina.core.StandardEngine startInternal
INFO: Starting Servlet Engine: Apache Tomcat/7.0.34
Jan 28, 2013 5:54:56 PM org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/jsp_2_0.xsd
Jan 28, 2013 5:54:56 PM org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/jsp_2_1.xsd
Jan 28, 2013 5:54:56 PM org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/jsp_2_2.xsd
Jan 28, 2013 5:54:56 PM org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/web-jsptaglibrary_1_1.dtd
Jan 28, 2013 5:54:56 PM org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/web-jsptaglibrary_1_2.dtd
Jan 28, 2013 5:54:56 PM org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/web-jsptaglibrary_2_0.xsd
Jan 28, 2013 5:54:56 PM org.apache.catalina.startup.DigesterFactory register
WARNING: Could not get url for /javax/servlet/jsp/resources/web-jsptaglibrary_2_1.xsd
Jan 28, 2013 5:54:57 PM org.apache.catalina.loader.WebappLoader setClassPath
INFO: Unknown loader com.simontuffs.onejar.JarClassLoader187a84e4 class com.simontuffs.onejar.JarClassLoader
Jan 28, 2013 5:54:57 PM org.apache.catalina.core.ApplicationContext log
INFO: Initializing Spring root WebApplicationContext
Jan 28, 2013 5:54:57 PM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization started
Jan 28, 2013 5:54:58 PM org.springframework.context.support.AbstractApplicationContext prepareRefresh
INFO: Refreshing Root WebApplicationContext: startup date [Mon Jan 28 17:54:58 EST 2013]; root of context hierarchy
Jan 28, 2013 5:54:58 PM org.springframework.context.annotation.ClassPathScanningCandidateComponentProvider registerDefaultFilters
INFO: JSR-330 javax.inject.Named annotation found and supported for component scanning
Jan 28, 2013 5:54:58 PM org.springframework.web.context.support.AnnotationConfigWebApplicationContext loadBeanDefinitions
INFO: Successfully resolved class for [com.example.config.AppConfig]
Jan 28, 2013 5:54:58 PM org.springframework.beans.factory.annotation.AutowiredAnnotationBeanPostProcessor INFO: JSR-330 javax.inject.Inject annotation found and supported for autowiring
Jan 28, 2013 5:54:58 PM org.springframework.beans.factory.support.DefaultListableBeanFactory preInstantiateSingletons
INFO: Pre-instantiating singletons in org.springframework.beans.factory.support.DefaultListableBeanFactory62770d2e: defining beans [org.springframework.context.annotation.internal
ConfigurationAnnotationProcessor,org.springframework.context.annotation.
internalAutowiredAnnotationProcessor,org.springframework.context.annotation.
internalRequiredAnnotationProces
sor,org.springframework.context.annotation.internalCommonAnnotationProcessor,
appConfig,org.springframework.context.annotation.ConfigurationClassPostProcessor.
importAwareProcessor,
cxf,jaxRsServer,jaxRsApiApplication,peopleRestService,peopleService,jsonProvider]; root of factory hierarchy
Jan 28, 2013 5:54:59 PM org.apache.cxf.endpoint.ServerImpl initDestination
INFO: Setting the servers publish address to be /api
Jan 28, 2013 5:54:59 PM org.springframework.web.context.ContextLoader initWebApplicationContext
INFO: Root WebApplicationContext: initialization completed in 1747 ms
Jan 28, 2013 5:54:59 PM org.apache.coyote.AbstractProtocol start
INFO: Starting ProtocolHandler [http-bio-8080] 让我们发出一些HTTP请求以确保一切正常。 curl http://localhost:8080/rest/api/people?page2
[{email:person6at.com,firstName:null,lastName:null},{email:person7at.com,firstName:null,lastName:null},{email:person8at.com,firstName:null,lastName:null}, {email:person9at.com,firstName:null,lastName:null}, {email:person10at.com,firstName:null,lastName:null}
] curl http://localhost:8080/rest/api/people -X PUT -d emailab.com
{email:ab.com,firstName:null,lastName:null} 而且我们仍然100免费提供XML 不过有一个重要的注意事项 我们每次都会创建一个临时文件夹但永远不会删除它对base调用deleteOnShutdown不能像预期的那样对非空文件夹起作用。 当我决定保持代码整洁时请记住这一点例如添加您自己的关闭挂钩。 参考 http //aredko.blogspot.gr/2013/01/going-rest-embedding-tomcat-with-spring.html来自Andriy Redko {devmind}博客上的JCG合作伙伴 Andrey Redko。 翻译自: https://www.javacodegeeks.com/2013/02/going-rest-embedding-tomcat-with-spring-and-jax-rs-apache-cxf.html