Jetty 是一个开源的servlet容器,它为基于Java的web容器,例如JSP和servlet提供运行环境。Jetty是使用Java语言编写的,它的API以一组JAR包的形式发布。开发人员可以将Jetty容器实例化成一个对象,可以迅速为一些独立运行(stand-alone)的Java应用提供网络和web连接。
工作原理:链接https://www.ibm.com/developerworks/cn/java/j-lo-jetty/
和Tomcat比较
1)Jetty更轻量级。这是相对Tomcat而言的。
由于Tomcat除了遵循Java Servlet规范之外,自身还扩展了大量JEE特性以满足企业级应用的需求,所以Tomcat是较重量级的,而且配置较Jetty亦复杂许多。但对于大量普通互联网应用而言,并不需要用到Tomcat其他高级特性,所以在这种情况下,使用Tomcat是很浪费资源的。这种劣势放在分布式环境下,更是明显。换成Jetty,每个应用服务器省下那几兆内存,对于大的分布式环境则是节省大量资源。而且,Jetty的轻量级也使其在处理高并发细粒度请求的场景下显得更快速高效。
2)Jetty更灵活,体现在其可插拔性和可扩展性,更易于开发者对Jetty本身进行二次开发,定制一个适合自身需求的Web Server。
相比之下,重量级的Tomcat原本便支持过多特性,要对其瘦身的成本远大于丰富Jetty的成本。用自己的理解,即增肥容易减肥难。
3)然而,当支持大规模企业级应用时,Jetty也许便需要扩展,在这场景下Tomcat便是更优的。
总结:Jetty更满足公有云的分布式环境的需求,而Tomcat更符合企业级环境。
作为嵌入式服务器使用代码实例
Java代码
1 //代码:以嵌入模式启动Jetty 2 3 import org.mortbay.http.HttpContext; 4 5 import org.mortbay.http.HttpServer; 6 7 import org.mortbay.http.SocketListener; 8 9 import org.mortbay.http.handler.ResourceHandler; 10 11 12 13 public class JettySample{ 14 15 public static void main(String[]args)throws Exception{ 16 17 //创建JettyHttpServer对象 18 19 HttpServer server=new HttpServer(); 20 21 //在端口8080上给HttpServer对象绑上一个listener,使之能够接收HTTP请求 22 23 SocketListener listener=new SocketListener(); 24 25 listener.setPort(8080); 26 27 server.addListener(listener); 28 29 //创建一个HttpContext,处理HTTP请求。 30 31 HttpContext context=new HttpContext(); 32 33 //用setContextPath把Context映射到(/web)URL上。 34 35 context.setContextPath("/web"); 36 37 //setResourceBase方法设置文档目录以提供资源 38 39 context.setResourceBase("C:\\j2sdk1.4.1_05"); 40 41 //添加资源处理器到HttpContext,使之能够提供文件系统中的文件 42 43 context.addHandler(new ResourceHandler()); 44 45 server.addContext(context); 46 47 //启动服务器 48 49 server.start(); 50 51 } 52 53 }
需要的jar包:
commons-logging.jar
javax.servlet.jar
org.mortbay.jetty.jar
org.mortbay.jmx.jar
在eclipse的Maven中获取Jetty
第一步:(需要联外网)
在maven的pom.xml文件节点project引入Jetty Plugin配置即可:
1 <build> 2 3 <finalName>basic_struts</finalName> -- 项目名 4 5 <plugins> 6 7 <plugin> 8 9 <groupId>org.eclipse.jetty</groupId> 10 11 <artifactId>jetty-maven-plugin</artifactId> 12 13 <version>9.4.7.v20170914</version> 14 15 <configuration> 16 17 <webApp> 18 19 <contextPath>/${build.finalName}</contextPath> 20 21 </webApp> 22 23 <stopKey>CTRL+C</stopKey> 24 25 <stopPort>8999</stopPort> 26 27 <scanIntervalSeconds>10</scanIntervalSeconds> 28 29 <scanTargets> 30 31 <scanTarget> 32 33 src/main/webapp/WEB-INF/web.xml 34 35 </scanTarget> 36 37 </scanTargets> 38 39 </configuration> 40 41 </plugin> 42 43 </plugins> 44 45 </build>
第二步:
右击项目名->run as -> run configurations
运行时候只要maven build…->输入jetty:run即可。
第三步:
点击run,将在控制台看到以下代码信息则服务器开启成功,在浏览器输入正确的访问地址将可访问maven构建的web项目中的文件资源。
[INFO] Logging initialized @534160ms to org.eclipse.jetty.util.log.Slf4jLog
[INFO] Configuring Jetty for project: basic_struts Maven Webapp
[INFO] webAppSourceDirectory not set. Trying src\main\webapp
[INFO] Reload Mechanic: automatic
······
[INFO] Scavenging every 600000ms
[INFO] Started o.e.j.m.p.JettyWebAppContext@15ac59c2{/basic_struts,file:///D:/JavaProject/basic_struts/src/main/webapp/,AVAILABLE}{file:///D:/JavaProject/basic_struts/src/main/webapp/}
[INFO] Started ServerConnector@295bf2a{HTTP/1.1,[http/1.1]}{0.0.0.0:8080}
[INFO] Started @538369ms
[INFO] Started Jetty Server
自制Jetty服务类
这种方式可以支持websocket,如果项目中需要使用到可以试试这种。
首先pom.xml引入jetty的依赖:
<dependency> <groupId>org.eclipse.jetty.aggregate</groupId> <artifactId>jetty-all</artifactId> <version>9.2.14.v20151106</version> </dependency> <dependency> <groupId>javax.servlet</groupId> <artifactId>javax.servlet-api</artifactId> <version>3.1.0</version> </dependency> <dependency> <groupId>org.eclipse.jetty</groupId> <artifactId>jetty-jsp</artifactId> <version>9.2.15.v20160210</version> </dependency>
接下来自己写一个JettyServer类:我自己的完整代码如下
import javax.websocket.server.ServerContainer; import org.eclipse.jetty.server.Server; import org.eclipse.jetty.webapp.WebAppContext; import org.eclipse.jetty.websocket.jsr356.server.deploy.WebSocketServerContainerInitializer; import org.json.JSONObject; import com.web.test.MyWebSocket; public class JettyServer { public static void main(String[] args) { int port = 8080; Server server = new Server(port); WebAppContext webAppContext = new WebAppContext("webapp","/web"); webAppContext.setDescriptor("webapp/WEB-INF/web.xml"); webAppContext.setResourceBase("src/main/webapp"); webAppContext.setDisplayName("web"); webAppContext.setClassLoader(Thread.currentThread().getContextClassLoader()); webAppContext.setConfigurationDiscovered(true); webAppContext.setParentLoaderPriority(true); server.setHandler(webAppContext); System.out.println(webAppContext.getContextPath()); System.out.println(webAppContext.getDescriptor()); System.out.println(webAppContext.getResourceBase()); System.out.println(webAppContext.getBaseResource()); try { ServerContainer wscontainer = WebSocketServerContainerInitializer.configureContext(webAppContext); // Add WebSocket endpoint to javax.websocket layer wscontainer.addEndpoint(MyWebSocket.class); //这行是如果需要使用websocket就加上,不需要就注释掉这行,mywebsocket是自己写的websocket服务类 server.start(); } catch (Exception e) { e.printStackTrace(); } System.out.println("server is start, port is "+port+"............"); } }
运行项目就只要运行这个main函数即可。
假如正式发布需要放到tomcat里运行,需要把下面这个依赖去掉,tomcat和下面的依赖不兼容,会报错(javax.servlet.ServletException: Not running on Jetty, JSR-356 support unavailable)
这种方式运行项目可以在开发的时候用来调试
1 <dependency> 2 <groupId>org.eclipse.jetty.aggregate</groupId> 3 <artifactId>jetty-all</artifactId> 4 <version>9.2.14.v20151106</version> 5 </dependency>
借鉴资源:
https://www.cnblogs.com/lylife/p/5670396.html