`

内置jetty(转)

 
阅读更多

 

转自:http://www.cnblogs.com/dongdone/p/6740546.html

内置jetty

 

jetty有一个口号,不要把你的应用部署到jetty,而是把jetty部署到你的应用中。这说明使用jetty有两种选择,一种选择是将你的应用部署到jetty容器中,另一种选择是将jetty嵌入到你的应用层序中,后者意味着将一个http的模块嵌入到了你的程序中,而不是把你的程序放入一个http的server中。

这个文档就是帮助你一步一步将jetty嵌入到你的程序中。

1.概述

把jetty嵌入到你的程序中,一般都是下面的步骤:

  1. 创建一个server实例
  2. 增加或者配置connector
  3. 增加或者配置handler、context、servlet
  4. 启动server
  5. 等待连接

    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可以:

  1. 检查或者修改HTTP请求。
  2. 生成response回应。
  3. 调用另一个handler(查看HandlerWrapper)
  4. 选择一个或者很多个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("<h1>hello from HelloServlet</h1>");
    }
分享到:
评论

相关推荐

    spring boot内置jetty

    内置 Jetty 服务器是 Spring Boot 的一个重要特性,允许开发者快速启动和运行 web 应用,而无需手动配置服务器。Jetty 是一个轻量级、高性能的开源 HTTP 服务器和 Java Servlet 容器,它被广泛用于各种类型的 web ...

    轻量级的内置jetty版服务器

    标题中的“轻量级的内置jetty版服务器”指的是一个采用了Jetty作为内置服务器的解决方案,专门用于构建轻量、高效的Web应用程序。Jetty是一个开源的HTTP服务器和Servlet容器,以其小巧、快速和灵活的特性在Java开发...

    jetty内置jar包

    1.jetty-6.1.25.jar 2.jetty-servlet-9.4.8.v20171121.jar 3.jetty-util-6.1.25.jar 4.jsp-2.1-glassfish-2.1.v20100127.jar 5.jsp-2.1-jetty-6.1.26.jar 6.servlet-api-3.1.jar

    maven+jetty +ssh 项目例子

    【标题】"maven+jetty +ssh 项目例子"是一个综合性的开发示例,它展示了如何使用Maven构建工具、Jetty服务器以及SSH(Spring Security)框架来开发和部署一个Java Web应用。这个项目旨在帮助开发者理解这些技术的...

    在嵌入式jetty环境下运行struts2Annotation项目

    在嵌入式Jetty环境下运行Struts2 Annotation项目是一个常见的任务,特别是在开发和测试阶段,因为这种方式能够快速启动服务,而无需依赖大型服务器容器。本文将深入探讨如何配置和执行这个过程,以及涉及的关键技术...

    基于Java实现的短语搜索,支持公司名称、地址名称等短语的搜索,支持自定义排序、拼音处理,内置jetty提供web接口

    基于Java实现的短语搜索,支持公司名称、地址名称等短语的搜索,支持自定义排序、拼音处理,内置jetty提供web接口 使用方法: cd phrase-search unix类操作系统执行: chmod +x startup.sh & ./startup.sh ...

    jetty在eclipse中配置

    你可以通过Eclipse的内置软件站点Marketplace来查找并安装“Jetty Integration for WTP”。插件安装完成后,重启Eclipse。 2. **创建或导入Web项目** 在Eclipse中,选择"File" -&gt; "New" -&gt; "Dynamic Web Project...

    gradle的jetty插件使用例子

    **Gradle Jetty 插件使用详解** 在Java Web开发中,Jetty是一个轻量级、高性能的HTTP服务器和Servlet容器,它支持多种部署方式,包括作为嵌入式服务器使用。Gradle,作为现代的构建工具,提供了丰富的插件生态系统...

    jetty 学习资料合集

    学习如何将Jetty服务器内置于Java应用程序中,以便在无需独立服务器的情况下运行Web服务。 5. **Jetty配置**:理解Jetty的XML配置文件,学习如何配置服务器的连接器、会话管理、安全设置等。这包括设置SSL/TLS、...

    jetty6.1.6-2

    只需要添加必要的库文件到应用的类路径,就可以启动一个内置的Web服务器。 7. **配置灵活性**:Jetty提供了多种方式来配置服务器,包括XML配置文件、程序化API以及基于注解的配置。 8. **模块化**:Jetty的lib目录...

    jetty内嵌到java代码启动

    - Jetty提供了一些内置的调试工具,例如`RequestLogHandler`,可以记录请求信息。 7. **安全性** - Jetty支持多种安全机制,包括基本认证、摘要认证、SSL/TLS加密等,可以通过`ConstraintSecurityHandler`进行...

    Jetty权威指南.pdf

    - **2.3.3 start.jar深入探讨**:`start.jar`是一个特殊的Jar包,它包含了启动Jetty所需的所有依赖库,并且内置了一些默认的配置文件,便于快速部署。 **2.4 我们可以学到什么** 通过实践Jetty的安装和启动过程,...

    myeclipse的jetty插件

    1. **MyEclipse Marketplace**:在MyEclipse中,可以通过内置的Marketplace搜索Jetty插件,找到后点击安装,按照提示完成安装过程。 2. **手动安装**:如果Marketplace中没有找到合适的插件,可以从插件官方网站下载...

    jetty 服务器

    - **安全**:内置了SSL/TLS支持,可以方便地配置HTTPS服务。 - **嵌入式**:Jetty可以嵌入到其他Java应用程序中,作为Web服务的组成部分。 4. **部署Web应用** - **WAR文件**:将Web应用的WAR文件放入`webapps`...

    jetty.rar(clipse/myeclipse/STS等开发工具的jetty插件-通用版本)

    1. "jetty插件包":这是关于Jetty的扩展,为开发环境提供了内置的Jetty服务器支持。 2. "eclipse集成jetty":表明这个插件适用于Eclipse,允许用户在Eclipse环境中使用Jetty。 3. "myeclipse集成jetty":同样,这个...

    Jetty Eclipse Plugin.rar

    1. **快速启动和调试**:Jetty Eclipse Plugin允许用户快速启动一个内置的Jetty服务器,这样就可以直接在开发环境中运行和调试Web应用程序,无需构建和部署到外部服务器。这对于迭代开发和快速测试尤其方便。 2. **...

    jetty 8.1.15 jar包

    Jetty提供了内置的安全管理器,可以设置角色和权限,实现基于角色的访问控制。同时,Jetty允许调整线程池大小、缓冲区配置等,以优化服务器性能。此外,Jetty还支持连接池和HTTP/2协议,进一步提升了性能。 总之,...

    Java Eclipse ee集合jetty和配置

    在 Eclipse EE 中,Jetty 是一个内置的服务器,可以用来运行和调试 Web 应用程序。在配置 Jetty 时,需要配置 Jetty 服务器的启动参数、 JVM 参数、日志记录等设置。 在给定的文件中,看到的是 Jetty 的启动命令,...

    jetty 插件

    1. **快速启动**:Jetty插件允许开发者快速启动一个内置的Jetty服务器,无需繁琐的配置步骤,只需几行命令即可运行Web应用。 2. **热部署**:当源代码发生变化时,Jetty插件可以自动检测并重新加载修改,实现热部署...

    jetty-distribution-9.4.31.v20200723_安装包.rar

    9. **性能监控**:Jetty提供了一些内置的监控端点,允许开发者监控服务器的运行状态,如线程池、内存使用情况和HTTP连接器的状态。 10. **持续更新和社区支持**:Jetty有一个活跃的社区,不断进行维护和更新,修复...

Global site tag (gtag.js) - Google Analytics