Jetty服务器的使用

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 }
View Code

 需要的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>
View Code

 

第二步:

右击项目名->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>
View Code

接下来自己写一个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+"............");

}

 

}
View Code

 运行项目就只要运行这个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

转载于:https://www.cnblogs.com/ysq2018China/p/9395620.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值