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的更多相关文章

  1. Python 为什么没有 main 函数?为什么我不推荐写 main 函数?

    毫无疑问 Python 中没有所谓的 main 入口函数,但是网上经常看到一些文章提"Python 的 main 函数"."建议写 main 函数"-- 有些人 ...

  2. 【C解毒】怎样写main()函数

    [C解毒]怎样写main()函数(出处: CUNIX论坛)

  3. 为什么c程序里一定要写main函数

    一. 学习过程 编写程序f.c: 对其进行编译,正常通过,再对其进行连接,出现错误: 显示的出错信息为: 翻译成中文是:在c0s模块没有定义符号’_main’. 那么这个错误信息可能与文件c0s.ob ...

  4. WPF启动流程-自己手写Main函数

    WPF一般默认提供一个MainWindow窗体,并在App.Xaml中使用StartupUri标记启动该窗体.以下通过手写实现WPF的启动. 首先先介绍一下VS默认提供的App.Xaml的结构,如下图 ...

  5. [置顶] linux中fork()函数详解(原创!!实例讲解)

    分类: 计算机系统 linux2010-06-01 23:35 60721人阅读 评论(105) 收藏 举报 linux2010存储  一.fork入门知识 一个进程,包括代码.数据和分配给进程的资源 ...

  6. [置顶] 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' ...

  7. 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项目时遇到下面 ...

  8. python 如何写好main函数

    每个程序员在学习编程的过程中,肯定没少写过main()函数,Python程序员也不例外.本文为大家分享Python之父Guido van Rossum推荐的函数写法,可以大大提高这个函数的灵活性. 一 ...

  9. 窗口置顶 - 仿TopWind

    前置学习:低级鼠标hook,获得鼠标状态. 这个在原来获得鼠标状态的基础上,加上一个事件处理即可. TopWind就是一个可以置顶窗口的文件,避免复制粘贴的时候的来回切换(大窗口与小窗口),算是一个实 ...

随机推荐

  1. Linux下的在线播放神器

    Linux下的在线播放神器:一个是Amarok缺点是,每个音乐源都要更新后才能播放. 在一个就是中国造的:linux deepin下的深度音乐,缺点就是连不上.反正我是连不上

  2. Android PopupWindow显示位置和显示大小

    watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQveGlhb3l1YW41MTE=/font/5a6L5L2T/fontsize/400/fill/I0JBQk ...

  3. Android 多分辨率机适应

    如果你有一台机器,如以下决议: 800 x 480 1024 x 600 1024 x 768 1280 x 800 1920 x 1200 2048 x 1536 总共六种类分辨率机器,假设依照dp ...

  4. java--实例成员 & 静态成员

    class run{ static String str1 = "静态变量"; String str2 = "非静态变量"; public static voi ...

  5. 分享非常有用的Java程序 (关键代码)(五)---把 Array 转换成 Map

    原文:分享非常有用的Java程序 (关键代码)(五)---把 Array 转换成 Map import java.util.Map; import org.apache.commons.lang.Ar ...

  6. android 小结

    1.layout中的布局文件xml中不能有大写字母. 2.时刻要想着空指针,尤其是安卓5.0后,不报异常,直接ANR.

  7. Android 程式开发:(二十)内容提供者 —— 20.6 自定义ContentProvider的使用

    现在,ContentProvider已经创建好了,可以去尝试使用一下. 1. 使用之前的工程,在布局文件main.xml中添加一些控件. <?xml version="1.0" ...

  8. Machine Learning #Lab1# Linear Regression

    Machine Learning Lab1 打算把Andrew Ng教授的#Machine Learning#相关的6个实验一一实现了贴出来- 预计时间长度战线会拉的比較长(毕竟JOS的7级浮屠还没搞 ...

  9. opencv视频播放

    在一个界面上显示一张图片.是一件非常easy的事情,但说到要显示视频.刚開始学习的人可能不知道怎么处理,事实上,一般来说能够理解为视频就是图片以人眼察觉不到的速度高速更新. 曾经用摄像头採集视频显示在 ...

  10. MSSQL - Sqlcommand

    Command对象:·Command对象也称为数据库连接对象,Command对象主要执行包括添加.删除.修改.查询数据的操作命令.也可以用来执行存储过程. 属性:CommandType属性. 执行存储 ...