使用Jetty作为嵌入式服务器

项目中用到嵌入式服务器的功能,于是去jetty的官方网站看了jetty嵌入方面的文档,简要翻译了其中可能用到的部分,方便以后参考。

Jetty有一个口号:不要把你的应用部署到Jetty中,把Jetty部署到你的应用中。Jetty可以在Java应用程序中向其他POJO一样被实例化,换句话说,以嵌入式的模式运行Jetty是指将Http模块放入你的应用程序中,而非部署你的程序到一个HTTP服务器。

嵌入式Jetty服务器的实现的步骤通常为:

1. 创建一个Server实例
2. 添加/配置Connectors
3. 添加/配置Handlers或者Contexts或者Servlets
4. 启动Server

相关阅读:

Ubuntu 11.04 安装配置 Jetty7

Jetty的配置、部署与API使用

Jetty 9.0.4 发布,支持 Servlet 3.1 非堵塞 I/O 

1. 准备工作:
下载整合后的jetty-all和servlet api的jar文件。
2. 创建Server
下述代码创建一个Server实例,并启动服务器。

packageorg.eclipse.jetty.embedded;


importorg.eclipse.jetty.server.Server;


/** The simplest possible Jetty server.
*/
publicclassSimplestServer {


  publicstaticvoidmain(String[] args) throwsException {
      Server server = newServer(8080);
      server.start();
      server.join();
  }
}
由于代码中并没有指定server的处理器(handler),因此在浏览器中输入:8080会返回404错误页面。
3. 使用Handlers
为了对每个请求作出相应,Jetty要求为Server设定Handler,Handler可以处理
Ø检查或修改Http请求
Ø生成完整的Http响应
Ø调用另一个Handler
Ø选择一个或多个Handlers调用
3.1 HelloWorld Handler
下述代码显示了一个简单helloworld handler的实现
packageorg.eclipse.jetty.embedded;


importjava.io.IOException;
importjavax.servlet.ServletException;
importjavax.servlet.http.HttpServletRequest;
importjavax.servlet.http.HttpServletResponse;
importorg.eclipse.jetty.server.Request;
importorg.eclipse.jetty.server.handler.AbstractHandler;


publicclassHelloHandlerextendsAbstractHandler {


  finalString _greeting;


  finalString _body;


  publicHelloHandler() {
      _greeting= "Hello World";
      _body= null;
  }


  publicHelloHandler(String greeting) {
      _greeting= greeting;
      _body= null;
  }


  publicHelloHandler(String greeting, String body) {
      _greeting= greeting;
      _body= body;
  }


  publicvoidhandle(Stringtarget, Request baseRequest, HttpServletRequest request, HttpServletResponseresponse) throwsIOException, ServletException {
      response.setContentType("text/html;charset=utf-8");
      response.setStatus(HttpServletResponse.SC_OK);
      baseRequest.setHandled(true);
      response.getWriter().println("<h1>"+ _greeting + "</h1>");
      if(_body != null) response.getWriter().println(_body);
  }
}
handle为AbstractHandler抽象类中定义的抽象方法,我们对请求的处理操作主要通过此方法来完成,handle中参数包括:
target——请求的目标,可以是一个URI或者一个命名dispatcher中的名字。
baseRequest——Jetty的可变请求对象,总是unwrapped。
request——不变的请求对象,可能会被过滤器或servlet包装
response——响应,可能会被过滤器或servlet包装
hadler设定响应的状态,内容类型,并在使用writer生成响应体之前标记请求为已处理。
3.2 运行HelloWorld Handler
publicstaticvoidmain(String[] args) throwsException {
  Serverserver = newServer(8080);
  server.setHandler(newHelloHandler());
  server.start();
  server.join();
}
3.3 Resource Handler
Resource Handler可以用于处理当前目录下的静态内容,例如:
packageorg.eclipse.jetty.embedded;


importorg.eclipse.jetty.server.Handler;
importorg.eclipse.jetty.server.Server;
importorg.eclipse.jetty.server.handler.DefaultHandler;
importorg.eclipse.jetty.server.handler.HandlerList;
importorg.eclipse.jetty.server.handler.ResourceHandler;
importorg.eclipse.jetty.util.log.Log;
importorg.eclipse.jetty.util.log.Logger;


/** Simple JettyFileServer.
* This is asimple example of Jetty configured as a FileServer.
*/
publicclassFileServer {

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:http://www.heiqu.com/a383f607cc72ed636ff925b87411d2c4.html