[置顶] 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就是一个可以置顶窗口的文件,避免复制粘贴的时候的来回切换(大窗口与小窗口),算是一个实 ...
随机推荐
- 飞翔(LIS变形)
飞翔 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 鹰最骄傲的就是翱翔,但是鹰们互相都很嫉妒别的鹰比自己飞的快,更嫉妒其他的鹰比自己飞行的有技巧.于是,他们决定举办一场 ...
- 基于storm的在线关联规则
基于storm的在线视频推荐算法.算法根据youtube的推荐算法 算法相对简单,能够觉得是关联规则仅仅挖掘频繁二项集.以下给出与storm的结合实如今线实时算法 , 关于storm见这里.首先给出 ...
- 如何实现android蓝牙开发 自动配对连接,并不弹出提示框
之前做一个android版的蓝牙 与血压计通讯的项目,遇到最大的难题就是自动配对. 上网查资料说是用反射createBond()和setPin(),但测试时进行配对还是会出现提示,但配对是成功了 我就 ...
- [置顶] c# datagridview‘s learn
c# 一串数字“1122331111155”,要输出到DataGridview控件上,但是要逐个数字读取,如果上一个数字与下一个相同,则排成一列,不相同,则另外排成一列.如“11223311111 ...
- ultraedit比较两个文件差异经验
链接地址:http://jingyan.baidu.com/article/fcb5aff7876551edab4a714b.html 程序开发人员经常要使用到两个文件的对比,有很多工具可以实现该功能 ...
- MySQL新建用户,授权,删除用户,修改密码等命令
首先要声明一下:一般情况下,修改MySQL密码,授权,是需要有mysql里的root权限的. 注:本操作是在WIN命令提示符下,phpMyAdmin同样适用. 用户:phplamp 用户数 ...
- Mac删除废纸篓中的单一文件和文件夹
http://www.macappbox.com/tips/159/ 通过Automator创建教程: 1.打开Automator并选择新建 2.选择服务类型 3.搜索Run Shell Script ...
- Qt新建线程的方法(有QRunnable,QThreadPool,moveToThread和QtConcurrent的例子)
看了不少Qt线程的东西,下面总结一下Qt新建一个线程的方法. 一.继承QThread 继承QThread,这应该是最常用的方法了.我们可以通过重写虚函数void QThread::run ()实现我们 ...
- 解决linux下javac -version和java -version版本显示不一致
解决linux下javac -version和java -version版本显示不一致 [javascript] view plaincopy [root@localhost usr]# $JAVA_ ...
- xpath的文本获取
xpath中tidyText()获取标签下所有文本, text()本级文本, allText()各级所有文本.