java 内置jetty_内置jetty
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相关推荐
- 企业级JAVA快速开发平台, 内置代码生成器 - JavaFast快速开发平台
企业级JAVA快速开发平台, 内置代码生成器 - JavaFast快速开发平台 JavaFast是一款基于代码生成器的智能快速开发平台,可以帮助解决java项目中80%的重复工作,让开发者更多关注业务 ...
- 我的世界java版使用剑_我的世界:JAVA版藏“私货”内置绝世好剑与神功,你玩的版本有吗...
导语:我的世界:JAVA版藏"私货"内置绝世好剑与神功,你玩的版本有吗! 在我的世界这款游戏中,每件物品都有它自己存在的作用,铁镐挖矿,盔甲防护,却也有一些物品被创作者赋予了奇怪的 ...
- JavaFast技术特点介绍-企业级JAVA快速开发平台, 内置java代码生成器
企业级JAVA快速开发平台, 内置代码生成器 - JavaFast快速开发平台 JavaFast是一款基于代码生成器的智能快速开发平台,可以帮助解决java项目中80%的重复工作,让开发者更多关注业务 ...
- JS-内置对象内置构造函数事件-拖拽轮播图无缝滚动
内置对象&内置构造函数 日期时间格式 // 创建一个当前时刻的日期时间对象 var date = new Date(); // 获取date对象中的年月日时分秒 var y = date.ge ...
- python3内置函数_python3--内置函数
python3--内置函数 内置函数: 截止到python 3.6.2 版本,现在python一共提供了68个内置函数:即python提供给你直接可以拿来使用的所有函数. (红色字体为重点掌握内置函数 ...
- 如何在小程序内实现界面快速置顶功能?
通过使用触发器中滚动到指定项实现界面快速置顶. 效果展示 前置准备 使用 循环容器 制作好的内容列表 置顶图标 数据表 具体步骤 1.创建列表项滚动触发器 2.创建点击置顶触发器 步骤分解 1.创建列 ...
- JS内置引用类型/内置对象
JS内置引用类型/内置对象 概述 对象在 JavaScript 中被称为引用类型的值/实例,在 ECMAScript 中,引用类型是一种数据结构, 用于将数据和功能组织在一起.它也常被称为类,但这种称 ...
- javaScript内置函数(内置函数,内置关键字)
javaScript内置函数(内置函数,内置关键字)js的内置对象是js自带,封装了一些常用的方法.常用的js内置对象有:String,Date,Array,Math等:js内置函数是浏览器内核自带的 ...
- java 内联_Java内联类初探
java 内联 重要要点 Valhalla项目正在开发内联类,以提高Java程序对现代硬件的亲和力 内联类使开发人员能够编写行为更像Java内置基元类型的类型 内联类的实例不具有对象标识,这带来了许多 ...
最新文章
- paip.odbc DSN的存储与读取
- G - MPI Maelstrom POJ - 1502
- 关于RabbitMq你必须深入理解的内容
- 3个月带你通关Go语言
- Centos中基于IP,域名,端口的虚拟主机搭建图文教程
- 深度学习方法笔记之(一):SVM的基本模型
- 【BZOJ1485】[HNOI2009]有趣的数列(组合数学)
- java继承类型转换_#java 一个简单的例子理解java继承、成员函数重写、类型转换...
- 机器学习中的不平衡分类方法(part6)--支持向量机
- 佳能hdr_烧设备无止境不代表随时败家,佳能EOS 5D4“闲鱼”翻身取代200D
- 【论文】基于特定实体的文本情感分类总结(PART III)
- MVC3 Razor语法速查
- [转]Qt 之 QFileSystemWatcher
- 深入剖析java迭代器以及C#迭代器!
- C语言编写游戏的程序教程,如何运用C语言编写搬山游戏
- 启用tls的情况下openvpn配置文件合并到ovpn文件
- 学生用计算机app,学生方程计算器
- 通过python将 .ARW 等大文件图像批量转换为 .jpg 或其他格式图像的方法
- Python爬取豆瓣网影评展示
- 子女通过TeamViewer远程帮助父母解决手机使用问题
热门文章
- 机器人也开始怕疼了?科学家开发无需人工干预即可自愈的机器人
- 一转眼,距 2021 竟然就不到 65 天了,你准备好了么?
- 华为 Mate 40 系列搭载麒麟 9000 芯片;短视频平台 Quibi 宣布关闭;Node.js 15 正式版发布|极客头条
- 华为云发布 GaussDB(DWS) 实时数仓,技术创新释放行业数据价值
- 什么? 搞不定 Redis 分布式锁?
- 程序员惊魂 12 小时:“���”引发线上事故
- 开源老兵教你如何评估一项技术是否值得长期投入?
- 开辟 Dart 到 Native 的超级通道,饿了么跨平台的最佳实践
- Kotlin 风险高、RxJava 已过时,Android 原生开发现状分析!
- Python 爬取 20 万条评论,告诉你周杰伦新歌为啥弄崩 QQ 音乐?