[置顶] Embedded Server:像写main函数一样写Web Server
1.传统的JEE Web Server
传统的JEE中,如果我们想要部署一个Web Application,我们需要首先安装一个Container Server,如JBoss,WebLogic,Tomcat等。在安装这些Container Server作为我们的开发或者部署环境时,我们还需要注意配置的一致性。
配置好Container Server以后,如果我们想开发一个Web Application,我们先吭哧吭哧写好web.xml配置文件,其实大部分时间我们也不会自己写,都是东抄抄西抄抄。然后再开始写servlet部分的代码什么的。最后把代码打包成war/ear包,部署到container中跑起来。如果你运气好,程序运行正常,那还好。如果出现了bug,那你还需要吭哧吭哧的重新部署,把Remote Debug起起来。反复这样,直到正确为止。
在传统的server中提供了过多的功能,不管你是写一个Hello World的例子,还是做一个很复杂的应用,一大堆的功能都摆在那里。而在进行redeploy的时候,还可能出现PermGem这样的问题。
这不禁让我们产生了一个疑问:难道我们就不能像写一个Main函数一样写一个Web Server吗?不能像启动一个普通的jar包一样启动Web应用吗?
2.Jetty Embedded Server
Don't deploy your application into Jetty, deploy Jetty in your application. -- Jetty
使用Jetty Embedded Server,不再需要繁琐的Container Server,你需要的只是一个Jetty的jar包。一个最简单的java Web Server如下:
public class SimpleServer {
public static void main(String[] args) throws Exception {
final Server server = new Server(8080);
server.start();
server.join();
}
}
Server类是由Jetty Embedded Server提供的,启动一个Server,有它就足够了。我们要运行一个Server,debug一个Server都变得简单了很多。
进一步定义一个Handler用来处理请求:
public class SimpleServer {
public static void main(String[] args) throws Exception {
final Server server = new Server(8080);
server.setHandler(new HelloHandler());
server.start();
server.join();
}
}
class HelloHandler extends AbstractHandler {
@Override
public void handle(String target, Request baseRequest, HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
baseRequest.setHandled(true);
response.getWriter().println("Hello, your request path is " + target);
}
}
这个可以用于处理一个Handler的情况,当有多个Handler的时候,需要定义Context或者Handler Collection。这里就不再深入展示了更多的可以参考下面提供的网址。总的来说,可以看见Embedded Server是一种更轻量级的部署方案,同时也是一种更轻量级的开发方案。
参考:https://wiki.eclipse.org/Jetty/Tutorial/Embedding_Jetty
3.更多
正是因为Jetty Embedded Server提供了一种更轻量级的解决方案,所以很多快速开发框架都采用了Jetty,而不是传统的如Tomcat,JBoss等Server容器。如果有兴趣,可以了解如下开发工具:
SimpleWeb4j:https://github.com/ybonnel/SimpleWeb4j,在Embedded Jetty上再做了一次封装,更容易的进行开发,同时提供了如REST Resource的定义借口。
Dropwizard:http://dropwizard.codahale.com/,这个就不说了,没看过的自己都去看下吧。
可能有人会觉得说,用这个用那个其实都差不多。其实不然,用Embedded Jetty Server是一种更精益的方法,你仅仅使用你需要的,这样的Web开发方法更轻,更灵活。也需要问,更轻更灵活有什么用?好问题,如果我不是很懒的话,后面的博客应该会讲。
[置顶] Embedded Server:像写main函数一样写Web Server的更多相关文章
- Python 为什么没有 main 函数?为什么我不推荐写 main 函数?
毫无疑问 Python 中没有所谓的 main 入口函数,但是网上经常看到一些文章提"Python 的 main 函数"."建议写 main 函数"-- 有些人 ...
- 【C解毒】怎样写main()函数
[C解毒]怎样写main()函数(出处: CUNIX论坛)
- 为什么c程序里一定要写main函数
一. 学习过程 编写程序f.c: 对其进行编译,正常通过,再对其进行连接,出现错误: 显示的出错信息为: 翻译成中文是:在c0s模块没有定义符号’_main’. 那么这个错误信息可能与文件c0s.ob ...
- WPF启动流程-自己手写Main函数
WPF一般默认提供一个MainWindow窗体,并在App.Xaml中使用StartupUri标记启动该窗体.以下通过手写实现WPF的启动. 首先先介绍一下VS默认提供的App.Xaml的结构,如下图 ...
- [置顶] linux中fork()函数详解(原创!!实例讲解)
分类: 计算机系统 linux2010-06-01 23:35 60721人阅读 评论(105) 收藏 举报 linux2010存储 一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源 ...
- [置顶] c++,vc6.0,中友元函数,无法访问私有字段(private)的问题(problem),cannot access private member declared in class 'Date'
c++,vc6.0,中友元函数,无法访问私有字段(private)的问题(problem),cannot access private member declared in class 'Date' ...
- ASP.NET 4.5.256 has not been registered on the Web server. You need to manually configure your Web server for ASP.NET 4.5.256 in order for your site to run correctly
Microsoft .NET Framework 4.6安装后,用户可能会在使用Microsoft Visual Studio 创建(或打开现有项目时)网站.或Windows Azure项目时遇到下面 ...
- python 如何写好main函数
每个程序员在学习编程的过程中,肯定没少写过main()函数,Python程序员也不例外.本文为大家分享Python之父Guido van Rossum推荐的函数写法,可以大大提高这个函数的灵活性. 一 ...
- 窗口置顶 - 仿TopWind
前置学习:低级鼠标hook,获得鼠标状态. 这个在原来获得鼠标状态的基础上,加上一个事件处理即可. TopWind就是一个可以置顶窗口的文件,避免复制粘贴的时候的来回切换(大窗口与小窗口),算是一个实 ...
随机推荐
- Net::OpenSSH 模块使用
use Net::OpenSSH; my $host = "$ip"; my $user = 'root'; my $passphrase = 'uxxxxxD'; my $key ...
- Jetty:配置概览-须要配置什么
上一节讲述了怎么配置Jetty,这节将告诉你使用Jetty你须要配置些什么. 配置Server Server实例是Jetty服务端的中心协调对象,它为全部其它Jetty服务端组件提供服务和生命周期管理 ...
- TCP三次握手和四次挥手具体解释
三次握手:建立TCP须要三次握手才干建立, 先Client端发送连接请求报文,Server段接受连接后回复ACK报文,并为这次连接分配资源.Client端接收到ACK报文后也向Server段发生ACK ...
- AsyncTask究竟需要多少个线程
最起码两个:主线程和工作线程; 可以参考:http://zhidao.baidu.com/link?url=ho4UEcEbaogRZUFHwig1neSKR25b2zT9iXyM36hEgWTmvJ ...
- 管理tips
管理是什么? 我认为达到的目的就是高效.低成本. 成本低才能有盈余,才能活的长和舒服.高效就是无谓的消耗少,以结果为导向. 开源节流,应该包含显性的与隐性的两方面. 隐性成本: 1.会议成本;2.沟通 ...
- [转]mysql慢查询日志
原文链接:http://www.cnblogs.com/zhangjing0502/archive/2012/07/30/2615570.html 参考博文:http://blog.chinaunix ...
- Multiple bindings were found on the class path(转)
Multiple bindings were found on the class path SLF4J API is designed to bind with one and only one u ...
- 搭建Windows SVN服务器及TortoiseSVN使用帮助和下载
搭建Windows SVN服务器: 用的SVN服务器通常为外部,例如Google Code的服务器,不过,做为一个程序开发人员,就算自己一个人写程序,也应该有一个SVN版本控制系统,以便对开发代码进行 ...
- lua语法 - 基础篇
1. 注释 单行注释:--,类似于C++的// 多行注释:--[[ ... ]],类似于C++的/*...*/ 2. 语句 分隔符:分号或者空格,一般多行写一起,建议用分号 语句块:do ... en ...
- 【Lucene】近实时搜索
近实时搜索:可以使用一个打开的IndexWriter快速搜索索引的变更内容,而不必首先关闭writer,或者向该writer提交:这是2.9版本之后推出的新功能. 代码示例(本例参考<Lucen ...