Jetty入门
总述
同tomcat一样,jetty也是一个servlet引擎,jetty的神奇之处在于,jetty不仅可以作为一个web应用的容器,它甚至还可以作为一个程序中的插件来通过main函数加载web应用程序本身。
Jetty 是一个 Web server/servlet container, 支持 SPDY,WebSocket, OSGi, JMX,JNDI, JAAS 。Jetty非常高效而且灵活,Google App Engine 选择了Jetty,而放弃了Tomcat,或是其他的服务器。
Jetty has a slogan, "Don't deploy your application in Jetty, deploy Jetty in your application." What this means is that, putting an HTTP module into your application, rather than putting your application into an HTTP server.
Jetty的口号是:“不要把你的程序部署到Jetty里,而是把Jetty部署到你的程序里”,意味着,你可以把Jetty当成程序的一个HTTP模块放到你的程序里。
整体架构
顶层类结构
Connectors
The connectors represent the protocol handlers that accept connections, parse requests and generate responses. The different types of connectors available are based on the protocols, scheduling model and IO APIs used:
1、SocketConnector - for few busy connections or when NIO is not available
2、BlockingChannelConnector - for few busy connections when NIO is available
3、SelectChannelConnector - for many mostly idle connections or asynchronous handling of Ajax requests
4、SslSocketConnector - SSL without NIO
5、SslSelectChannelConnector - SSL with non blocking NIO support
6、AJPConnector - AJP protocol support for connections from apache mod_jk or mod_proxy_ajp
Handlers
The Handler is the component that deals with received requests. Three styles of Handler:
1、Coordinating Handlers - Handlers that route requests to other handlers (eg HandlerCollection, ContextHandlerCollection) 2、Filtering Handlers - Handlers that augment a request and pass it on to other handlers (eg. HandlerWrapper, ContextHandler, SessionHandler) 3、Generating Handlers - Handlers that produce content (eg ResourceHandler and ServletHandler)
重点Handler:
1、The ServletHandler is a Handler that generates content by passing the request to any configured Filters and then to a Servlet mapped by a URI pattern.
2、A WebAppContext combines handlers for security, session and servlets in a single unit that can be configured with a web.xml descriptor.
你可以顺序调用Handler,或者嵌套调用Handler,来处理请求的不同方面。
Web应用
A WebAppContext supports the standardized layout of a web application and configuration of session, security, listeners, filter, servlets and JSP via a web.xml descriptor normally found in the WEB-INF directory of a webapplication.
下载地址
http://www.eclipse.org/jetty/download.html
PS:默认的jetty相关配置文件都在etc路径下,其中端口和jetty相关组件的声明以及端口的配置在jetty.xml中,而web应用的默认描述配置为webdefault.xml。jetty可以像tomcat一样,将web应用放在webapps路径下启动,然后就可以直接访问,这个无需多说。下面就通过几个实例来详细讲解下jetty作为应用组件如何使用。
开发所需要的jar包
直接去jetty对应的lib目录下去取根目录下的所有jar包。
实例
1 package com.rampage.midea.learn.jetty;
2 import java.io.IOException;
3
4 import javax.servlet.ServletException;
5 import javax.servlet.http.HttpServlet;
6 import javax.servlet.http.HttpServletRequest;
7 import javax.servlet.http.HttpServletResponse;
8 import javax.servlet.http.HttpSession;
9
10 import org.eclipse.jetty.server.Server;
11 import org.eclipse.jetty.server.SessionManager;
12 import org.eclipse.jetty.server.session.HashSessionManager;
13 import org.eclipse.jetty.server.session.SessionHandler;
14 import org.eclipse.jetty.servlet.ServletContextHandler;
15 import org.eclipse.jetty.servlet.ServletHolder;
16 import org.eclipse.jetty.webapp.WebAppContext;
17
18
19
20 public class JettyTest {
21
22 /**
23 * 通过ServletContextHandler来作为handler
24 * @throws Exception
25 */
26 public void addServletHandler1() throws Exception {
27 Server server = new Server(9090);
28 ServletContextHandler hand = new ServletContextHandler();
29 hand.addServlet(new ServletHolder(new HttpServlet() {
30 private static final long serialVersionUID = 166145627009966144L;
31 public void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
32 response.setContentType("text/html;charset=utf-8");
33 response.setStatus(HttpServletResponse.SC_OK);
34 response.getWriter().println("<h1>Hello World</h1>");
35 HttpSession s = req.getSession();
36 String name = (String) s.getAttribute("name");
37 response.getWriter().println("<h1>Session is:</h1>" + s + "," + name);
38 response.getWriter().print("<br/>" + this.getServletContext().getRealPath("/"));
39 }
40 }), "/a");
41
42 hand.addServlet(new ServletHolder(new HttpServlet() {
43 private static final long serialVersionUID = 8426818915524669191L;
44 public void doGet(HttpServletRequest req, HttpServletResponse response) throws ServletException, IOException {
45 response.setContentType("text/html;charset=utf-8");
46 response.setStatus(HttpServletResponse.SC_OK);
47 response.getWriter().println("<h1>Hello World!你好!</h1>");
48 HttpSession s = req.getSession();
49 s.setAttribute("name", "Jack");
50 response.getWriter().print("<br/><a href='a'>你好杰克!</a>");
51 }
52
53 }), "/");
54
55 // 设置内嵌的jetty支持session,默认情况下不支持session
56 SessionManager sm = new HashSessionManager();
57 hand.setSessionHandler(new SessionHandler(sm));
58 server.setHandler(hand);
59 server.start();
60 server.join();
61 }
62
63 public static void main(String[] args) throws Exception {
64 new JettyTest().addServletHandler1();
65 }
66
67
68
69 /**
70 * 通过WebAppContext的set方法指定web.xml地址和项目地址以及url
71 * @throws Exception
72 */
73 public void projectHandler2() throws Exception {
74 String webapp = "D:\programfiles\MyEclipse10\wk3\day04\WebRoot";
75 Server server = new Server(80);
76 WebAppContext context = new WebAppContext();
77 context.setDescriptor(webapp + "/WEB-INF/web.xml");
78 context.setResourceBase(webapp);
79 context.setContextPath("/");
80 server.setHandler(context);
81 server.start();
82 server.join();
83 }
84
85 /**
86 * 直接再WebAppContext构造函数中传入项目路径和url上下文
87 * @throws Exception
88 */
89 public void projectHandler1() throws Exception {
90 String webapp = "D:\WebRoot";
91 Server server = new Server(80);
92 WebAppContext context = new WebAppContext(webapp, "/abc");
93 server.setHandler(context);
94 server.start();
95 server.join();
96 }
97 }
1 package com.rampage.midea.learn.jetty;
2 import java.io.IOException;
3
4 import javax.servlet.ServletException;
5 import javax.servlet.http.HttpServlet;
6 import javax.servlet.http.HttpServletRequest;
7 import javax.servlet.http.HttpServletResponse;
8
9 public class HelloWorldServlet extends HttpServlet {
10 private static final long serialVersionUID = -4006259793736970043L;
11
12 @Override
13 protected void doGet(HttpServletRequest req, HttpServletResponse resp)
14 throws ServletException, IOException {
15 System.out.println("doGet");
16 resp.getWriter().write("hello world!");
17 resp.getWriter().close();
18 }
19
20 @Override
21 protected void doPost(HttpServletRequest req, HttpServletResponse resp)
22 throws ServletException, IOException {
23 System.out.println("doPost");
24 super.doPost(req, resp);
25 }
26 }
自定义server的一个实现
1 package com.rampage.midea.learn.jetty;
2 import java.io.FileInputStream;
3 import java.io.FileNotFoundException;
4 import java.io.IOException;
5
6 import org.eclipse.jetty.server.Server;
7 import org.eclipse.jetty.server.handler.ContextHandlerCollection;
8 import org.eclipse.jetty.webapp.WebAppContext;
9 import org.eclipse.jetty.xml.XmlConfiguration;
10 import org.xml.sax.SAXException;
11
12 public class JettyCustomServer extends Server {
13 private String xmlConfigPath;
14
15 private String contextPath;
16
17 private String warPath;
18
19 private String resourceBase = "./webapps";
20
21 private String webXmlPath = "./webapps/WEB-INF/web.xml";
22
23 public JettyCustomServer(String xmlConfigPath, String contextPath,
24 String resourceBase, String webXmlPath) {
25 this(xmlConfigPath, contextPath, resourceBase, webXmlPath, null);
26 }
27
28 public JettyCustomServer(String xmlConfigPath, String contextPath) {
29 this(xmlConfigPath, contextPath, null, null, null);
30 }
31
32 public JettyCustomServer(String xmlConfigPath, String contextPath,
33 String warPath) {
34 this(xmlConfigPath, contextPath, null, null, warPath);
35 }
36
37 public JettyCustomServer(String xmlConfigPath, String contextPath,
38 String resourceBase, String webXmlPath, String warPath) {
39 super();
40 if (StringUtils.isNotBlank(xmlConfigPath)) {
41 this.xmlConfigPath = xmlConfigPath;
42 readXmlConfig();
43 }
44
45 if (StringUtils.isNotBlank(warPath)) {
46 this.warPath = warPath;
47 if (StringUtils.isNotBlank(contextPath)) {
48 this.contextPath = contextPath;
49 applyHandle(true);
50 }
51 } else {
52 if (StringUtils.isNotBlank(resourceBase))
53 this.resourceBase = resourceBase;
54 if (StringUtils.isNotBlank(webXmlPath))
55 this.webXmlPath = webXmlPath;
56 if (StringUtils.isNotBlank(contextPath)) {
57 this.contextPath = contextPath;
58 applyHandle(false);
59 }
60 }
61
62 }
63
64 private void readXmlConfig() {
65 try {
66 XmlConfiguration configuration = new XmlConfiguration(
67 new FileInputStream(this.xmlConfigPath));
68 configuration.configure(this);
69 } catch (FileNotFoundException e1) {
70 e1.printStackTrace();
71 } catch (SAXException e1) {
72 e1.printStackTrace();
73 } catch (IOException e1) {
74 e1.printStackTrace();
75 } catch (Exception e) {
76 e.printStackTrace();
77 }
78 }
79
80 public void applyHandle(Boolean warDeployFlag) {
81
82 ContextHandlerCollection handler = new ContextHandlerCollection();
83
84 WebAppContext webapp = new WebAppContext();
85 webapp.setContextPath(contextPath);
86 webapp.setDefaultsDescriptor("webdefault.xml");
87
88 if (!warDeployFlag) {
89 webapp.setResourceBase(resourceBase);
90 webapp.setDescriptor(webXmlPath);
91 } else {
92 webapp.setWar(warPath);
93 }
94
95 handler.addHandler(webapp);
96
97 super.setHandler(handler);
98 }
99
100 public void startServer() {
101 try {
102 super.start();
103 System.out.println("current thread:"
104 + super.getThreadPool().getThreads() + "| idle thread:"
105 + super.getThreadPool().getIdleThreads());
106 super.join();
107 } catch (Exception e) {
108 e.printStackTrace();
109 }
110
111 }
112
113 public String getXmlConfigPath() {
114 return xmlConfigPath;
115 }
116
117 public void setXmlConfigPath(String xmlConfigPath) {
118 this.xmlConfigPath = xmlConfigPath;
119 }
120
121 public String getContextPath() {
122 return contextPath;
123 }
124
125 public void setContextPath(String contextPath) {
126 this.contextPath = contextPath;
127 }
128
129 public String getResourceBase() {
130 return resourceBase;
131 }
132
133 public void setResourceBase(String resourceBase) {
134 this.resourceBase = resourceBase;
135 }
136
137 public String getWebXmlPath() {
138 return webXmlPath;
139 }
140
141 public void setWebXmlPath(String webXmlPath) {
142 this.webXmlPath = webXmlPath;
143 }
144
145 public String getWarPath() {
146 return warPath;
147 }
148
149 public void setWarPath(String warPath) {
150 this.warPath = warPath;
151 }
152 }
1 package com.rampage.midea.learn.jetty;
2
3 public class JettyServerStart {
4 public static void main(String[] args) {
5 JettyCustomServer server = new JettyCustomServer(
6 "jetty.xml", "/");
7 server.startServer();
8
9 }
10 }
参考博客
http://www.cnblogs.com/windlaughing/archive/2013/06/07/3125358.html
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 安卓笔记一
- 这样使用df和du命令更完美
- 批处理中的IF详解
- 来,我们一起打造一款代码命名工具
- HTML转PDF工具Wkhtmltopdf安装使用
- 【Vue.js】Vue.js组件库Element中的时间选择器、日期选择器、日期时间选择器和颜色选择器
- 【Vue.js】Vue.js的Chrome浏览器开发插件DevTools的安装步骤
- 训练提速60%!只需5行代码,PyTorch 1.6即将原生支持自动混合精度训练。
- TensorFlow 模型剪枝
- 机器人如何使用 RRT 进行路径规划?
- 高效 PyTorch:6个训练Tips
- 机器学习与情绪交易(附代码)
- 社区前端游戏框架LollipopCreator v1.0.X正式开源
- 社区开源框架音效管理模块:AudioManager详解
- 社区开源框架音效管理模块:AvatarManager详解