jetty有一个口号,不要把你的应用部署到jetty,而是把jetty部署到你的应用中。这说明使用jetty有两种选择,一种选择是将你的应用部署到jetty容器中,另一种选择是将jetty嵌入到你的应用层序中,后者意味着将一个http的模块嵌入到了你的程序中,而不是把你的程序放入一个http的server中。

这个文档就是帮助你一步一步将jetty嵌入到你的程序中。

1.概述

把jetty嵌入到你的程序中,一般都是下面的步骤:

创建一个server实例

增加或者配置connector

增加或者配置handler、context、servlet

启动server

等待连接

2.创建一个server

下面的代码创建了一个最简单的server。

import org.eclipse.jetty.server.Server;

/**

* Created by zdd on 2017/4/1.

*/

public class SimpleServer {

public static void main(String[] args) throws Exception{

Server server = new Server(8090);

server.start();

server.dumpStdErr();

server.join();

}

}

上面程序运行一个http server在8090端口。但是这个server没有任何用处,因为它没有任何handler,因此不管任何的请求都会返回404.

3.使用handler

为了对请求产生一个回应,jetty需要你在server上设置handler。一个handler可以:

检查或者修改HTTP请求。

生成response回应。

调用另一个handler(查看HandlerWrapper)

选择一个或者很多个handlers去调用(查看HandlerCollection)

3.1hello world Handler

下面的代码展示了一个最简单的helloworld handler:

import javax.servlet.ServletException;

import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;

import java.io.IOException;

import java.io.PrintWriter;

/**

* Created by zdd on 2017/4/1.

*/

public class HelloHandler extends AbstractHandler {

final String greeting;

final String body;

public HelloHandler(){

this("hello world");

}

public HelloHandler(String greeting){

this(greeting,null);

}

public HelloHandler(String greeting,String body){

this.greeting = greeting;

this.body = body;

}

@Override

public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response) throws IOException, ServletException {

response.setContentType("text/html;charset=utf-8");

response.setStatus(HttpServletResponse.SC_OK);

PrintWriter out = response.getWriter();

out.println("

"+greeting+"

");

if(body != null){

out.println(body);

}

baseRequest.setHandled(true);

}

}

传递给handle方法的参数有:

target:请求的目标

baseRequest:没有被包装的request对象

request:不可变的request对象,可能被filter或者servlet包装过。

response:请求的回应,也可能被filter或者servlet包装过。

handler会设置response的状态、response的内容类型、并且标记request被处理了,最后才通过out生成response的内容。

3.2运行helloworld Handler

为了允许handler去处理http请求,你必须把它绑定到server实例上。下面的代码显示了jetty server是如何和handler绑定的。

import org.eclipse.jetty.server.Server;

/**

* Created by zdd on 2017/4/1.

*/

public class SimpleServer {

public static void main(String[] args) throws Exception{

Server server = new Server(8090);

server.setHandler(new HelloHandler());

server.start();

server.join();

}

}

在jetty中,一般总会有一个或者多个handler区处理所有的请求。有些handler会选择其他指定的handler去做处理,例如(一个ContextHandlerCollection使用context path去选择ContextHandler);还有一些是使用程序的逻辑去产生response,例如(ServletHandler将请求转发给Servlet来处理),还有其他的一些是做一些无关的任务来生成response,例如(RequestLogHandler或者StatisticsHandler)。

后面的章节描述了你可以像切面一样合并多个handler。你可以看到一些有价值的handler在org.eclipse.jetty.server.handler包中。

4.Handler Collections and Wrappers

复杂的请求需要你合并多个handler来处理。jetty提供了几个HandlerContainer接口的实现:

HandlerCollection:拥有一个handler的集合并且调用顺序调用每个handler。当你想合并统计和日志的handler这是很有用的。

HandlerList:一个handler的集合,会依次调用这个集合里面的handler,直到如果有异常发生、response已经被提交、resquest.isHandled()被调用。你可以使用这个来合并一些handler,例如调用handler来处理直到被匹配到的情况下。

HandlerWrapper:你可以使用这个来完成连接handlers类似于面向切面编程的风格。例如,一个标准的web程序被实现成一个context、session、security和servlet的串联。

ContextHandlerClollection:一个特殊的HandlerCollection,使用最长uri匹配原则来选择handler。

5.Scoped Handlers

Server.handle(...)

ContextHandler.doScope(...)

ServletHandler.doScope(...)

ContextHandler.doHandle(...)

ServletHandler.doHandle(...)

SomeServlet.service(...)

6.Resource Handler

下面的代码给你展示了你可以使用ReourceHandler去处理静态的资源。

public class FileServer {

public static void main(String[] args) throws Exception{

// 创建一个最基本的jetty server并且绑定8090端口

// 如果把端口指定为0,那么程序会自动选择一个可用的端口

Server server = new Server(8090);

ResourceHandler resourceHandler = new ResourceHandler();

// 设置resourceHandler监听的目录

resourceHandler.setDirectoriesListed(true);

resourceHandler.setWelcomeFiles(new String[]{"idenx.html"});

resourceHandler.setResourceBase(".");

HandlerList handlers = new HandlerList();

handlers.setHandlers(new Handler[]{resourceHandler, new DefaultHandler()});

server.setHandler(handlers);

server.start();

server.join();

}

}

注意我们使用了ResourceHandler和DefaultHandler,所以DefaultHandler对于没有匹配的请求会友好的返回404。

7.内置connectors

在上面的例子中,server实例都会绑定一个端口并且创建一个默认的connector来监听这个端口。但是,在内置jetty中,自定义一个或者多个connetor是很常见的。

7.1一个connector

public class OneConnector {

public static void main(String[] args) throws Exception{

Server server = new Server();

ServerConnector http = new ServerConnector(server);

http.setHost("localhost");

http.setPort(8090);

http.setIdleTimeout(30000);

server.addConnector(http);

server.setHandler(new HelloHandler());

server.start();

server.join();

}

}

在这个例子里connector处理http协议,因为这是ServerConnetor默认的配置。

7.2多connector

当配置多connector的时候,最好是多个connector享用相同的配置信息。为了实现这个你需要明确的指定serverConnector的配置,使用的是ConnectionFactory这个实例。

8内置servlets

servlet是让应用程序通过逻来处理请求的标准的方式。servlet和handler很相似。servlet在jetty中是被ServletHandler处理的。它使用标准的路径映射到一个servlet。

下面的代码创建了一个ServletHandler并且配置了一个简单的HelloServlet:

public class MinimalServlets {

public static void main(String[] args) throws Exception{

Server server = new Server(8090);

ServletHandler handler = new ServletHandler();

server.setHandler(handler);

// 需要注意的是,这是个原生的servlet,你可以通过web.xml或者@WebServlet来配置

handler.addServletWithMapping(HelloServlet.class,"/*");

server.start();

server.join();

}

}

class HelloServlet extends HttpServlet{

@Override

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

resp.setContentType("text/html");

resp.setStatus(HttpServletResponse.SC_OK);

resp.getWriter().println("

hello from HelloServlet

");

}

}

java 内置jetty_内置jetty相关推荐

  1. 企业级JAVA快速开发平台, 内置代码生成器 - JavaFast快速开发平台

    企业级JAVA快速开发平台, 内置代码生成器 - JavaFast快速开发平台 JavaFast是一款基于代码生成器的智能快速开发平台,可以帮助解决java项目中80%的重复工作,让开发者更多关注业务 ...

  2. 我的世界java版使用剑_我的世界:JAVA版藏“私货”内置绝世好剑与神功,你玩的版本有吗...

    导语:我的世界:JAVA版藏"私货"内置绝世好剑与神功,你玩的版本有吗! 在我的世界这款游戏中,每件物品都有它自己存在的作用,铁镐挖矿,盔甲防护,却也有一些物品被创作者赋予了奇怪的 ...

  3. JavaFast技术特点介绍-企业级JAVA快速开发平台, 内置java代码生成器

    企业级JAVA快速开发平台, 内置代码生成器 - JavaFast快速开发平台 JavaFast是一款基于代码生成器的智能快速开发平台,可以帮助解决java项目中80%的重复工作,让开发者更多关注业务 ...

  4. JS-内置对象内置构造函数事件-拖拽轮播图无缝滚动

    内置对象&内置构造函数 日期时间格式 // 创建一个当前时刻的日期时间对象 var date = new Date(); // 获取date对象中的年月日时分秒 var y = date.ge ...

  5. python3内置函数_python3--内置函数

    python3--内置函数 内置函数: 截止到python 3.6.2 版本,现在python一共提供了68个内置函数:即python提供给你直接可以拿来使用的所有函数. (红色字体为重点掌握内置函数 ...

  6. 如何在小程序内实现界面快速置顶功能?

    通过使用触发器中滚动到指定项实现界面快速置顶. 效果展示 前置准备 使用 循环容器 制作好的内容列表 置顶图标 数据表 具体步骤 1.创建列表项滚动触发器 2.创建点击置顶触发器 步骤分解 1.创建列 ...

  7. JS内置引用类型/内置对象

    JS内置引用类型/内置对象 概述 对象在 JavaScript 中被称为引用类型的值/实例,在 ECMAScript 中,引用类型是一种数据结构, 用于将数据和功能组织在一起.它也常被称为类,但这种称 ...

  8. javaScript内置函数(内置函数,内置关键字)

    javaScript内置函数(内置函数,内置关键字)js的内置对象是js自带,封装了一些常用的方法.常用的js内置对象有:String,Date,Array,Math等:js内置函数是浏览器内核自带的 ...

  9. java 内联_Java内联类初探

    java 内联 重要要点 Valhalla项目正在开发内联类,以提高Java程序对现代硬件的亲和力 内联类使开发人员能够编写行为更像Java内置基元类型的类型 内联类的实例不具有对象标识,这带来了许多 ...

最新文章

  1. paip.odbc DSN的存储与读取
  2. G - MPI Maelstrom POJ - 1502
  3. 关于RabbitMq你必须深入理解的内容
  4. 3个月带你通关Go语言
  5. Centos中基于IP,域名,端口的虚拟主机搭建图文教程
  6. 深度学习方法笔记之(一):SVM的基本模型
  7. 【BZOJ1485】[HNOI2009]有趣的数列(组合数学)
  8. java继承类型转换_#java 一个简单的例子理解java继承、成员函数重写、类型转换...
  9. 机器学习中的不平衡分类方法(part6)--支持向量机
  10. 佳能hdr_烧设备无止境不代表随时败家,佳能EOS 5D4“闲鱼”翻身取代200D
  11. 【论文】基于特定实体的文本情感分类总结(PART III)
  12. MVC3 Razor语法速查
  13. [转]Qt 之 QFileSystemWatcher
  14. 深入剖析java迭代器以及C#迭代器!
  15. C语言编写游戏的程序教程,如何运用C语言编写搬山游戏
  16. 启用tls的情况下openvpn配置文件合并到ovpn文件
  17. 学生用计算机app,学生方程计算器
  18. 通过python将 .ARW 等大文件图像批量转换为 .jpg 或其他格式图像的方法
  19. Python爬取豆瓣网影评展示
  20. 子女通过TeamViewer远程帮助父母解决手机使用问题

热门文章

  1. 机器人也开始怕疼了?科学家开发无需人工干预即可自愈的机器人
  2. 一转眼,距 2021 竟然就不到 65 天了,你准备好了么?
  3. 华为 Mate 40 系列搭载麒麟 9000 芯片;短视频平台 Quibi 宣布关闭;Node.js 15 正式版发布|极客头条
  4. 华为云发布 GaussDB(DWS) 实时数仓,技术创新释放行业数据价值
  5. 什么? 搞不定 Redis 分布式锁?
  6. 程序员惊魂 12 小时:“���”引发线上事故
  7. 开源老兵教你如何评估一项技术是否值得长期投入?
  8. 开辟 Dart 到 Native 的超级通道,饿了么跨平台的最佳实践
  9. Kotlin 风险高、RxJava 已过时,Android 原生开发现状分析!
  10. Python 爬取 20 万条评论,告诉你周杰伦新歌为啥弄崩 QQ 音乐?